- 靶场下载地址:https://github.com/lyshark/xss-labs
- 每一关的后台源码重写了alert()方法,只要成功弹框即可进入下一关
Level 1
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
- 分析:
后台源码将用户以GET方式提交的参数name,原封不动地显示在HTML页面中,所以将弹框语句放入name变量中即可: - Payload:
<script>alert('xss');</script> |
Level 2
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
-
htmlspecialchars:
- 作用:把预定义的字符转换为 HTML 实体,而不是作为标签运行;如果不用HTMLSpecialChars,就会导致读取时,把" <script>"之类的HTML标签带有功能地输出。
- HTML实体格式:
&entity_name;
或者
&#entity_number; - 转化规则:
- 如下例,在使用了htmlspecialchars后,将输出字符串"";当不使用时,则会弹框。
$str="<script>alert('123')</script>";
echo htmlspecialchars($str);
-
-
本例中,在返回的HTML页面的第一处使用了htmlspecialchars,而第二处没有使用,且两处都没有过滤机制。所以我们在第二处闭合<input>标签,直接弹框:
-
Payload:
test"><script>alert('xss');</script> |
Level 3
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
-
一共有两处转义:
- 第一处转义,输入被转义为html实体,不能直接执行;
- 第二处转义,输入被转义为html实体,不能直接执行,也不能闭合双引号。但是单引号没被转义。
- 所以可以用单引号闭合input标签,使用不包含被转义特殊字符的弹框方式。
-
Payload:
- 上述两事件的alert前可以不加javascript
'onclick='alert(/xss/) #标准格式:onclick='alert(/xss/)',点击输入框触发 |
'onmouseover='alert(/xss/) #标准格式:onmouseover='alert(/xss/)' ,鼠标移动到输入框触发 |
Level 4
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
将用户输入个keyword中的<和>替换为空,但在input标签内并未转义。所以直接闭合input标签中的value(不能闭合整个input标签)并使用不带尖括号但弹框方式即可。 -
Payload:
"onclick='alert(/xss/)' |
Level 5
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
- 对<script和on关键字进行了过滤
- 第二次引用keyword时没有转义,可以闭合input标签;然后采用不含<script和on的弹框方式
-
Payload:
"> <a href='javascript:alert(1)'> # <a>标签内的alert必须加javascript,伪协议 |
Level 6
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
- 分析:
- 过滤了<script、on、src、data、href标签
- 但是替换之前没有转化为小写字母,所以可以用大小写绕过
- Payload:
"><img Src="1.jpg" Onerror="alert(1)"> |
Level 7
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
- 分析:
- 过滤了script、on、src、data、href,并且在过滤前将keyword转换为了小写
- 第二处引用keyword没有编码,可以闭合input标签后,重写关键字绕过过滤
- Payload:
"><scrscriptipt>alert(1)</scrscriptipt> |
Level 8
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
- 在过滤前将keyword转化为小写,并且过滤了script、on、src、data、href、双引号
- 第一次引用keyword时,采用了htmlspecialchars
- 第二次引用keyword时,是在a标签中,而且没有用htmlspecialchars编码
- 考虑编码绕过:hackbar的XSS HTML Characters编码,可将所有字符(不同于htmlspecialchars仅将特殊字符编码)编码为HTML实体,从而绕过过滤。
- 然后构造弹框语句,注意到编码绕过后,在第二次引用keyword时,虽然没有htmlspecialchars编码,但是我们事先已经自己将提交的keyword编码为html实体了,所以此时输入的标签不会被执行,而是被当作普通字符串,所以只能构造href超链接,而不能闭合a标签。
-
Payload:
javascript:alert(1) #对script进行编码(仅编码t即可) |
Level 9
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
- 在过滤前将keyword转化为小写,并且过滤了script、on、src、data、href、双引号
- 规定在输入中必须包含http://
-
Payload:
javascrip$#116;:alert(1)//http://www.baidu.com #对script进行编码(仅编码t即可) |
Level 10
- 后台源码:
<!DOCTYPE html><!--STATUS OK--><html> |
-
分析:
- 页面中没有任何可以点击对元素,审查元素发现,除了URL中的keyword参数之外,还有三个隐藏的input参数:t_link、t_history、t_sort
- 分别对这四个参数进行GET传参:
http://127.0.0.1/level10.php?keyword=test&t_link=test1&t_history=test2&t_sort=test3
- 查看页面源代码发现,t_sort被写入到html页面;通过源代码可知,keyword进行了编码,而t_sort过滤了尖括号,并没有进行编码
- 所以我们可以使用双引号仅闭合input标签中对value,然后添加属性是input显现在页面中
-
Payload:
?t_sort="type="text" onmouseover="alert(1) |