H3C网管系统代码审计

7 分钟

H3c 网管系统代码审计

系统里面除了.php文件,还有很多的.mds 文件,路由的处理逻辑大部分都在.mds文件中,但是要注意的是Phpstorm这类开发者工具在外面进行全局搜索的时候,不会对mds中的文件进行匹配,导致了开始审计的时候压根就找不到漏洞。

任意文件读取

一般php 类型的任意文件读取,都是通过fopen()以及file_get_contents()这些文件读取函数中的参数被用户恶意控制造成的,所以在看的时候直接全局搜这些可利用函数看上下文代码是否参数可被控制。

直接搜file_get_contents()会发现有大量的这种函数,但是大量类似的函数参数都是直接或间接被写死的。

直接静态变量的形式写死:

image-20240205110035383

看了很多函数,发现唯一好像有机会的地方是某个模拟http请求的函数:

image-20240205110219292

通过http_build_query()创建一个http的查询,通过stream_context_create()来用于创建并返回一个新的上下文资源,以便在流操作函数中使用,一般参数都说以数组的形式定义请求头的各种参数等,随后进行file_get_contents()false表示不会 在include path下寻找文件。

往上寻找能够发现是一个短信功能调用了这个函数,它通过发送一个http的请求去第三方的短信接口来获取短信的内容并返回给用户,直接看$gwUrl 是否可控。

image-20240205110537006

上方$gwUrl是通过传入了sms_param[6],而sms_param参数通过不断的网上寻找看到了它通过直接从sms_data.txt中获取出来,以~#%^分割成数组,也还是间接通过静态变量控制了参数,除非这个sms_data.txt 我们可写,控制内容(暂时没找到,告一段落)。所以所有的.php文件都没有找到有任意文件读取的情况。

image-20240205110929751

最终漏洞是在modules/*.mds类似的文件中,并且多个处理函数都存在这种情况:

image-20240205112542740

image-20240205112649604

GET请求的参数g中接受一个变量,通过这个变量可控制对应的处理路由,通过控制g=sys_corefile_sysinfo_download可来到上图的处理函数,直接传一个file_name../../../的情况,在直接拼接字符串的时候就会造成目录穿越。

1707100944552

命令执行漏洞

对于php的命令执行,包括thinkphp等多种框架和代码,大部分都是通过system、exec、call_user_func等造成的,全局搜索的地方可以放在这些地方。

portal_auth.mds中,看到backupAuthFile和checkFileSize两个函数在调用exec()的时候都拼接了变量, 都是存在命令执行的可能性

image-20240205114304559

先看backupFile,查找有没有能够控制$type变量的函数,只找到了一个,其它都是静态的函数。

image-20240205114836003

这里是g=aaa_portal_auth_config_reset的逻辑,直接接受一个参数type,传入到了backupAuthFile中,所以我们把type的值通过管道符控制就可以达到命令执行的效果,但事实上,这里exec('rm '.$portal_catalog.'/'.$type.'/images/'.$type.'*');就已经能够进行命令执行,分别就不需要进入backUpAuthFile中。

image-20240205114903304

image-20240205115315340

在上面可以看到通过file_put_contents()控制config.txt的内容,在success.html中,这里直接重加载的时候通过get()获取到了config.txt文件的内容,将获取到的内容直接执行了eval(),也是可以进行命令执行的。

image-20240205133028816

再看checkFileSize的情况,随便找一个调用这个的函数看一下,首先是需要checkFileSize进入else的处理,需要传入的文件小于$uploadFileSize$uploadFileSize = 2097152;大概是2MB

image-20240205115928101

image-20240205115654561

这里的suffix是传参可控的,所以文件名是可被控制的,剩下要满足的条件就是在基础配置baseFlag的时候需要是被定义的,在执行checkFileSize前不被终止返回。

image-20240205121907535

只需要传入suffix参数控制后缀, bkg_flag=0控制进入if里面即可。

sql注入

monitor_users_trend_show 的处理路由中,通过get_db_connection()来连接postgresql数据库,接收$name、$timescope参数,通过$timescope参数生成$data_table_name$query_codiction,但是$name是直接传入的,看replace_str_symbol处理,replace_str_symbol括号进行了处理,但是似乎不影响$name的值,因为这里是直接拼接的。

image-20240205223325182

image-20240205223542496

function replace_str_symbol($value,$symbol = array('[',']'),$repace_symbol = array('(',')')){
    return str_replace($symbol,$repace_symbol,$value);
}

$data_table_name='admin';
$name="admin' and union select datname from pg_database#";
$query_condition=111;
$name=replace_str_symbol($name);
$query = 'select first_name,up_byte,down_byte,create_time from '.$data_table_name.' where first_name=\''.$name.'\' '.$query_condition.' order by create_time asc;';

echo $query;
可以传入$name为类似的形式,直接将后面的注释掉,使它联合查询进行注入,可惜的是这里并没有成功验证,找的很多资产都连接pg的时候出现问题,并且因为进不去里面不知道timescope等具体是什么,这里是否存在留疑!

总结

整个CMS框架的路由都是以参数g控制,所有的处理逻辑文件都在.mds后缀文件里面,通过include template()的形式来对模板进行渲染,从而到达前端,安全防御也不多,审计起来相对来说挺简单的。

~  ~  The   End  ~  ~


 赏 
承蒙厚爱,倍感珍贵,我会继续努力哒!
logo图像
tips
文章二维码 分类标签:Web安全Web安全
文章标题:H3C网管系统代码审计
文章链接:https://aiwin.fun/index.php/archives/4374/
最后编辑:2024 年 2 月 9 日 13:55 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 4 + 5 =
快来做第一个评论的人吧~