米酷CMS 7.0.4代码审计
阅读原文时间:2023年07月10日阅读:1

工具:seay源代码审计系统

源代码:网上很好找,这里就懒得贴上了,找不到的话可以给我留言

后面一段时间会深入学习安全开发,代码审计,内网渗透和免杀,快快成长。

审这个系统是因为在先知上看到一篇审它老版本的文章,索性拿来练一下生疏的手。

部署也不再赘述,直接使用phpstudy快速部署,放置源代码后访问路径下

/install/index.php

部署后的界面如下:

源代码放进seay进行白盒审计

挨个进行查看

第一个疑似注入点,可以看到包含了inc.php文件,先看一下过滤没有

套娃,在library.php里面发现了全局过滤

贴出源代码:

if (!get_magic_quotes_gpc()) {
if (!empty($_GET)) {
$_GET = addslashes_deep($_GET);
}
if (!empty($_POST)) {
$_POST = addslashes_deep($_POST);
}
$_COOKIE = addslashes_deep($_COOKIE);
$_REQUEST = addslashes_deep($_REQUEST);
}
function addslashes_deep($_var_0)
{
if (empty($_var_0)) {
return $_var_0;
} else {
return is_array($_var_0) ? array_map('addslashes_deep', $_var_0) : addslashes($_var_0);
}
}

即没有开启gpc过滤敏感字符则使用addslashes_deep函数,addslashes_deep函数是一个魔改addslashes函数的函数,起到过滤敏感字符的作用。

可以看到此处的过滤没有过滤$_SERVER参数,后面有相关的地方可以留意一下。

SESSION在Cookie参数中,所以被过滤了,继续往后面看

来到很多文章都写过的ucenter位置,reg.php内容中有这样一段代码

alert("用户名已存在,请换个其他的用户名");window.history.go(-1);'; exit; } $result = mysqli\_query($conn,'select \* from mkcms\_user where u\_email = "'.$\_POST\['email'\].'"'); if(mysqli\_fetch\_array($result)){ echo ''; exit; } 这里获取到了我们POST输入的name $username = stripslashes(trim($\_POST\['name'\])); 而因为include了inc.php文件,$\_POST进来的输入被全局过滤了,如果我们使用了单引号就会被加上反斜杠,但是! 这里又在外面使用了 > stripslashes 函数,关于该函数: ![](https://article.cdnof.com/2307/9ffcfda0-90db-4336-80bc-daa89bdb05cb.png) 同时我们可以通过页面返回的值来判断查询结果是否正确,即该位置存在布尔注入 使用方法: > 查询一个已注册的用户名,然后进行布尔注入 本地测试(POST payload 注意test用户已注册) 永真式: > name=test' and '1'='1&email=test%40qq.com&password=test&submit= ![](https://article.cdnof.com/2307/8edc6c73-4ece-48c4-b19a-7c48917d20ad.png) 永假式: > name=test' and '1'='2&email=test%40qq.com&password=test&submit= ![](https://article.cdnof.com/2307/08733896-7c16-4c2e-9215-eaabf67c4584.png) burp抓包放进sqlmap里面跑 ![](https://article.cdnof.com/2307/4a5597a7-74fc-41c3-a8ff-49c86fce17d3.png) 可以直接使用工具跑出来 接着全局搜索使用了stripslashes函数的位置 ![](https://article.cdnof.com/2307/768c7f29-dc3d-46c0-901c-29ed72770e8f.png) active.php代码如下

我们可以通过是否echo $row['u_id']来进行注入

去数据库里面查一下u_question是多少:

其逻辑在reg.php中,简单贴一下代码:

$token = md5($username.$password.$regtime); //创建用于激活识别码
$data['u_question'] =$token;

实际上真实环境中我们应该是拿不到u_question的,但是这里我们可以使用时间盲注来获取数据库内容

repass.php也是类似的点存在注入

$username = stripslashes(trim($_POST['name']));
$email = trim($_POST['email']);
// 检测用户名是否存在
$query = mysqli_query($conn,"select u_id from mkcms_user where u_name='$username' and u_email='$email'");

而除了因为stripslashes导致的注入外,代码里面还有因为直接拼接SQL语句而导致的注入,简单举两处:

admin_edit.php里

$sql = 'update mkcms\_manager set ' . arrtoupdate($\_data) . ' where m\_id = ' . $\_GET\['id'\] . '';  
if (mysqli\_query($conn,$sql)) {  
    alert\_href('管理员修改成功!', 'cms\_admin.php');  
} else {  
    alert\_back('修改失败!');  
}

这里的 $id 直接进行拼接,从而造成了注入,因为不需要使用引号进行闭合,所以之前的全局过滤也形同虚设了。

ad.php 里

if (isset($_GET['del'])) {
$sql = 'delete from mkcms_ad where id = ' . $_GET['del'] . '';
if (mysqli_query($conn,$sql)) {
alert_href('删除成功!', 'cms_ad.php');
} else {
alert_back('删除失败!');
}
}

这里也是通过拼接组成的SQL语句,存在SQL注入漏洞

逻辑漏洞以前有老哥提到过验证码复用+暴力遍历从而任意用户密码重置,下次还是审一个没人审的小众代码吧太菜了

参考链接: