某cms 2019版本代码审计
2019-09-22 09:30:59 Author: xz.aliyun.com(查看原文) 阅读量:192 收藏

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

一、任意文件删除

/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提示
}


文章来源: http://xz.aliyun.com/t/6383
如有侵权请联系:admin#unsafe.sh