🌝博客主页:泥菩萨
💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具
恶意攻击者往web页面插入恶意代码脚本(JS代码),当用户浏览该页面时,嵌入web里面的JS代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS
XSS漏洞利用条件:能插入,能执行
也叫非持久型,常见的就是在url中构造,将恶意链接发送给目标用户。当用户访问链接的时候,会向服务器GET请求来访问带有恶意代码的链接。造成反射型XSS主要是GET类型
先输入恶意代码,造成弹窗说明攻击成功了
但是去了其他页面后再回来,攻击就没有了
像刚才的攻击流程,攻击一次立马失效,这就叫非持久型
也叫持久型,常见的就是在博客留言版、反馈投诉、论坛评论等位置,将恶意代码和正文都存入服务端,每次访问都会触发恶意代码
输入恶意代码,造成攻击
发现恶意代码被浏览器保存到页面了,访问其他网页再回来,仍会造成攻击,这就叫持久型
--------为什么写出来的恶意代码看不到?
因为js代码被浏览的解析引擎解析掉了,所以看到的是个空值
属于反射型XSS,在网页的标签中写入js代码
漏洞练习靶场:dvwa
img
标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件
a
标签支持onmouseover事件,需要鼠标移动到a标签的位置才能触发
请点击
a标签可以用来钓鱼或者暗链
输入,发现不能出现弹窗
查看dvwa源代码,发现对进行了过滤,替换为空格
有很多绕过方式,可以尝试一下大小写混淆或双写绕过,或者也可以使用其他标签
大小写混淆:
双写绕过:ript>alert(1)
其他标签:
通过正则表达式进行过滤,可以换个标签进行绕过
把正则表达式复制粘贴到这个网站上,测试匹配结果:正则表达式在线测试
根据网页设置的正则表达式要勾选上-i
通过自己声明的img标签反弹cookie
发送cookie到远程服务器
+:连字符,表示拼接
escape:在Java中表示一个编码,会对括号里的内容进行编码
无论访问成功与否都不重要,重要的是在http://xxx/a中会留下访问日志,攻击者就能获得cookie值
直接输入测试代码点击提交
输入测试代码,没有造成弹窗
尝试换成标签,发现还是不行
没什么思路了,去看看源代码吧
发现name输入框更好绕过,我们在name输入测试代码
但是发现name输入框有长度限制
可以在包里面进行修改
也可以按F12键,把长度改大或删除
直接看代码吧
同理,还是选择简单的name输入框进行测试
输入的内容提交后并不知道去哪里了
像下图就是盲打的场景
普通用户看不到,但是管理员账户可以看到
我们可以构造恶意代码,观察远程服务器web日志,只要网站管理员访问,它的cookie值就被盗取
当管理员登录后台后,还没反应过来就被攻击了
查看pikachu自带的XSS键盘记录:var/www/html/pkxss/rkeypress/rk.js
在实际中,rk.js应放在要攻击的网站中,rkserver.php放置自己搭建的服务器上面
在做实验之前,我们先修改一下脚本的默认配置
修改目标地址:就是想要攻击的网站ip,我修改成自己搭建的pikachu靶场ip
在存储型XSS模块输入payload
这段payload在留言列表里看不到,因为浏览器有渲染引擎给渲染掉了但实际上存在
之后登录XSS后台进行查看,可以看到获取到了键盘记录
服务器Pikachu靶场环境:10.0.0.158:8091
被攻击方DVWA靶场环境:10.0.0.158:8090
点击 管理工具 -> XSS后台
初始化之后,通过页面上的用户名/密码进行登录
点击cookie搜集模块
可以看到这时还没有获取到cookie:
查看cookie收集页面的源代码
发现其中的pkxss_cookie_result.php,该脚本文件用于收集和展示cookie
pikachu后端环境中,是通过同一目录下的cookie.php文件来获取cookie
把cookie.php文件中的ip地址改为要攻击的靶场ip(即dvwa)
XSS盗取cookie payload
// 使用document.write向页面中写入一个img标签,src访问cookie.php并提供cookie参数为document.cookie
XSS(stored) --> 写入payload
提交成功
返回pikachu靶场的后台查看结果
怎么通过盗取的cookie进行登录?
打开火狐浏览器,安装cookie-editor插件,认准这个作者
使用cookie-editor插件设置cookie值
直接访问dvwa靶场登陆后的界面即10.0.0.158:8090/index.php,不需要登录直接就进来了
-------怎么让攻击者拿到cookie也无法登录?
【多点登录】:同一个账号被多个用户登录
BeEF是一款非常强大的web框架攻击平台,集成了许多payload
打开kali系统,
# 安装beef
sudo apt install beef-xss
# 修改配置文件
vi /usr/share/beef-xss/config.yaml
修改监听地址为本机ip
修改用户名/密码,否则无法正常启动beef
# 启动befe
cd /usr/share/beef-xss
./beef
启动后,访问http://10.0.0.158:3000/ui/panel页面
会自动跳转到http://10.0.0.158:3000/ui/authentication页面
使用beef/123进行登录
1️⃣使用beef克隆其他网站
curl -H "Content-Type:application/json;charset=UTF-8"
-d '{"url":"需要克隆的网址","mount":"克隆的页面在服务器的哪个路径访问"}'
-X POST http://BeEFURL/api/seng/clone_page?token=服务器启动时的beef API key
# 克隆百度
# 在 -H 和 -d 选项后面添加了反斜杠 \ 来继续命令到下一行,这有助于保持命令的可读性,并且防止了因为缺少空格而导致的错误
curl -H "Content-Type:application/json;charset=UTF-8" \
-d '{"url":"https://www.baidu.com","mount":"/baidu"}' \
-X POST http://10.0.0.158:3000/api/seng/clone_page?token=2d4450c8a9592eeebba7091d84e26ea617e6be79
克隆成功返回如下页面
访问我们克隆后的网站
进入beef后台,可以看到有机器上线
2️⃣使用beef克隆pikachu平台的“反射性SS(post)”的登陆页面获取账号密码
curl -H "Content-Type:application/json;charset=UTF-8" \
-d '{"url":"http://10.0.0.158:8091/vul/xss/xsspost/post_login.php","mount":"/pikachu"}' \
-X POST http://10.0.0.158:3000/api/seng/clone_page?token=2d4450c8a9592eeebba7091d84e26ea617e6be79
访问http://10.0.0.158:3000/pikachu,可以看到beef中有机器上线
模拟用户在钓鱼页面中进行登录
进入beef后台查看日志,用户名和密码已经被记录了下来
3️⃣使用beef攻击pikachu平台的”XSS之盲打“页面获取cookie
在【XSS之盲打】中上传hook脚本,让用户触发xss
访问http://10.0.0.158:8091/vul/xss/xssblind/admin_login.php,登录后台
登陆后发现了携带了hook的payload
去beef后台查看登陆后的cookie值
选择Current Browser -> Commands -> Browser -> Get Cookie
点击Execute -> command 1 生成cookie
Commands下展示的是可以执行的命令模块,BeEF可以检测出哪些命令模块可以在当前受害的浏览器工作,并用颜色表示:
在实际的网站中,或多或少
可以用大小写绕过或者使用别的标签
XSS漏洞最好的防御方法是做实体编码,HTML实体编码字符为:
& ——> &
“ ——> "
' ——> '
< ——> lt;
> ——> gt;
通过htmlspecialchars()函数实现HTML实体编码
htmlspecialcars()的语法:htmlspecialchars(string,flags,character-set,double_encode)
该函数默认配置下仅过滤掉双引号,只有设置quotestyle的类型,规定如何编码才会同时过滤掉单引号和双引号
可用的quotestyle类型:
输入特殊字符 ' “< >
,查看前端源码,我们看到 ‘ ”< >
都进行了html实体编码
但是没有对 '
进行实体编码,可以使用单引号构造payload
#' onclick='alert(/xss)
#' onmousemove='alert(/xss)
可以看到我们的输入变成了下图所示
点击语句即可触发弹窗
通过前面的介绍可以得知,XSS攻击有两大要素:
1、攻击者提交恶意代码 --输入
2、浏览器执行恶意代码 --输出
根本的解决方法:从输入到输出都需要过滤、转义
以下为需要过滤的常见字符:
| & ; $ % @ ' " \' \" <> () + CR LF , \
过滤这个方法可以用,但不能仅用过滤;因为过滤的太严格,业务会受到影响;可过滤的不严格,攻击者又可以绕过。通常和html实体编码一起用
在PHP中,有htmlentities()和htmlspecialchas()两个函数可以满足安全要求
即破坏一些特殊符号,从而让其无法生效
& ——> &
“ ——> "
' ——> '
< ——> lt;
> ——> gt;
JavaScriptEncode与HtmlEncode的编码方式不同,它需要使用反斜杠“\”对特殊字符进行转义
除了上面的那些转移之外,还要附加上下面的转义:
\ --> \\
/ --> \/
; --> ;(全角)
避免xss攻击利用document.cookie获取cookie值
许多XSS攻击的目的就是为了获取用户的cookie,将cookie标记为HttpOnly属性,这样的话浏览器向服务端发起请求时就会带上cookie自动,但是在脚本中不能在调用cookie