前言
转载请注明出处,作者以及本文链接。
作者:灰太狼wolffy007
也是总结,实验中去实现alert弹窗动作,主要讨论的就是alert的执行方式,也就是JavaScript脚本的书写位置。
行间和行内以及外部引用。
- 在标签内部书写,
<script></script>
中的内部书写方式。 - 在标签外部书写:
<script type="text/JavaScript" src=" "></script>
方式。
注意:在外部引用后,内部书写代码会被忽略。 - 在属性位置书写的方式。
<button onclick="JS代码">
<a href="JavaScript:alert(' ');"></a>
- XSS with Data URI Scheme
关于:data的介绍在第六关进行说明。 - 伪造实体字符实现特殊字绕过–别人叫字符编码,这么叫并不是很准确,我觉得应该叫伪造实体字符。
实际上以上方法总结就够了,以下部分读者自行选择是否阅读。
灰太狼说:
本次测试均在部署的服务器上进行测试,我觉得在本地和在服务器测试有非常大的不同,主要是浏览器对脚本执行的信任程度可能不同。
第一关
简单介绍一下就是一个反射型xss。什么是反射型xss,就是将用户输入带去后端解析,由后端返回到用户的过程。
第二关
类型不多说了。
一:输入
(一):闭合整个input标签
"><script>alert('xss');</script>
(二):闭合value属性,使用onclick事件做弹窗。
" οnclick="alert('x');"
这里也不用纠结,最后一个引号可以不打,打上去了也无任何影响。
点击成功跳转
第三关
此处可见:标签括号两处都被后端做了处理
此处使用onclick事件思路。
注意:在此处后端对双引号做了转换,我们使用单引号闭合。
' alert(1);
以及括号内不使用单引号,引发语法错误。
第四关
可以看到后端吞掉了尖括号。
以及匹配图中的闭合方式。
同时注意我们防止onclick内外引号相同带来语法错误,我们换做’ '单引号。
" οnclick='alert(1);'//
弹窗
第五关
H2标签处存在尖括号过滤、双引号过滤
value标签处onclick,scipt过滤
在使用onclick时发现被替换做o_nclick,导致语法错误。
尝试大小写绕过失败。
由于在value标签处没有尖括号过滤,此处使用在a href 中使用Javascript脚本实现alert,单机ss跳转。
"><a href='javascript:alert(1)'>ss</a>//
分析:
htmlspecialchars函数过滤特殊符号
strtolower统一小写
str_replace替换文本
第六关
在:
在<h2 align=center>
不能使用尖括号,导致不能在这里闭合。
在value标签中,script、onclick、href均遭过滤。
按照upload实验室的经验,面对字符过滤我们考虑。
- 大小写绕过
- 双写绕过
- 编码绕过
测试:大小写可以绕过。
条件:源码没有进行统一小写。
使用data方法的xss注入测试:
data:xss 利用"data:"
源于:data uri scheme,也就是数据 URI 方案,将需要的资源:图片、样式,内容打包到单个HTML文件中以进行页面保存。
截至2022年,大多数主流浏览器都完全支持数据 URI,并且在 Internet Explorer 中也部分支持数据 URI。
语法:
data:[<media type>][;base64],<data>
HTML中支持标签属性内嵌入data uri scheme的有:
object iframe anchor img 等
但是要执行js脚本,在object的data属性、iframe的src属性才可以运行。
本次我们写在iframe标签中。
"> <iframe Src="Data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></iframe><
注意:如上我们将src、data进行了大小写混写。
如下:将scrpt语句base64打包,实现弹窗。
第七关
输入依次经strtolower、字符替换。
将 script、on、src、data、href 做了替换,但是都替换为了空,由于没有递归过滤,造成了可以双写绕过。
例如:" oonnclick='alert(1);'
即可绕过,简要说明即可。
第八关
难度提升,在以上过滤的基础上,增加了对双引号的过滤。
这导致我们不好闭合标签。见如下:
使用HTML 字符实体绕过字符检查
HTML 字符实体
引用:https://www.w3school.com.cn/html/html_entities.asp
.
HTML 实体
在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。
字符实体类似这样:
&entity_name;
或者
&#entity_number;
也就是怎么说:我们需要滥用字符实体来绕过字符检查。
操作
- 字符16进制编码
- 套用字符实体格式
javascript:alert(1)
编码后:6a6176617363726970743a616c657274283129
这里插入博主灰太狼写的代码,转载请注明出处。
示范payload:
javascript:alert(1)
第九关
过滤方式与之前相同,但是增加了对链接的检查。要求以http开头。
注意呢:此处使用的是strpos函数,该函数从左到右寻找第一次文本参数出现的位置,找不到返回FALSE。
思路:使用JavaScript语句尾部加入http,并将其注释掉,达成绕过效果。同样的本关卡需要编码。
payload:
javascript:alert("帅气的灰太狼!")//http://
第十关
可鞥有些简单?
在标签这里发现隐藏标签。
源码对应是:
也就是只有这个隐藏标签没有被过滤一些特殊符号,至少引号没有过滤,能实现标签的闭合。
简要写写,要是看过上文的话,就知道是做什么了。
使用onclick弹窗即可,还有注意,删掉type类型中的hidden!
第十一关
这一关主要看源码吧。
keyword、t_sort经过接收以后都进行了html字符的过滤。
但是$_SERVER['HTTP_REFERER']
这种用户可控的白能量被接受以后只进行简单过滤后就输出到标签中,造成了xss。
如图 用户可控的referer头
根据输出的位置和过滤的小括号,与一关操作一样,进行onclick操作,并删掉hidden。
十二关十三关
用户可控变量useragent造成的xss,利用方法同上。
十三关是cookie这里的了
十四关 flash开始
从本关开始的flash失效,不厚道的在这里略过了。