[upload_labs]文件上傳繞過小結(jié)

前言:

在日常滲透中,上傳文件是getshell的一個常用方案,在其中,我們常常直接修改后綴進(jìn)行繞過,如果不行,往往會放棄,從而錯失機(jī)會。這里是我通過github的一個上傳繞過源碼來記錄下需要注意的點。

upload-labs
通關(guān)攻略

上傳繞過原理:

1> 后綴名采用上傳文件名的文件后綴,也就是后綴名我們可以控制,接下來,就是看后臺對后綴名是否違法(黑名單),或者是否(白名單)是如何限制了。

var ext_name = file.substring(file.lastIndexOf("."));
    //判斷上傳文件類型是否允許上傳
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當(dāng)前文件類型為:" + ext_name;
        alert(errMsg);
        return false;
    }

2>一種就是直接采用內(nèi)部命名,這種考慮解析漏洞或者別的思路。

     $temp_file = $_FILES['upload_file']['tmp_name'];
     $img_path = UPLOAD_PATH.'/'random(time).jpg;  //這種已經(jīng)確定死了,截斷解析或者文件包含漏洞打組合拳吧

js繞過:

這種很簡單,是通過js前段驗證,我們抓包修改成.php即可。

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("請選擇要上傳的文件!");
            return false;
        }
        //定義允許上傳的文件類型
        var allow_ext = ".jpg|.png|.gif";
        //提取上傳文件的類型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判斷上傳文件類型是否允許上傳
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當(dāng)前文件類型為:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>

window繞過技巧:

window的特性繞過,在window下,很多命名方式會導(dǎo)致window自動去了違法字符。
所以,前提是我們能保證服務(wù)器是window的情況下,可以根據(jù)返回值進(jìn)行判斷,來進(jìn)行繞過。

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//刪除文件名末尾的點
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //轉(zhuǎn)換為小寫
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

基本上有一下幾點:
shell.php (后面加空格)
shell.php.
shell.php::$DATA

根據(jù)規(guī)則繞過:

源碼中,對后綴判斷的規(guī)則或者寫入的規(guī)則進(jìn)行判斷。

 if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {

 $file_name = str_ireplace($deny_ext,"", $file_name);
這里是過濾了后綴中存在的關(guān)鍵字。
我們可以通過雙寫進(jìn)行繞過: shell.pphphp
或者有的就是先上傳temp文件,然后進(jìn)行判斷文件名是否合法,
不合法再進(jìn)行刪除。然后我們可以不斷的寫入文件,來執(zhí)行我們的webshell等。

解析漏洞:

00截斷解析漏洞的條件限制很苛刻

1.  php版本小于5.3.4
2.  php的magic\_quotes\_gpc為OFF狀態(tài)
需要注意的點:
get請求中 可以直接 %00
post 必須在16進(jìn)制下進(jìn)行修改,因為post在請求中不會進(jìn)行自行編碼

總結(jié):

基本沒什么可以說的,還是需要走一遍流程,然后自己嘗試一波即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文件上傳漏洞 常見的漏洞分類服務(wù)器配置不當(dāng)導(dǎo)致文件上傳開源編輯器存在上傳漏洞本地文件上傳限制可以上傳被繞過服務(wù)器端...
    二潘閱讀 17,451評論 2 3
  • 文件上傳漏洞是指用戶上傳了一個可執(zhí)行的腳本文件,并通過此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力。這種攻擊方式是最為直...
    付出從未后悔閱讀 1,252評論 0 4
  • 0x00 概述 文件上傳漏洞是指用戶上傳了一個可執(zhí)行的腳本文件,并通過此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力。文件...
    孤君蓑笠翁閱讀 3,192評論 0 1
  • 一、初步認(rèn)識 1.上傳功能:網(wǎng)站上各種可以上傳文件,圖片的地方可以被用作上傳點進(jìn)行非法上傳 2.上傳原理:在前端代...
    楠昭閱讀 1,813評論 1 11
  • 文 | MENG 小王子離開了玫瑰去旅行,過了很久,他突然想念起玫瑰來了。于是他給玫瑰打了個電話,他說:我想念你,...
    萌之刺刺閱讀 465評論 0 0

友情鏈接更多精彩內(nèi)容