触发标签与属性
通用总结
- onerror
- onmouseover
- onmouseout
- onmousemove
- onclick
script
通常触发方式
a
onmouseover
onmouseout
onmousemove
onclick
img
onerror
onmouseover
onmouseout
onmousemove
onclick
div
onmouseover
onmouseout
onmousemove
onclick
无害 payload
简单粗暴的测试payload
|
|
过滤测试
过滤测试 payload - 0
过滤测试 payload - 1
过滤测试 payload - 2
观察是否存在大小写混淆绕过。
过滤测试 payload - 3
递归构造法
过滤测试 payload - 4
递归构造法
过滤测试 payload - 5
查看代码部分的关键词是否被限制了
过滤测试 payload - 6
测试img标签
过滤测试 payload - 7
测试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
触发URL
Example 2
思路
第一步,用过滤测试payload-0来看看注入点的过滤情况。
通过观察结果,可以判断name参数的注入点没有过滤尖括号。
初步判断name注入点可以构造script标签。
第二步,用最基本的payload测试
观察页面响应结果,发现<script>
和</script>
都消失了。
猜测后端可能有正则匹配,将<script>
替换成空字符串。
第三步,尝试将<script>
进行变形,最基本的是大小写组合变换
测试成功。
触发URL
Example 3
思路
第一步,用过滤测试pyaload-0探测。
观察结果时发现左右尖括号都被 HTML encoding 成<
和>
了。
第二步,使用过滤测试payload-2探测。
观察到结果中有一部分尖括号被过滤,但也有部分尖括号未被过滤。
第三步,黑盒测试尝试构造我需形态。
第四步,经过不断测试大量payload最终找到一个可用的payload
后记:有空可以看一下后端的过滤到底是怎么写的。
对下面代码的第一个过不了略感疑惑。
Example 4
思路
script这个关键词被禁用。考虑用其他标签触发XSS。最常用的还是img标签。
除了img标签以外,还可以考虑a标签和div标签等。
触发函数有 onerror, onmouseover, onmouseout, onmousemove, onclick.
一组有效 payload
Example 5
alert 被限制的情况。
绕过思路1,不使用alert而用其他的类似函数,比如confirm
和prompt
绕过思路2,编码函数名
Example 6
直接注入JavaScript代码中。
不闭合script
标签的情况,可以考虑用//
注释后面的代码
顺带再闭合一下script
标签也不是不可以,只是有点多此一举。
Example 7
左右尖括号和双引号<,>,"
被HTML encoding。
如上个例子所述,其实并不需要用到尖括号,并且可以用单引号分割。
(用双引号还是单引号分割得看目标页面的代码怎么写,类似于python)
|
|
Eaxmple 8
思路
先用一个测试payload探探路。
发现左右尖括号都被转义了,初步看起来似乎没戏了。
POST的name参数这个注入点是无效的。但此处又另一个注入点,
比较难以发觉,在URL中。
构造特殊的URL
说明
这种错误产生的原因在于在于开发者盲目信任PHP_SELF
函数,盲目信任用户提供的路径。
类似的漏洞经常出现在 有表单的页面
,和 错误页面
(404, 500) 。
Example 9
DOM型 XSS 的典型代表,恶意输入并没有直接反映在返回的HTML中,而要依赖浏览器动态执行JavaScript之后,恶意输入才能被执行。
可以在F12的console里实验一下。
payload
注意,每次需要重新建一个标签访问。在同一个标签修改URL是不会触发的XSS的。
chrome测试成功,firefox测试失败。