某cms 2019版本代码审计

2019-09-22 约 133 字 预计阅读 1 分钟

声明:本文 【某cms 2019版本代码审计】 由作者 kakarot 于 2019-09-22 08:30:59 首发 先知社区 曾经 浏览数 169 次

感谢 kakarot 的辛苦付出!

听说这个比较好入门就下载下来练习代码审计了

一、任意文件删除

/admin/dl_data.php

可以看到对filename参数没有任何的过滤

二、 sql注入

在 /inc/stopsqlin.php下,

可以看到对 get、 post 和cookie中的接收的内容都在zc_check函数进行过滤

主要使用了addslashes函数 ,也就是说 会对单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符) 进行转义

那么想找sql注入的话常见的有以下几种思路:

1.SQL语句中传参无单引号闭合
2.字符串编码绕过
这个问题主要利用一些编码对转义的特殊字符进行编码,第一种情况是当数据库编码格式设置为GBK时,可以实现宽字节注入,第二种情况是使用了iconv()或mb_convert_encoding()进行编码绕过
3.Sprintf()格式化字符串函数漏洞
4.超全局变量$_SERVER
比如 $_SERVER['PHP_SELF'] $_SERVER['HTTP_HOST']

1. $_SERVER [‘HTTP_HOST’]

在第五行可以看到 $_SERVER [‘HTTP_HOST’] 没有进行过滤就直接拼接了,查找包含调用 zt/top.php文件的来进行利用

比如利用 http://127.0.0.1/zt/companyshow.php

2. user\adv2.php

第67行,很明显看到这边对post方法传进的id没有进行过滤

首先注册用户要企业用户,用户要通过审核后才能发布招商信息

$_REQUEST 调用接受action的动作

当action为modify的时候

调用 check_user_power函数,传参set_text_adv

跟进 check_user_power

将传进的值set_text_dev与查询出的config的内容用函数str_is_inarr对比,返回no

因为积分模块默认开启,向setAdv函数传值1

接下来要让 $a+$b==0不成立

因为zzcms_main里面存的是对应用户的招商信息,我们只要发布一条招商信息就可以让$a=1,然后设置广告语后就可以进行构造语句注入了

3. ajax/zs.php

第十行这边从从cookie中获取pxzs的内容,然后直接没有引号闭合就在第45行进行拼接,导致sql语句可控,利用sqlmap来进行注入

4. zs/subzs.php

在showcookiezs函数中,第十六行sql语句将cookie中接收的zzcmscpid没闭合直接拼接

查找调用showcookiezs的函数,在fix函数中被调用,而且要当标签为cookiezs的时候才能执行,继续查找调用fix的函数

发现在label.php的第十二行的showlabel函数中调用

也就是要查找调用showlabel函数,而且传进去的$str 带有标签 cookiezs 的

查找发现有2个符合,分别是 zs/search.php 和 zs/zs_list.php

zs/search.php

$fp="../template/".$siteskin."/zs_search.htm";
$f = fopen($fp,'r');
$strout = fread($f,filesize($fp));
...
$strout=showlabel($strout);
echo  $strout;

zs_list.php

$fp="../template/".$siteskin."/".$skin;
$f = fopen($fp,'r');
$strout = fread($f,filesize($fp));
...
$strout=showlabel($strout);
echo  $strout;

三、XSS

user/ask.php

传入action为modify的话会执行 modify函数 ,跟进 modify函数

目标是触发218行的markit函数,可知,当传入id不为0的时候,并且根据你要修改的id从 zzcms_ask表里面查询出来的编辑者不是当前用户的话,那么就会触发 markit

跟进 markit 函数,发现使用$_SERVER[‘HTTP_HOST’]来进行拼接,直接在host头部构造xss语句


因为还有$_SERVER[‘REQUEST_URI’],也可以在请求的url中构造,但是要注意在inc/stopsqlin.php中有过滤

if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now