CTFHub-技能樹-文件上傳


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM