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
属性并添加事件属性的方式弹窗,输入
" onclick="alert(1)
提交后点击输入框即可弹窗。
level 3
- 在输入框中输入
<script>alert(1)</script>
看看代码将被嵌入到何处,会被怎么处理 - 查看源码后可以发现输入的
<
和>
被 htmlspecialchars 函数过滤,这里考察绕过html实体编码,这个函数会对尖括号和双引号实体编码,但对单引号无效,而且值得注意的是,这里的value
属性是使用单引号闭合的 - 查看源码可以看到注入成功,点击输入框即可弹窗
level 4
- 照常输入
<script>alert(1)</script>
,查看源码后发现尖括号被过滤为空,多用几个尖括号也无法绕过 - 那么尝试添加事件属性的方法闭合
level 5
和之前一样,输入的值还是在value
属性中,这次可以发现script
被过滤为scr_ipt
,尝试大小写绕过无效
尝试使用第二种办法发现onclick
中的on
被过滤为o_n
,添加事件属性的方法无法使用
两种方法都被过滤了,那我们可以使用herf
标签试试,点击图片后即可弹窗
"/><a href="javascript:alert(1)"
level 6
和 level 5 一样,script被过滤,但大小写绕过成功bypass
那么直接闭合input标签即可
代码语言:javascript复制" /><scRipt>alert(1)</scRipt>
level 7
这里将script
替换为空,尝试双写绕过,看看是不是回溯过滤
<sscriptcript>alert(1)</sscriptcript>
发现经处理后外面一层script成功存活,那么直接构造闭合即可
代码语言:javascript复制" /><sscriptcript>alert(1)</sscriptcript>//
level 8
可以发现输入的值到了a
标签的herf
属性中,并且script被过滤,大小写绕过无效
尝试上面介绍的方法后发现都被过滤掉了,观察源码后发现,value中被html实体编码,而href里面没有,那猜想可以用html实体编码后写进去
代码语言:javascript复制javascript:alert(1)
点击友情链接即可弹窗
level 9
和 level 8 不同的是多了检查是否为合法链接,通过尝试后可以发现,需要在传入的值中含有http://
那么payload可以为
代码语言:javascript复制javascript: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)>
查看源码可以发现空格被转义为
,可以使用
换行符绕过
<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