Xss-Labs
前言
因为在hgame week2中的xss坐牢坐了好久,便打算重新的再来学习一下xss
绕过input标签:Level 1
打开后发现url栏有注入点
此时先注入最基础的payload试试看看是否有需要闭合或者被过滤的地方:
1 | <script>alert('xss')</script> |
此时发现并没有过滤或者需要我们进行闭合的地方
代码审计:
此时发现将变量name以GET的方式输入并赋值给$str,然后$str没有经过任何的处理直接插入了h2标签之中;并且不需闭合;因
为name的值是我们人为可控的所以导致了xss的漏洞
绕过input标签:Level 2
此时继续使用最简单的payload进行探测,此时发现无法弹窗,此时看看我们输入的语句被插入到哪里了
此时发现插入进value值中
1 | <input name=keyword value="<script>alert("xss")</script>"> |
因为我们注入的语句被当作值,所以导致语句无法执行,所以此时我们考虑闭合value值,使用”>进行闭合
1 | <input name=keyword value=""> |
使我们的语句逃逸出来,接着在后面的”>进行注释;所以最后的payload为
1 | "><script>alert("xss")</script>// |
注:”>是为了闭合value值和input框;而//是为了注释原来的html代码
可以看到在h2标签之中的恶意代码被编码了。其中<、>都被编码成了html字符实体。猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理。接着往下看可以看到插入到value参数值中的恶意代码并没有被编码而是直接原样返回的。但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。
代码审计:
可以看到在显示处使用了htmlspcialchars()进行过滤,但是在input value属性处没有过滤导致了xss漏洞
input框onclick事件绕过:Level 3
此时依旧是通过最简单的payload进行探测,发现尖括号被转义掉了
此时可以通过构造onclick事件或onmouseover事件或者onfocus事件进行弹窗的效果
onclick事件:
点击输入框后,触发onclick事件,响应onclick中的javascript代码。此处依旧需要闭合value值和后面的引号然后在进行插入
payload:
1 | 'onclick='alert(1) |
onmouseover事件:
构造事件onmouseover,事件成功执行javascript:伪协议;此时仍需进行闭合
payload:
1 | 'onmouseover='javascript:alert(1) |
onfocus事件:
onfocus事件是javascript中在对象获得焦点时发生的事件,最简单的实例就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此点击当前页面的输入框就可以完成弹框了。
payload:
1 | 'onfocus='javascript:alert(1) |
补充一下预定义的字符:
1 | - & (和号)成为 & |
代码审计:
此时两处都进行了过滤,所以我们此时便利用事件劫持来绕过
input框onclick事件绕过:Level 4
当我们使用基础的payload进行测试发现尖括号被过滤掉了并且需要我们对value进行闭合;此时和Level3一样依旧使用事件劫持
onclick事件:payload:
1 | "onclick="alert(1) |
onmouseover事件:payload:
1 | "onmouseover="javascript:alert(1) |
onfocus事件:payload:
1 | "onfocus="javascript:alert(1) |
代码审计:
可以看到这里使用了两个替换函数,所以此时我们依然利用事件劫持进行绕过
白名单绕过:Level 5
经过测试此时发现script和on皆被替换;大小写和双写皆无法绕过;所以此时无法使用script标签和事件劫持进行一个弹窗;
此时我们发现并没有过滤尖括号;所以此时利用没有过滤尖括号,构造a标签再尝试利用a标签的href属性执行javascript:伪协议
注意这里需要进行闭合value的值和
1 | payload1:"><a href='javascript:alert(1)'>// |
从源码来看,服务器端先是将传递过来的参数值转换为全小写之后赋值给变量str,接着就是通过str_replace()函数来破坏变量值中的敏感字符的语义。最后在箭头4处通过htmlspecialchars()函数处理之后显示到网页上,在箭头5处直接将进行敏感字符处理之后的变量值插入到input标签的value属性值中。
代码审计:
此时使用了strtolower()函数将输的字符串进行小写处理,并且过滤了script和on的关键字;但是没有过滤标签的使用导致了xss的漏洞
href属性绕过:Level 6
经过简单的探测后发现script标签和事件劫持和利用href属性皆被过滤;但是在大小写绕过时发现href标签可以通过大小写进行一个绕过payload:
1 | "><a HREF='javascript:alert(1)'>// |
代码审计:
此时对script标签和on关键字和src关键字和data关键字和herf标签和做了一个过滤;但是并没有使用strtolower()函数进行一个转换小写导致我们可以使用大写进行绕过
关键字的过滤:Level 7
经过测试发现on和script和href被过滤掉了,经过测试发现双写可以进行绕过
1 | payload1:"><a hrhrefef='javascscriptript:alert(1)'>// |
代码审计:
可以看到此时的过滤是先转小写然后替换为空接着转义;但是因为只替换了一次所以导致我们可以通过双写进行绕过
html实体编码:Level 8
这里还需要介绍一下href的一个隐藏的属性:
href在调用openurl传参时会自动进行解码。至于为啥子,我不晓得。在level-5关的时候,我尝试利用unicode编码进行绕过,这个就是基础知识的不过关导致的啦。绕过的前提固然是不会被拦截,但还需要传入传出的代码是可以被按照设想的情况进行解析的。这个值得反省。可以看到输入的内容被插在了a标签的href属性值中,想到使用javascript:执行代码尝试javascript执行,但是关键字再次被过滤,仍旧是那些,词中被加了下划线,也不能使用双写绕过,大小写混写也没有起作用使用编码,HTML标签属性本身是支持ASCII码的,于是乎使用Unicode进行编码传输https://www.matools.com/code-convert-unicode
将
1 | javascript:alert(1) |
进行编码后发现为
1 | javascript:alert(1) |
代码审计:
此时的过滤是敏感字符被加入下划线过滤所以无法进行双写绕过;并且有小写处理;并且标签已经被过滤无法再次新建标签;所以考虑到href属性的特殊性使用unicode编码绕过;使得HTML解析之后直接执行
网址关键字匹配:Level 9
此时在最基础的探测后发现存在href属性;所以此时仍然使用javascript:alert(1)进行一个弹窗效果;但是仍然没有弹窗此时进
行编码后依旧如此;并且href处还没有任何提示,只有一串”您的链接不合法,有没有!”字样
这样一来我们就不知道到底对其采用了什么操作。到这里我其实是有些懵了,不知道该怎么继续下去,看了前辈的博客才知道这里应该是网址关键字匹配不过还是提醒之后的自己,如果发现注入没有成功,应该想一下用正常的网址进行输入,可能选一个正常的网址写进去发现成功就能想到这里可能是网址的关键字匹配。
原理:
有点白名单和盲注的感觉:题目要求插入友情链接中必须有网址的格式http://,匹配到之后才认定这是一个合法的网址;否则就会说你的链接不合法;但是仍旧没摆脱编码的魔爪
此时猜测payload是:
1 | javascript:alert(1)http://www.baidu.com |
试了一下发现不行,猜测和第八关一样进行了关键字过滤;
又因为有href属性;所以直接进行unicode编码;此时已经注入了但是依旧是无法弹窗
注意:后边的//注释一定要加,不然它就驴唇不对马嘴,自然浏览器也懵逼,所以要把后边的网址注释掉。
此时的payload为:
1 | javascript:alert(1)//http://baidu.com |
此时成功弹窗
代码审计:
第一次的过滤和Level8一致所以我们只能是利用unicode编码进行一个绕过;第二次的过滤使用了strpos()函数,查找查找http://在str7第一次出现的位置若是没有找到则返回false这也是我们第一次尝试注入时发现没有找到我们的注入语句的原因;此处的过滤是利用了网站关键字的匹配。
注意隐藏框以及假输入框:Level 10
注入最基础的语句后发现没有回显查看源码发现有三个输入框被隐藏了;
此时我们可以对这三个输入框进行传参看看哪个隐藏框是真正的输入框;直接在url栏里面进行传参
1 | ?keyword=1&t_link=1&t_history=2&t_sort=3 |
此时发现只有t_sort框为真正的输入框
想要使用这个input标签那么就需要我们改变他的类型,此时我们看看后台
所以此时根据上面的格式构造我们的payload
1 | ?keyword=1&t_sort=1" onclick="alert(1)" type="button">// |
代码审计:
此时发现str经过了htmlspecialchars进行了一个转义;且只有t_sort接受参数值;并且对t_sort的过滤只有尖括号;所以可以
采用事件劫持进行绕过
http头部xss:Level 11
可以发现这次偷藏了四个隐藏的输入框,不过值得注意的是,第四个隐藏输入框tref已经有了值,并且仔细观察可以看出是第十关用到的payload;此时我们利用上一关的经验,对这四个框进行一个判断;看看哪个可以注入
1 | ?keyword=haha&t_link=1&t_history=2&t_sort=3&t_ref=4 |
此时发现只有t_sort接受参数值且t_ref中的值已经消失不见;尝试对t_sort的属性进行闭合,发现引号被转义了;如果双引号不能用那就不能从value属性中脱离出来,也就不能创造自己的事件或者进行闭合标签
此时我们注意到刚开始的t_ref的值刚好为level10的payload所以此时我们猜t_ref可能会是xss的注入点;此时抓包并加入refere
r值;然后放包查看;最后确定便是注入点
payload:
1 | Referer:1" onclick="javascript:alert(1)" type="button" >// |
代码审计:
接收keyword进行htmlspecialchars处理并打在显示位上;接受t_sort参数进行htmlspecialchars处理再次赋给value果然!接受HTTP-Referer头部参数并进行除尖括号处理,只要没有特殊字符转义,没有双引号去除,那么这个标签的属性就可能是危险的
http头部xss:Level 12
此题和上一题原理一致,皆是http头部的xss注入;直接上paylaod了
1 | User-Agent:1" onclick="javascript:alert(1)" type="button" >// |
原理:
仍旧是发生在HTTP头部的XSS注入,这次的位置点是useragent属性,原因是对http头部参数过于信任,过滤不全导致的XSS
http头部xss:Level 13
此题依旧是http头部注入,注入点在cookie;直接上payload
exif xss漏洞:Level 14
这关主要涉及的漏洞是exif xss漏洞。exif是可交换图像文件格式(英语:Exchangeable image fileformat,官方简称Exif),
是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。我们右键图片选择属性,点击详细信息就可以看到exif的相关属性。
我们可以在这些属性里面添加XSS代码,然后上传图片实现弹窗。因为iframe是内嵌对象,所以可以通过内嵌对象中的内容,通过XSS获取到相关信息。
当然可以使用乌云去查询漏洞;上传一个含有xss代码的图片触发xss。
但是我在本地复现时这关的iframe框架引用失败了;无法继续做题;就记录一下思路吧