(1)抓包绕过前端检测
因为存在前段验证的问题,所以我们将一句话木马文件shell.php 重命名为 shell.jpg 上传抓包的时候再将文件名修改为 shell.php 即可绕过前段限制,成功上传 webshell。蚁剑连接进入后台。
(2)禁用js
看文章题目可知,使用js来检测后缀。所以我们用js禁用插件禁用js。即可上传php木马文件。
0x02 .htaccess上传.htaccess文件,写入 AddType application/x-httpd-php .jpg
这样我们上传到.jpg文件可以被当成php文件解析。
上传.jpg文件抓包写入php一句话木马,send即可。
0x03 MIME提示了是MIME类型检验,所以抓取数据包之后更改Content-Type为符合条件的image/jpeg,即可上传我们的php木马文件。
也可以上串一个符合条件的.jpg文件,抓包后Content-Type就是符合条件的,更改文件为.php。写入一句话木马即可。
0x04 文件头绕过抓包,因为需要上传图片文件,所以修改Content-Type为image/jpeg,同时存在文件头检测。需要上传一个图片🐎,不过这个环境在文件内容里写入图片头GIF89a,就可上传我们的php木马文件。
审计题目代码可知,存在黑名单检测。同时因为str_ireplace() 执行对大小写不敏感的搜索。我们上传的文件名会过滤掉黑名单里的字符。大小写绕过不可行。不过可以双写绕过.
上传123.pphphp木马文件。蚁剑连接/upload/123.php即可(不可上传.phphpp,那样上传的文件是123.hpp)
0x06 有缺陷的代码2不同与有缺陷的代码1这道题是把黑名单里的内容转化为了“ ”空格。但是str_replace()对大小写敏感,可以构造大小写.pHp来绕过。
题目中提到;本地属于理论上漏洞,因为题目环境是 Docker 容器运行的 Linux 系统,所以本题人工修改成了 Windows 的特性
经查询得知:因为 Windows 环境下不区分大小写,所以就可以让 .pHp 当做 .php 来解析了,但是 Linux 下这种大小写如果的话完全没作用,所以本题是国光师傅自己造的漏洞,用来伪造 Windows 环境下的大小写不区分的情况。
0x07 古老的漏洞?Get型00截断
这道题解释了php%00截断。burp抓包,因为是从 GET 方式传递给后端的,默认会进行一次 URL 解码,所以可以直接在url路径里用%00截断。写入123.php%00.这样我们上传的文件就是123.php。
/upload/123.php%001.jpg
蚁剑连接/upload/123.php。
0x08 古老的漏洞2?上传一个1.jpg文件,burp抓包。
发现./upload不在url里。post型00截断。
注意对%00进行urldecode。
之后send。上传123.php。蚁剑连接即可。
0x09 黑名单缺陷白名单是设置能通过的用户,白名单以外的用户都不能通过。 黑名单是设置不能通过的用户,黑名单以外的用户都能通过。 所以一般情况下白名单比黑名单限制的用户要更多一些
每个后缀都试试,发现php3上传成功。蚁剑连接即可。
0x10 条件竞争之前没刷过这类的文件上传题目要。查看wp得知:
条件竞争的话稍微和正常的上传姿势不一样,首先上传123.php文件抓包,
写入:
send到intruder模块,选择null payloads,Continue indefinitely。
之后抓取访问123.php的数据包,依然使用NULL值爆破。
xiao.php被上传到upload/处.
0x11 二次渲染二次渲染。。。没听说过,算是学会了一个新知识。查看别人题解可知:
url里存在一个文件包含,这样包含选手们逃避渲染上传后的图片的话就可以直接 getshell 了:
下面是有关二次渲染的细节。
0x12 move_uploaded_file move_uploaded_file($temp_file, $img_path).
当 $img_path
可控的时候,还会忽略掉 $img_path
后面的 /.
既然知道 move_uploaded_file 的这个小缺陷的话,我们可以使用
成功上传木🐎文件,蚁剑连接。
0x13 代码审计这是一个php代码审计与前面move_uploaded_file的小缺陷的结合。
首先第一个判断:MIME头检测。
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
所以要保证我们上传的表单 MIME 类型一定要符合标准。
然后是:检查文件名
对提交的save_name检测,如果不是数组的话就以 .
为分隔,打散为数组
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
是数组就无需打散。
打散后校验最后的后缀。
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
所以我们传入这样一个数组:
$file = [0=>'shell.php/', 2=>'png']
这样执行完最后的拼接语句之后:
$file_name = reset($file) . '.' . $file[count($file) - 1];
$file_name = 'shell.php/' . '.' . $file[2 - 1]; = 'shell.php/.'
构造成功 shell.php/.
而我们知到move_uploaded_file($temp_file, $img_path
)函数的一个小缺陷:
当 $img_path
可控的时候,会忽略掉 $img_path
后面的 /.
所以最后一步为:
move_uploaded_file($temp_file, $img_path);
move_uploaded_file($temp_file, "shell.php/.")
上传了我们的shell.php🐎