xss-lab闯关笔记
level1
无过滤
payload
<script>alert(1)</script>
前台代码
<h2 align=center>欢迎用户’”<>?Die</h2><center><img src=level1.png></center>
代码分析
观察我们输入的字符串’”<>?Die
,没有做任何编码就输出到前台,考虑后台可能没有做任何过滤和编码。
后台代码
1 | $str = $_GET["name"]; |
代码分析
$str = $_GET["name"];
获取前台传来的name变量赋值给$str
echo "<h2 align=center>欢迎用户".$str."</h2>";
没有做任何过滤直接将$str
拼接到h2标签中输出,由此可见构成XSS漏洞。
level2
构造闭合
payload
Die"><script>alert(1)</script>"
前台代码
1 | <h2 align=center>没有找到和'"<>()Die相关的结果.</h2><center> |
代码分析
观察我们输入的字符串’”<>?Die
,<h2>
标签中把"<>
实体编码了,继续搜索Die看到<input>
标签没有被过滤,构造<input>
闭合即可形成XSS。
后台代码
1 | $str = $_GET["keyword"]; |
代码分析
<h2>
标签中使用htmlspecialchars
函数进行了编码,但我们发现<input>
是直接使用$str
拼接的,构造payload闭合<input>
即可造成XSS。
level3
构造闭合、绕过编码
payload
Die' onclick='alert(1)'>
前台代码
1 | <h2 align=center>没有找到和'"<>()Die相关的结果.</h2><center> |
代码分析
根据level2的经验,猜测<input>
已进行htmlspecialchars
编码,使用onclick
点击动作执行js,输入后点击编辑框造成XSS。
后台代码
1 | $str = $_GET["keyword"]; |
代码分析
htmlspecialchars
对"<>
进行编码,只要不使用到这几个符号就能绕过htmlspecialchars
编码过滤,造成XSS。
level4
构造闭合、绕过编码、单双引号
payload
Die" onclick='alert(1)'>
前台代码
1 | <h2 align=center>没有找到和'"<>()Die相关的结果.</h2><center> |
代码分析
<h2>
标签就被进行是htmlspecialchars
编码,没法构造闭合。我们看<input>
标签,直接把<>
给干掉了,所以不能用<>
,感觉和level3相似。直接输入level3的payload试试。无果,>
被干掉了。后来我又发现value="
后面是双引号,第三题是单引号。直接把单引号换成双引号即可。后面的>
被干掉也没事,本身还有一个>
后台代码
1 | $str = $_GET["keyword"]; |
代码分析
阅读代码发现传入的参数被用str_replace
函数把<>
替换为空后使用htmlspecialchars
函数编码后拼接到<input>
标签输出。我们把level3的payload中的单引号'
改成双引号"
即可造成XSS,但我感觉这是非预期解法,谷歌一波。
后来在这里找到了解法,绕过<>
检测,构造onmouseover
事件,事件会在鼠标指针移动到指定的元素上时发生。构造语句闭合,成功执行javascript语句。payload:Die" onmouseover="javascript:alert(1)"
level5
使用a标签,href伪协议即可绕过检测
payload
Die"> <a href='javascript:alert(1)'>"
前台代码
1 | <h2 align=center>没有找到和die" onclick='alert(1)'相关的结果.</h2><center> |
代码分析
直接输入level4的payload,发现onclick
的o和n中间加了一个下划线,导致onclick
不能正常解释。猜测只要有on就会被加_
,试了一下果真如此,尝试大小写绕过,无果,全局小写。然后想到的就是找一个类似功能的来实现XSS,但我html基础太差。度娘吧~
百度搜索”html事件属性”,全是on开头, 阿巴阿巴~ 后来看了大佬的思路,发现没有对尖括号过滤,构造pyaload:Die" <script>alert(1)</script>
提交,发现又对script进行了处理。
因为我们可以构造闭合,所以构造一个a标签,使用伪协议绕过。javascript
中也有script
,为啥不过滤呢?小小的脑子,大大的诱惑!
后台代码
1 | $str = strtolower($_GET["keyword"]); |
代码分析
看了后台代码,上面提出的问题自然就解决了,后台只过滤固定的<script
,而javascript
不符合规则,所以能绕过。解题思路已经在上面给出了,使用a标签即可实现XSS漏洞。
level6
大写绕过
payload
Die" Onclick='alert(1)'
前台代码
1 | <h2 align=center>没有找到和on <script> href相关的结果.</h2><center> |
代码分析
根据level5的经验,直接输入on <script> herf
点击搜索,结果可想而知,全部被干掉了。尝试大小写绕过,Href On <Script>
大小写可以绕过,喜出望外。
后台代码
1 | $str = $_GET["keyword"]; |
代码分析
这次的代码没有转小写strtolower
,利用大写即可绕过,当我发现还过滤data
的时候,我就看出来了我知识还不够,我好像还没用过data
。
level7
双写绕过
payload
die" oonnclick='alert(1)'
前台代码
1 | <h2 align=center>没有找到和on <script> herf相关的结果.</h2><center> |
代码分析
根据上面的经验,再次输入on <script> herf
点击搜索。发现on
和script
直接被替换成空,但是href
没有被替换,我们再使用a标签试试。发现script
还是被干了,试试双写。绕过成功,顺利进行下一关!
后台代码
1 | $str =strtolower( $_GET["keyword"]); |
代码分析
这关的考点就是str_replace
函数,所以本地试一下。
由实验结果可得,str_replace
函数只会进行一次替换,所以使用双写绕过。
level8
HTML实体编码绕过
payload
javascript:alert(1)
前台代码
1 | <input name=keyword value="die" oonnclick='alert(1)'"> |
代码分析
level8前台风格都变了,可能难度升级了。go~go~go~,别管那么多先把level7的payload输入进去看看结果,发现两个地方都有返回,猜测考点可能在a标签上,直接输入javascript:alert(1)
试试,发现javascript
被替换成javascr_ipt
,试试大小写和双写绕过,都无果。最后使用HTML实体编码进行绕过,在线网站点这里
后台代码
1 | $str = strtolower($_GET["keyword"]); |
代码分析
str_replace
函数我们见的已经够多了,把参数3中出现参数1的字符串用参数2替换。这次连双引号"
已进行了实体编码,这关考点就是HTML实体编码,所以度娘恶补HTML实体编码的姿势。
level9
HTML实体编码、注释代码
payload
javascript:alert(1)//http://
前台代码
1 | <input name=keyword value="die\" oonnclick=\'alert(1)\'http://"> |
代码分析
经过我的不断摸索,发现必须包含http://
,否则就会<a href="您的链接不合法?有没有!">
,并且对<>"'
等符号进行处理,当前是不能构造闭合,根据level8的经验咱试试html实体编码,前台不会解码。我们看后台代码把~阿巴阿巴
后台代码
1 | $str = strtolower($_GET["keyword"]); |
代码分析
看了后台代码,符合我们之前的猜想,level9在level8的基础上加了一个http://
检测,那我们在level8的payload后面加一个http://
,虽然绕过了检测,但是破坏了html的语法。度娘吧~
查看大佬解析得知,在level8的payload后面加一个//http://
即可绕过,因为后台规定必须包含http://
,但如果直接加上,会破坏html的语法,所以加//
注释掉后面的语句。
level10
1
payload
前台代码
1 | <h2 align=center>没有找到和\'\"<>相关的结果.</h2><center> |
代码分析
我们发现有三个input
标签,但是type(类型)
是hidden
,我们把它删了,显示出来三个编辑框。
【图片】
我们构造三个get参数请求http://172.19.4.8/xss-lab/level10.php?keyword=1&t_link=Die&t_link=Die&t_sort=Die
,t_sort
顺利解析,下面就是构造payload
1 | <input name="t_link" value="" type="hidden"> |
后台代码
代码分析
level11
1
payload
前台代码
代码分析
后台代码
代码分析
level
1