目标
- 删除目标douphp\data\install.lock文件
- 注入恶意代码
流程:
1、进入目标网站后台,查看有没有可以利用的漏洞点
- 进入网站之后,发现后台中有许多图片上传功能
- 思路1:
- 尝试使用文件上传漏洞,通过蚁剑连接
- 获取文件目录之后,删除douphp\data\install.lock文件
2、思路1尝试
-
选择首页幻灯广告模块,上传含有payload的图片文件
-
通过抓包,修改后缀名为php,使我们上传的图片文件变为木马文件
-
修改之后放包,发现不支持php文件上传
-
应该是源文件对上传的文件做了过滤
-
尝试文件上传漏洞的一部分其他方法,发现失败
-
放弃思路1
-
再次分析,我们的目标是删除install.lock文件
- 搜索,查看资料,看是否存在删除文件的漏洞
- 发现有一种任意文件删除漏洞,其利用函数为unlink()
- 思路2:通过代码审计,查找是否有unlink()函数以及存在的漏洞
3、思路2尝试
(1)全局搜索函数unlink
- 发现源代码中一共有24个文件中存在函数unlink
(2)代码审计
- 结合网站后台页面以及代码进行初步判断,选择将要审计的文件
- 选择出存在漏洞可能性更大的部分文件为优先审计部分
- 优先级较高的文件:
- action.class.php
- index.php
- mobile.php
- 优先级较高的文件:
审计文件action.class.php
-
@unlink(ROOT_PATH . $file['file']);
- 其中
ROOT_PATH
为常量,查看后面拼接的变量$file
- 向上审计又发现变量
$number
- 继续跟踪审计发现
$number
是全局变量$_REQUEST
中的参数,不可控
- 向上审计又发现变量
- 其中
-
综上本文件中unlink函数中的参数不可控,进入下一个文件
审计文件index.php
-
if (file_exists($c_a_p = ROOT_PATH . "cache/custom_admin_path.candel.php")) @unlink($c_a_p);
- 其中发现变量
$c_a_p
- 向上审计发现
$c_a_p = ROOT_PATH . "cache/custom_admin_path.candel.php"
$c_a_p
都由常量组成,不可控
- 其中发现变量
-
进入下一个文件
审计文件mobile.php
-
@ unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);
-
其中发现变量
$mobile_logo
-
向上审计发现
-
` $mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");`
-
即从数据库中获取字段
mobile_logo
的值 -
去后台对应的模块,查看其功能
-
发现只有一个上传文件的功能,在本地的后台系统中尝试上传文件
-
-
上传完成之后,发现出现了
删除LOGO
的功能,即上面unlink函数部分代码的功能 -
推测该点有可能存在文件删除漏洞的地方
-
继续审计代码
-
@ unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);
-
发现代码中的图片路径较为复杂,使用exit()或者die()函数替换代码中的unlink()函数,退出脚本并将其内容(路径)输出
-
-
发现其文件路径如上,所以
- 如果可以修改文件路径将其替换为install.lock,即可解决
-
向上审计
-
$dou->query("UPDATE " . $dou->table('config') . " SET value = '$value' WHERE name = '$name'");
-
发现这段代码有修改功能,有可以利用的可能性
-
-
向上审计
-
foreach ($_POST as $name => $value)
-
将变量
$_POST
中的键值对拆分为 键 n a m e 值 name 值 name值value -
根据上面的分析
- 如果要修改路径的话则应使得
- $name=mobile_logo
- $value=install.lock的路径
- 如果要修改路径的话则应使得
-
-
向上审计
-
if ($_FILES['mobile_logo']['name'] != '') { // 图片上传 include_once (ROOT_PATH . 'include/file.class.php'); $file = new File(M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/'); // 实例化类文件(文件上传路径,结尾加斜杠) $mobile_logo = $file->upload('mobile_logo', 'logo'); // 上传的文件域 $_POST['mobile_logo'] = $mobile_logo; }
-
即我们上传文件之后对其命名与路径的处理过程
-
-
向上审计
-
elseif ($act == 'update')
-
即只要有更新操作即可执行其中的代码
-
4、总结
需要满足的条件
- 修改文件路径
方法
- 抓包修改
过程
-
通过测试我们要修改的value值
install.lock的路径
就在这个内容上方的位置 -
-----------------------------20720338393213792845923570 Content-Disposition: form-data; name="mobile_subdir_binding"
- 修改之后放包,点击
删除LOGO
- 删除install.lock文件成功
写马
查看