攻击原理
XSS而不是CSS:不和层叠样式表(Cascading Style Sheet)混淆
跨站脚本攻击(Cross Site Script,XSS)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成原因
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
常见类型
反射型
又称非持久型XSS。Web客户端发送含有恶意代码的请求到服务器,Server端将脚本包含在返回的响应中,这时web客户端收到响应,脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中;
存储型
又称持久型XSS。存储式XSS漏洞, 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。例如某网站A上有一个XSS漏洞,该漏洞允许将攻击代码保存在数据库中,xx在该网站注册成用户并发布了一篇文章,文章中嵌入了恶意JavaScript代码。其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。它之所以被称作存储式漏洞是因为它把恶意代码直接保存到数据库中,只要浏览XX发布文章的用户都将受到攻击。危害最大
DOM型
只跟前端有关
DOM型xss是基于html的dom文档来说的,攻击者通过注入JavaScript的脚本,利用相应的函数修改网页的DOM结构,进而修改网页的某些信息,本质上也是一种反射性xss,后来便单独分成了一类。
使用了document.location、document.URL、document.referer等DOM元素的属性,攻击者可以
如何防御
在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
- 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
- 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
结合案例分析***
反射型XSS(get)
- 首先输入标识,判断是否存在xss漏洞
-
检查元素
-
插入一个
<script>alert("YBOssing519")</script>
试试看结果
-
发现有长度限制,解决
- 网页框之间输入,查找input的name:message,?message=…
- 直接修改html代码,修改长度
反射型XSS(POST)
- 通过提示所给的账号登录后,得到一个提交页面
- 输入,获得cookie
- 获得管理员的cookie(当管理员页面和用户页面分开时,通过这种注入获得cookie)
存储型XSS
-
试探一下
-
然后留言板中输入Payload:
-
下面就是见识存储型XSS威力的时候了:
重新来到本关页面,也出现了同样的弹框。说明存储型XSS能危害所有访问受影响页面的用户
DOM型XSS
- 随便输入试探,检查元素
- 可以发现,输入的内容变成了标签的href,利用已知条件构建payload效果为弹窗,弹窗内容为YBOssing519
<a href='#' onclick="alert('YBOssing519')"></a>
#' οnclick="alert('YBOssing519')">
本质就是绕过限制
DOM型XSS-X
- 在输入框中输了个“YBOssing519”,提交之后多出来个链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”
- 检查元素,查看该链接,发现有一个点击效果,点上去试试看
- 点击之后发现新的链接,检查该链接,发现输入的内容回显到第二个链接的href上面
- 利用已知条件构建payload效果为弹窗,弹窗内容为YBOssing519
<a href="#" onclick="alert('YBOssing519')"></a>
或者构造
<img src=1 onerror="alert('/xss/')">
#' οnclick='alert("YBOssing519")'>
XSS之盲打
- 随机输入并检查元素,查看是否有XSS
- 提前之后没有回显,那么数据去哪了?登录管理员,发现数据在管理员那
- 发送一段payload,但是实际的时候管理员和hacker是分开的,怎么获得admin的信息
-
使用,getCooikeUrl是自己写的一段代码,作用就是admin登录就会跳转到目标网站,并且将cookie和url返回给hacker
XSS之过滤
- 直接输入试试结果,发现只存活了一个>,猜测存在过滤
- 使用加长,来绕过过滤
常见绕过过滤方法
-
大小写绕过
-
前端抓包绕过
- 过滤严格的函数可能也会将标签进行严格控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤
xss之htmlspecialchars
htmlspecialchars会将>、<等转码,a标签-> payload
XSS之href输出
- 无论输入什么都会完整的包裹在a标签内部
- 可考虑伪协议绕过,比如:
<a href="javascript:alert('YBOssing519')"></a>
XSS之JS
- 查看源码
- 对于js首先闭合上一个script,然后插入自己的script
XSS之选择列表中的XSS注
- 随便输入得知,几乎所有的符号都被htmlspecialchars,在文本框
- 万物即可抓包,既然第一个输入框不可以,试试可不可以在第二个选择框
XSS之在隐藏域中注入XSS
- 在输入框输入 '" 查看源码(检查->网络->响应)输入的全部被转义(htmlspecialchars处理),仔细观察发现存在p3的隐藏输入框,使用bp抓包试试
- 尝试修改p2的下拉菜单,无效。p3 = hackme 也就是源码中 value = “hackme” ,尝试将 p3 参数修改为
- ">
- ">