freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

xss-labs靶场解析(详细-通俗易懂版)
2023-03-11 21:56:11
所属地 湖南省

XSS原理

  • 跨站脚本攻击(Cross Site Scripting  为和CSS(层叠样式表)区分,故简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。

  • 初次了解XSS,肯定先从XSS-labs靶场搞起,了解绕过姿势。

下载链接:https://github.com/do0dl3/xss-labs

下载源码后直接搭建在phpstudy的根目录下,在浏览器上访问本地即可搭建成功,搭建成功界面如下

1678453637_640b2b859cb7c8f51c9e7.png!small?1678453640000

即可开启XSS之旅!!!

第一关  

第一次进来直接尝试弹窗<script>alert(11)</script> ,第一关没有任何过滤,发现成功绕过!!

payload:

level1.php?name=<script>alert(11)</script>

1678454197_640b2db51fabd74c6bd55.png!small?1678454199370


第二关

先输入  111<script>alert(111)</script>  尝试,发现页面没有任何改变,查看页面源代码,没有过滤<script>,发现可以通过闭合前面的  “  和  >  就可能成功,再次进行尝试,,发现成功绕过!!

1678456903_640b3847e51d1b57b8fbf.png!small?1678456906455

通过闭合  ”  > ,闭合后的语句是    <input name=keyword  value=“1”><script>alert(222)</script>

payload:

level2.php?keyword=111"><script>alert(111)</script>

1678457786_640b3bba68d42495ea704.png!small?1678457788767

第三关

同道理,先输入<script>alert(1111)</script> ,查看网页源代码,发现< > 被转义过滤了

1678458550_640b3eb6455a3872ce56d.png!small?1678458552619

查看关卡3 php代码,发现有htmlspecialchars()函数,作用是把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体,函数详情见:https://www.runoob.com/php/func-string-htmlspecialchars.html

1678458758_640b3f864ef99456bcc72.png!small?1678458760492

默认是只编码双引号的,而且单引号无论如何都不转义,用 ’ 来闭合,换一种方法有输入框,于是想用onclick点击事件进行触发弹窗,构造payload,点击输入框就成功绕过了。

payload:

level3.php?keyword=' onclick=alert(1)//

1678502580_640beab41b3898140e5c7.png!small?1678502580604

第四关

首先键入<script>alert(1)</script>,没有反应,查看页面源代码,发现<> 直接没有了,猜测是被过滤了,那就闭合 “ 来onclick试一下,发现成功绕过!

1678511248_640c0c9027c1d99abf82c.png!small?1678511248813

查看php代码:

1678511868_640c0efc58e0328d4619a.png!small?1678511868910

payload:

level4.php?keyword=" onclick=alert(1)//


1678511553_640c0dc15019c29e47869.png!small?1678511553913

第五关

首次判断过滤点,直接键入 ‘ “ < > script  onclick  查看过滤信息  ,查看网页源代码,查看过滤点,发现过滤 script和onclick,又尝试换大小写绕过,还是不成功,尝试换<a></a>标签绕过,使用JS伪协议( javascript:alert(1) )绕过,简单说就是把javascript:  后面的代码当成 javascript来执行。


1678512772_640c1284305d4ca3f0abc.png!small?1678512772818

尝试通过闭合 ” 和 < 再加上a标签,JS伪协议,发现成功绕过! !

查看php源代码:

1678513951_640c171f32859d9d3ad07.png!small?1678513951750

payload:

level5.php?keyword="><a href=javascript:alert(1)>11</a>//

1678514036_640c17740d925f3091164.png!small?1678514036781

第六关

同理键入 ‘ “ < > script  onclick ,查看网页源代码,发现和上一关过滤一样,通过 “ >闭合,试试大小写绕过,发现成功绕过!!

1678514256_640c18503d958b1b53028.png!small?1678514256919

payload:

level6.php?keyword="><scriPt>alert(1)</script>

1678514470_640c1926127f4d9b17548.png!small?1678514470909

第七关

同理键入 ‘ “ < > script  onclick href,发现直接把script , on , href都替换为空了,换大小写绕过,还是被替换,那就换双写绕过,发现可以成功绕过!!


1678515280_640c1c5084cd9353677b2.png!small?1678515281284

查看php源代码:

1678515455_640c1cffc4f9bd0213b1a.png!small?1678515456570

payload:

level7.php?keyword="><a hrhrefef=javascrscriptipt:alert(1)>11</a>//

1678515129_640c1bb906e9392c35a7d.png!small?1678515129686

第八关

依旧输入 ‘ “ < > script  onclick href,发现该过滤的基本都过滤了,但是输入的内容在a标签里面,href可以自动解码html实体编码,直接试试编码script中的r,发现成功绕过!!!


1678515713_640c1e013a9518ba500f8.png!small?1678515713998

查看php源代码:

1678518378_640c286af1007c5d7354f.png!small?1678518380016

payload:

payload要输入在文本框内,如果输入在地址栏里必须要进行url编码才可通过。

level8.php?keyword=javasc&#114;ipt:alert(1)

1678522936_640c3a38b9b18a06b6061.png!small?1678522937627

第九关

输入 ‘ “ < > script  onclick href,发现过滤了<>,使用JS伪协议,输入发现可以成功显示,但是并未成功传入a标签中,显示 ”您的链接不合法?有没有!“ ,我们查一下合法的链接格式,查到合法的URL格式: http(s)://: / ?# 1.协议名:http 或 https 协议; 所以我们猜测应该至少含有 http://:,我们再次尝试JS伪协议+/http://发现过滤了script,使用上关payload+ http://:  ,发现成功绕过。

1678523202_640c3b42caffae18057a5.png!small?1678523203612

查看php源代码:

1678524668_640c40fc249af0909b018.png!small?1678524669137

payload:

http:// 前必须要含有注释//,不然不成功

level9.php?keyword=javasc&#114;ipt:alert(1)//http://

1678524383_640c3fdf9ea467334ef6e.png!small?1678524384694

第十关

进入发现,没有可以进行传参的地方,先随便输入111,查看网页源代码,发现有三个Input被隐藏了。

1678525013_640c425535fd44607dfe3.png!small?1678525014205

那通过根据input的name来修改type来看是否可以显示文本框,修改payload为:

t_link" type='text'>//&t_history" type='text'>//&t_sort=" type='text'>//

发现成功显示文本框

1678526324_640c4774c2239ec8af77f.png!small?1678526325711

通过网页源代码,看出是t_sort的文本框被弹出,使用onclick事件,发现成功绕过。

1678526388_640c47b423d5cfef943ee.png!small?1678526388993

查看php源代码:

1678527299_640c4b43ccc65cbdc3b54.png!small?1678527300795

payload:

&t_sort=" type='text' onclick=javascript:alert(12)>//

1678527071_640c4a5fd8e1a56b0e69c.png!small?1678527072873

第十一关

进去发现和上一关一样,有四个Input被隐藏,像上关一样根据name进行构造,发现是t_sort进行传值,但是并没有什么用,同时发现t_ref的value变成了第10关的网址,猜到大概率是referer.

1678528165_640c4ea510c018d39c268.png!small?1678528166142

通过Burpsuite抓包,发现没有referer的值,手动添加referer,payload是第十关的payload,成功绕过!!

1678528570_640c503a763c6b6acc472.png!small?1678528571678

payload:

referer:&t_sort=" type='text' onclick=javascript:alert(12)>//

1678528424_640c4fa85feeadd608aae.png!small?1678528425302

第十二关

同十一关,依旧没有文本框,随便输入11之后,查看页面源代码,发现t_ua有显示版本等信息,于是打开Burpsuit抓包。

1678534042_640c659a568fb6c02775d.png!small?1678534043178

通过数据包显示,本关通过User-Agent传值,于是修改User-Agent信息里添加onclick事件 即可绕过。


1678535198_640c6a1eac11f8a58ebd9.png!small?1678535199560

查看php源代码:

1678535363_640c6ac32c117195f3f28.png!small?1678535363981

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)//

1678535218_640c6a32138d3ae02a55f.png!small?1678535219064

第十三关

直接查看页面源代码,按照之前的套路,直接burpsuite抓包,盲猜是cookie传参

1678535781_640c6c65ca6974d3dcafc.png!small?1678535782702

通过修改cookie,构造文本框,使用onclick事件,成功绕过!!

1678536262_640c6e46cc2517b5ad963.png!small?1678536263749

查看php源代码:

1678536528_640c6f504361ac565bc86.png!small?1678536529124

payload:

Cookie: user=" type='text' onclick=javascript:alert(1)//

1678536105_640c6da93e9c6434da8f8.png!small?1678536106187


第十四关

一直打不开,一直不出页面,网上说有问题,跳过!!

1678537382_640c72a695b94aff4b815.png!small?1678537383402

第十五关

通过查看网页源代码,发现有一个新发现 ,ng-include  ,去查一下用法ng-include指令用于包含外部的 HTML 文件。意思是可以打开外部的网页文件。ng-include详情:https://www.runoob.com/angularjs/ng-ng-include.html

1678538319_640c764fc22458b27682d.png!small?1678538320743




那就是说,如果输入第一关的路径,就可以跳转到第一关,输入第一关的过关信息即可成功,尝试一下

自己输入<script>alert(11)</script> 发现<>被转义了,但是用<img>标签可以成功绕过!!

查看php源代码:

1678538966_640c78d65352c8939fcc3.png!small?1678538967126

payload:

level15.php?src='level1.php?name=<img src=1 onerror=alert(2)>'

1678538793_640c78292cf82162b2ba1.png!small?1678538794440

第十六关

查看网页源代码,感觉没什么特别的,老规矩 输入 ’ ” <    > script onclick  来看看过滤了什么,发现过滤了 “ ‘  script  还有空格  ,所以可以用 a标签 onclick事件绕过,空格用换行符%0a替代,尝试一下,成功绕过!!



1678539636_640c7b747ffc04c22dafa.png!small?1678539637866

查看php源代码:

1678540132_640c7d64366ff7f4b2b85.png!small?1678540133080

payload:

level16.php?keyword=<a%0Aonclick=alert(1)>111</a>


1678539972_640c7cc4b1e87141ea5af.png!small?1678539974109

第十七关

看网页源代码发现有embed标签,去查embed标签作用,<embed> 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件)。标签详情见:www.runoob.com/tags/tag-embed.html

简单来说就是嵌入图片,视频等,通过' " <> script onclick ,过滤了’ “ 和<>

1678541589_640c8315868b55f907b00.png!small?1678541590412

可以用 onclick 或者 onmouseover进行绕过,我用火狐浏览器,,按道理说是可以成功的,但是没反应,换了Microsoft Edge,发现可以成功绕过!!不太清楚为什么,可能是火狐浏览器不兼容的缘故,这也说明了如果长时间解决不了问题,就换多个浏览器进行尝试,排查原因。

查看php源代码:


1678541748_640c83b499dfd8c6b3d52.png!small?1678541749685

payload:

level17.php?arg01=123 onmousedown=alert(1)&arg02=b


1678541661_640c835d0d4c7fa501adb.png!small?1678541661849

第十八关

查看网页源码和php源代码发现,和十七关一样,payload的也一样。

# web安全 # OWASP TOP 10
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录