CTFHub-技能樹-文件上傳
1.無驗證
= = 這道題忘了截圖
不過思路很簡單,寫個一句話shell傳上去,然后手動或者用蟻劍(這周任務學完寫個蟻劍的簡單用法總結)連上去,在www目錄(好像),就可以找到flag文件,打開就可以拿到flag。
一句話<?php eval($_POST['cmd']); ?>
,實戰的話,盡量用一些比較特別的參數名
當然也可以手工shell,手工shell的話,eval里要用GET
2.前端驗證
上傳一句話,提示不允許上傳,查看源代碼,有檢測的js代碼,直接在瀏覽器里設置禁用js代碼,然后上傳。
用蟻劍連上,在html文件夾里就可以看到flag文件
3.文件頭檢查
直接提交會報錯
去查了下,文件頭的意思是,不同格式的文件開頭會有特征值,然后服務端會檢查文件頭來確定文件類型是否符合要求。思路就是偽造文件頭。
隨便傳個png上去,用burp抓包,保留文件頭,加上一句話shell,讓背后把文件名后綴改成php,但是打開有報錯
應該是對二進制字符解析出錯,那么在上傳的時候只保留文件頭和一句話即可
手動/蟻劍連上,就可以在目錄中找到flag_xxxxxxxx.php
4..htaccess
百科對.htaccess的介紹:.htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。
這道題應該是讓用自己寫的.htaccess去覆蓋服務器的.htaccess從而允許一些功能。
這篇總結寫的很詳細,可以看一下。
做題過程:
先上傳個一句話,提示文件類型不匹配
又上傳了一張圖片,上傳成功
推斷需要構造.htaccess,來讓服務器把png當作php解析,
AddType application/x-httpd-php .png
上傳.htaccess(就上邊這一句話)-->上傳成功
寫個一句話shell,然后把后綴改成png --> 上傳成功
最后用手工或者工具連上去,就能在html文件夾里找到flag
5.MIME繞過
MIME原本是指多用途互聯網郵件擴展類型。后來被用到了HTTP的Content-Type字段,稱為互聯網媒體類型。
所以這道題的思路很清晰,修改Content-Type為合法類型
用burp抓包,修改content-type
上傳成功,手工/工具連接,在html里又flag
6.00截斷
原理:
%00,0x00,/00都屬於00截斷,利用的是服務器的解析漏洞(ascii中0表示字符串結束),所以讀取字符串到00就會停止,認為已經結束。
我想的是,用.jpg%00.php的后綴繞過白名單,但是這樣上傳上去是圖片,而且文件名是隨機的(可以爆破出來),不可行,這是response注釋里的代碼
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
// move_uploaded_file($file, $des)把文件file移動到des中
// $_FILES 用於讀取HTTP POST上傳的數組
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上傳成功')</script>";
} else {
echo "<script>alert('上傳失敗')</script>";
}
} else {
echo "文件類型不匹配";
}
}
可以看到,des是最終的文件名,由$_GET['road']
,/,隨機數,日期,后綴名組成。
其中GET參數road是可控的,所以可以通過%00截斷,達到$des = $_GET['road']
的效果
拼接后,$des = '/var/www/html/upload/cmd.php%00/xxYearMoHoMiSe.jpg'
,但服務器解析時,00后的字符串會被忽略
7.雙寫后綴
看題意,感覺會是服務器端刪除/替換后綴
直接雙寫后綴.php.php
上傳,上傳成功,response里有注釋源碼
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
// str_ireplace($search, $replace, $subject)
// 把subject中的所有search替換為replace
和前邊猜的有點不一樣,是把所有匹配到的字符串都刪掉了
emmmm,自己想錯了,應該是這樣雙寫.pphphp
,刪掉一個php后,仍然還是php,再次上傳
連上去拿到flag