XSS原理
- 跨站脚本攻击(Cross Site Scripting 为和CSS(层叠样式表)区分,故简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。
- 初次了解XSS,肯定先从XSS-labs靶场搞起,了解绕过姿势。
下载链接:https://github.com/do0dl3/xss-labs
下载源码后直接搭建在phpstudy的根目录下,在浏览器上访问本地即可搭建成功,搭建成功界面如下
即可开启XSS之旅!!!
第一关
第一次进来直接尝试弹窗<script>alert(11)</script> ,第一关没有任何过滤,发现成功绕过!!
payload:
level1.php?name=<script>alert(11)</script>
第二关
先输入 111<script>alert(111)</script> 尝试,发现页面没有任何改变,查看页面源代码,没有过滤<script>,发现可以通过闭合前面的 “ 和 > 就可能成功,再次进行尝试,,发现成功绕过!!
通过闭合 ” > ,闭合后的语句是 <input name=keyword value=“1”><script>alert(222)</script>
payload:
level2.php?keyword=111"><script>alert(111)</script>
第三关
同道理,先输入<script>alert(1111)</script> ,查看网页源代码,发现< > 被转义过滤了
查看关卡3 php代码,发现有htmlspecialchars()函数,作用是把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体,函数详情见:https://www.runoob.com/php/func-string-htmlspecialchars.html
默认是只编码双引号的,而且单引号无论如何都不转义,用 ’ 来闭合,换一种方法有输入框,于是想用onclick点击事件进行触发弹窗,构造payload,点击输入框就成功绕过了。
payload:
level3.php?keyword=' onclick=alert(1)//
第四关
首先键入<script>alert(1)</script>,没有反应,查看页面源代码,发现<> 直接没有了,猜测是被过滤了,那就闭合 “ 来onclick试一下,发现成功绕过!
查看php代码:
payload:
level4.php?keyword=" onclick=alert(1)//
第五关
首次判断过滤点,直接键入 ‘ “ < > script onclick 查看过滤信息 ,查看网页源代码,查看过滤点,发现过滤 script和onclick,又尝试换大小写绕过,还是不成功,尝试换<a></a>标签绕过,使用JS伪协议( javascript:alert(1) )绕过,简单说就是把javascript: 后面的代码当成 javascript来执行。
尝试通过闭合 ” 和 < 再加上a标签,JS伪协议,发现成功绕过! !
查看php源代码:
payload:
level5.php?keyword="><a href=javascript:alert(1)>11</a>//
第六关
同理键入 ‘ “ < > script onclick ,查看网页源代码,发现和上一关过滤一样,通过 “ >闭合,试试大小写绕过,发现成功绕过!!
payload:
level6.php?keyword="><scriPt>alert(1)</script>
第七关
同理键入 ‘ “ < > script onclick href,发现直接把script , on , href都替换为空了,换大小写绕过,还是被替换,那就换双写绕过,发现可以成功绕过!!
查看php源代码:
payload:
level7.php?keyword="><a hrhrefef=javascrscriptipt:alert(1)>11</a>//
第八关
依旧输入 ‘ “ < > script onclick href,发现该过滤的基本都过滤了,但是输入的内容在a标签里面,href可以自动解码html实体编码,直接试试编码script中的r,发现成功绕过!!!
查看php源代码:
payload:
payload要输入在文本框内,如果输入在地址栏里必须要进行url编码才可通过。
level8.php?keyword=javasc&#114;ipt:alert(1)
第九关
输入 ‘ “ < > script onclick href,发现过滤了<>,使用JS伪协议,输入发现可以成功显示,但是并未成功传入a标签中,显示 ”您的链接不合法?有没有!“ ,我们查一下合法的链接格式,查到合法的URL格式: http(s)://: / ?# 1.协议名:http 或 https 协议; 所以我们猜测应该至少含有 http://:,我们再次尝试JS伪协议+/http://发现过滤了script,使用上关payload+ http://: ,发现成功绕过。
查看php源代码:
payload:
http:// 前必须要含有注释//,不然不成功
level9.php?keyword=javasc&#114;ipt:alert(1)//http://
第十关
进入发现,没有可以进行传参的地方,先随便输入111,查看网页源代码,发现有三个Input被隐藏了。
那通过根据input的name来修改type来看是否可以显示文本框,修改payload为:
t_link" type='text'>//&t_history" type='text'>//&t_sort=" type='text'>//
发现成功显示文本框
通过网页源代码,看出是t_sort的文本框被弹出,使用onclick事件,发现成功绕过。
查看php源代码:
payload:
&t_sort=" type='text' onclick=javascript:alert(12)>//
第十一关
进去发现和上一关一样,有四个Input被隐藏,像上关一样根据name进行构造,发现是t_sort进行传值,但是并没有什么用,同时发现t_ref的value变成了第10关的网址,猜到大概率是referer.
通过Burpsuite抓包,发现没有referer的值,手动添加referer,payload是第十关的payload,成功绕过!!
payload:
referer:&t_sort=" type='text' onclick=javascript:alert(12)>//
第十二关
同十一关,依旧没有文本框,随便输入11之后,查看页面源代码,发现t_ua有显示版本等信息,于是打开Burpsuit抓包。
通过数据包显示,本关通过User-Agent传值,于是修改User-Agent信息里添加onclick事件 即可绕过。
查看php源代码:
payload:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0 "type="text" onclick=javascript:alert(1)//
第十三关
直接查看页面源代码,按照之前的套路,直接burpsuite抓包,盲猜是cookie传参
通过修改cookie,构造文本框,使用onclick事件,成功绕过!!
查看php源代码:
payload:
Cookie: user=" type='text' onclick=javascript:alert(1)//
第十四关
一直打不开,一直不出页面,网上说有问题,跳过!!
第十五关
通过查看网页源代码,发现有一个新发现 ,ng-include ,去查一下用法:ng-include指令用于包含外部的 HTML 文件。意思是可以打开外部的网页文件。ng-include详情:https://www.runoob.com/angularjs/ng-ng-include.html
那就是说,如果输入第一关的路径,就可以跳转到第一关,输入第一关的过关信息即可成功,尝试一下
自己输入<script>alert(11)</script> 发现<>被转义了,但是用<img>标签可以成功绕过!!
查看php源代码:
payload:
level15.php?src='level1.php?name=<img src=1 onerror=alert(2)>'
第十六关
查看网页源代码,感觉没什么特别的,老规矩 输入 ’ ” < > script onclick 来看看过滤了什么,发现过滤了 “ ‘ script 还有空格 ,所以可以用 a标签 onclick事件绕过,空格用换行符%0a替代,尝试一下,成功绕过!!
查看php源代码:
payload:
level16.php?keyword=<a%0Aonclick=alert(1)>111</a>
第十七关
看网页源代码发现有embed标签,去查embed标签作用,<embed> 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件)。标签详情见:www.runoob.com/tags/tag-embed.html
简单来说就是嵌入图片,视频等,通过' " <> script onclick ,过滤了’ “ 和<>
可以用 onclick 或者 onmouseover进行绕过,我用火狐浏览器,,按道理说是可以成功的,但是没反应,换了Microsoft Edge,发现可以成功绕过!!不太清楚为什么,可能是火狐浏览器不兼容的缘故,这也说明了如果长时间解决不了问题,就换多个浏览器进行尝试,排查原因。
查看php源代码:
payload:
level17.php?arg01=123 onmousedown=alert(1)&arg02=b
第十八关
查看网页源码和php源代码发现,和十七关一样,payload的也一样。