第十周文件包含漏洞和远程命令执⾏漏洞
一远程命令执⾏漏洞(最危险的)
1.RCE概述
RCE英文全称:Remote Command/Code Execute,分为远程命令执行(比如ping)和远程代码执行(比如eval)。 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统,这一过程也就是我们常说的Getbshell。(Getshell通常指的是通过利用某种漏洞或者系统的弱点来获取目标服务器的命令执行权限。)(一般出现在嵌入设备里面,摄像头,路由器)
二原因
因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。
比如常见的路由器、防火墙、入侵检测等设备的Web管理界面上,一般会给用户提供一个ping操作界面,用户在该界面输入目标IP,提交后,后台会对目标IP地址进行一次ping测试,并返回测试结果。如果设计者在开发该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而控制整个后台服务器。也就是说如果没有做好过滤或者过滤不严, 可能会造成远程代码执⾏漏洞。
三实验
打开靶场dvwa,并且把等级调整到Low。输入127.0.0.1时
而加了;后加入ls会显示
由此我们可以通过这个命令下载或者写入webshell,还有反弹shell,就是进入类似与MobaXterm。
加入;就是说可以连续执行命令,
还有其他相关的命令
A && B:先执行A,如果成功,执行B
A || B:先执行A,如果失败,执行B
A | B:管道符,先执行A后,将A的结果作为B的输入,打印的是B的结果
A & B:先执行A,然后不管成功与否,执行B
把难度提升到中等,源码如下,可以看出过滤了;和&&,所以还是能用其他的符号
再把难度提升到高级。可以看出已经过滤了大部分了,但是我们可以加空格来处理。
一文件包含漏洞
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用恶意文件,造成文件包含漏洞。
二.分类
本地包含
只能包含本地服务器上存在的文件。
- 用户对输入可控且无过滤
- 可以利用相对路径或绝对路径读取系统敏感文件
远程文件包含
远程文件包含 包含远程服务器上的文件。 需要php.ini开启了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服务器(比如:攻击者搭建的一台Web服务器)的文件。(什么什么.ini一般为配置文件,且不同的php版本文件就不一样。)
- allow_url_fopen=On(默认为On)规定是否允许从远程服务器或者网站检索数据
- allow_url_include=On(PHP 5.2之后默认为Off)规定是否允许include/require远程文件(allow_url_include=On是包含服务器上没有的文件)
二者之间的不同:
本地文件包含与远程文件包含有着相同的原理,但前者只能包含本地服务器上存在的文件,而后者可以包含远程服务器上的文件。
三.PHP中的四种⽂件包含函数
require()
include() 3
require_once()
include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次。适用于在脚本执行期间同一个文件有可能被包含超过一次的情况,想确保它只被包含一次以避免函数重定义、变量重新赋值等问题。
四.URL常见的参数
URL中如果出现了如下内容就可能存在文件包含漏洞
file,page,path,include,load ,home
五常见的敏感信息路径
Window系统(可以问AI)
系统关键文件
C:\Windows\System32\drivers\etc\hosts(DNS 劫持)
C:\Windows\System32\config\SAM(用户密码哈希,需 SYSTEM 权限)
C:\Windows\System32\config\SYSTEM(注册表数据,可提取 SAM 密钥)
C:\Windows\win.ini / system.ini(旧版系统配置)
2. 用户数据 & 配置文件
C:\Users\<用户名>\AppData\**(浏览器数据、凭据、日志)
Roaming\Microsoft\Credentials\(Windows 凭据)
Roaming\Microsoft\Windows\PowerShell\ConsoleHost_history.txt(命令历史)
C:\Users\<用户名>\NTUSER.DAT(用户注册表配置)
3. 应用程序敏感文件
C:\ProgramData\Microsoft\Credentials\(系统凭据)
C:\xampp\mysql\data\mysql\user.MYD(MySQL 用户密码哈希)
C:\inetpub\logs\LogFiles\(IIS 日志,含攻击痕迹)
4. 数据库文件
C:\Program Files\Microsoft SQL Server\MSSQL\DATA\master.mdf(SQL Server 主数据库)
5. 临时文件 & 自动安装配置
C:\Windows\Panther\Unattend.xml(可能含明文密码)
C:\Windows\Temp\(临时文件泄露)
6. 注册表关键路径
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon(默认登录凭据)
HKCU\Software\Microsoft\Windows\CurrentVersion\Run(用户自启动项)
Linux系统
系统关键配置文件
/etc/passwd
用户账户信息(不含密码,但可枚举用户)。
/etc/shadow(需 root 权限)
存储用户密码哈希(攻击者目标)。
/etc/group
用户组信息,可用于权限提升分析。
/etc/sudoers
定义哪些用户可执行 sudo(提权关键)。
/etc/hosts
本地 DNS 解析,可被篡改用于劫持。
/etc/resolv.conf
DNS 服务器配置。
/etc/fstab
挂载点信息,可能泄露存储设备路径。
2. 用户数据 & 敏感文件
~/.bash_history
用户执行的命令历史(可能含密码或敏感操作)。
~/.ssh/
id_rsa(私钥)、authorized_keys(免密登录配置)。
~/.aws/credentials
AWS 访问密钥(若配置不当)。
~/.mysql_history
MySQL 命令历史(可能含数据库密码)。
/var/mail/<user>
用户邮件,可能含敏感信息。
3. 日志文件(可能泄露攻击痕迹或凭据)
/var/log/auth.log
认证日志(SSH 登录记录)。
/var/log/syslog
系统日志(含服务错误信息)。
/var/log/apache2/access.log(Apache)
Web 访问日志,可能含攻击 payload。
/var/log/nginx/access.log(Nginx)
类似 Apache,记录 HTTP 请求。
4. 数据库 & 服务配置文件
/etc/mysql/my.cnf
MySQL 主配置文件,可能含数据库密码。
/var/lib/mysql/mysql/user.MYD(旧版 MySQL)
用户表,存储密码哈希。
/etc/postgresql/<version>/main/pg_hba.conf
PostgreSQL 客户端认证配置。
/etc/redis/redis.conf
Redis 配置,若未设密码可导致未授权访问。
5. 临时文件 & 内存数据
/tmp/
临时文件,可能含敏感数据(如 PHP Session 文件)。
/proc/(虚拟文件系统)
/proc/self/environ(当前进程环境变量,可能含密码)。
/proc/<pid>/cmdline(进程启动命令,可能泄露敏感参数)。
6. Web 应用相关
/var/www/html/(默认 Web 根目录)
config.php、.env(数据库凭据泄露风险)。
/etc/apache2/apache2.conf
Apache 全局配置,可能暴露目录结构。
/etc/nginx/nginx.conf
Nginx 主配置文件,可能含敏感路径。
7. 特权提升相关
/etc/crontab
定时任务配置,可被利用执行恶意脚本。
/etc/sudoers.d/
自定义 sudo 规则,可能配置不当导致提权。
/usr/bin/sudo(SUID 提权检查)
若配置错误,可被滥用。
六.文件包含漏洞的排查方法
- 观察 URL 中是否包含类似关键字:
page
、include
、path
、file
、link
、url
等,存在此类关键字可能暗示文件包含功能。 - 检查 URL 中参数赋值(等号后内容)是否为文件路径,若参数直接指向文件,则可能存在文件包含漏洞。
- 在疑似文件包含的参数处尝试赋值测试:
- 输入远程 URL(如
https://www.baidu.com
)验证是否可远程包含; - 输入系统常见文件路径(如 Linux 的
/etc/passwd
)验证是否可读取本地文件。
- 输入远程 URL(如
- 结合文件上传漏洞验证:若存在文件上传功能,可尝试上传恶意文件后通过文件包含参数调用,进一步确认漏洞存在。
现在来实验了,用dvwa来实验,记得调整为low
往page那里输入常见的敏感信息路径。尝试获取服务器上的⽂件内容, 输⼊ ../../../../../../( 多少个../都⾏, 越多越好) etc/passwd。../意为上一级目录,因为我们不知道有多少层,所以越多越好。
如果不成功的话有两种可能
1.权限不够
2.有可能真的没有
Medium
对page参数进⾏了—定的过滤, 将”http:// ”、”https://”、 ” ../”、”..\“”替换为空字符。但str_replace函数并不是很安全, 双写就可以绕过了。
输入:..././..././..././..././..././etc//passwd
hight
这里用了fnmatch函数
- fnmatch() 函数根据指定的模式来匹配⽂件名或字符串
- 语法:
- fnmatch(pattern,string,flags)
- pattern 必需 。规定要检索的模式。
- string 必需 。规定要检查的字符串或⽂件。
- flags 可选。
输入:///etc/passwd
三⽂件包含getshell
1.中间件⽇志包含绕过
DVWA 中,apache2 日志文件路径为:/var/log/apache2/access.log 包含日志文件,需要先对日志文件和目录添加权限,让 Web 端有权限去访问:
顺便讲一下权限。使用ls -alt
d:意味目录
r:有阅读的权限
w:有编写的权限
x:有执行的权限
第一个rwx代表的是当前用户,第二个代表的是所属的用户组中的用户,第三个代表其他用户。
要用牛,第一个是拥有牛的人,第二个相当于是同村的人,第三个相当于外村人。
重新回归修改权限之说。如果我们用的是Docker Desktop的话,可以直接打开更改
root@c1f28c3146d7:/var/log # chmod -R 755 /var/log/apache2(全部更改的)
root@c1f28c3146d7:/var/log/apache2 # chmod 644 access.log
修改完权限之后, 访问
http://127.0.0.1:8080/vulnerabilities/fi/?page=<?php phpinfo();?>#查看是否有权限
http://127.0.0.1:8080/vulnerabilities/fi/?page=/var/log/apache2/access.log
这样子就代表权限更改成功了,但是我们要插入php请求才行。
中间件⽇志包含绕过 添加PHP代码 <?php phpinfo(); ?>,是不会成功的,因为会被进行url编码从而缺失<,?,>等关键符号
重新发送后,虽然显示不合法,但是已经成功了。
二配合⽂件上传Getshell
攻击思路:
1. 把代码+图⽚合在—起, 最终看到还是—个图⽚, 只是这个图⽚中有代码
2. 上传—个含有php代码的jpg图⽚
3. 以⽂件包含漏洞来执⾏图⽚的php代码
这个之前有,文件上传漏洞写过,我就懒得再写一次了。记住,如果要连接蚁剑等,记得添加cookie