securityoverridehacking challenge 解題思路匯總——Advanced

來源:互聯網
上載者:User
繼續上一篇securityoverridehacking challenge 解題思路匯總的工作,這次把Advanced給弄完了。這當中主要涉及到了關於php的一些攻擊方法,可以以此為基礎做一個深入的瞭解。

3 Advanced

3.1 PHP Sucks

利用PHP中==的跨類型比較而產生的漏洞。最終目的是要$input=="0000". 這個好辦,php中,任何數字型字串最終都會轉化為數字去做比較,所以input可以是任意個0。不過Filter最後加了個正則判斷preg_match("/^[\d]{1,}$/D", $input)。意思就是不能為純數字。也比較簡單,利用0的特性嘛(小學知識:0等於0的負數),於是輸入-0就好了。

PS: 關於php的弱類判斷法則 http://php.net/manual/en/types.comparisons.php

3.2 Obfuscated PHP:

考察能否在混淆的前提下整理出代碼邏輯。這題沒有什麼快捷方法,手動清理。清除註釋和分號後代碼量其實不多,然後把一些該解碼的解碼,函數該返回的直接替換,就能把代碼邏輯理清楚了。整理完畢後代碼邏輯如下:

session_start();
$_u=array();
$_u[0]='SERVER_ADDQUERY_STRINGREQUEST_METHODHTTP_ACCEPT'; //一個字串
$_u[1]='substr'; // substr函數
$_u[2]='base64_decode'; // decode方法
$_§§§§§§§ =preg_split('/(?!\\##\$\$\$uu)=/',_SERVER['QUERY_STRING']); // 可以簡單理解為按=分割
${"_g_1"} = urldecode($_§§§§§§§[0]); // key
${"_g_2"} = _GET[${"_g_1"}]; // value
if(LEVENSHTEIN(${"_g_1"},${"_g_2"})==0){// 參數的key和value必須一樣
validate_result(${"_g_2"});
};

function validate_result($result){ // value = phpinfo(); 則成功(必須要分號)
if($result === 'phpinfo();'){
$_SESSION["solved_advanced_2"] = true;
header("Location:./");
}
}

echo "Good luck. Back to thechallenges main page.
Please note that you willonly get feedback if you solved this challenge. Wrong attempts do not generateany output at all.

";
highlight_file('code.php');
?>

之後就很簡單了,構造一個符合要求的url即可。

3.3 Upload bypass

要求你bypass過濾程式,上傳一個php指令碼。常規思路:1 直接上傳.php檔案(失敗)。2 上傳.php檔案,但是修改post內容中的contentType為image/jpg(失敗)。3 上傳正常jpg檔案,隱藏php指令碼(Linux命令cattest.php>>image.jpg或者使用工具來添加註釋,盡量保證圖片簡單或純色,以免某些圖片字元幹擾php解析)。通過第三步,這個問題就解決了。

接下來還研究了一下怎麼執行jpg中的php指令碼這個問題,在查閱資料以及自己實驗後,基本只有這兩種方法比較可行:

· 在另一個php檔案中includeu或者require這個jpg檔案
include('images/' . $_GET['test.jpg']);
require('images/' . $_GET['test.jpg']);
include('images/' . $_POST['test.jpg']);
include('images/' . $_POST['test.jpg']);
include('test.jpg');
require('test.jpg');
?>

· 在/etc/apache2/mods-available/php5.conf中設定jpg格式的解譯器為php

SetHandler application/x-httpd-php

修改.htaccess原理一樣(簡單嘗試了一下,沒有成功)

既然題目中已經提到了存在local file inclusiong這個漏洞的存在,那麼想利用第一種方法執行php指令碼就很簡單了,大致是利用注入的方法去控制include或者require中的變數,使得指令碼執行。

3.4 Local File Inclusion/WAF Bypass

好吧,3.3的研究起到作用了,3.4就是要求執行已上傳的檔案(檔案路徑在3.3上傳成功的時候已給出,我的是/challenges/advanced/uploads/Ac3sk9j.jpg,不知道是不是大家都一樣)。3.3中已經提到了,php中如果有include或者require等函數,就可以被用來執行jpg中的php代碼。進入3.4,觀察後發現url帶有參數page,嘗試隨意修改,果然給出了錯誤提示:test.phpcannot be found。那麼目標就很明確了,修改page參數,將路徑指定到jpg檔案。利用路徑中,..代表上一級檔案夾,很容易寫出相對路徑來../uploads/Ac3sk9j.jpg。嘗試請求,結果為:uploads/Ac3sk9j.jpg.phpcannot be found。有兩點不如人意:1)../給過濾掉了;2)檔案名稱為Ac3sk9j.jpg.php而不是Ac3sk9j.jpg。於是分別尋找解決方案:

· 對於某種特定字串被過濾的情況,最簡單的就是string replace了。對應的破解方法很簡單,拼湊類似aabb的字串就好了。中間的ab在被過濾後,就會產生新的ab了。這裡寫成….//就可以了。所以stringreplace的過濾方法和沒有是一樣的。

· .php尾碼問題。顯然網站對任何請求路徑都加了.php尾碼。Google了一下繞過策略,主要有兩種:1)利用檔案路徑最大長度4096bytes,然後通過添加任意個/.來構造超長的檔案路徑。想了想,這麼長的url估計直接會被伺服器攔截返回414,於是就沒有嘗試了;2)利用C中字串終止符,在.php之前加入終止符,表示截斷。比較普遍都是拿%00舉例,不過嘗試了一下沒成功。後來在某個樣本中查到了\0,就成功了。

這道題到這裡也就成功了。在尋找資料的過程中,對LocalFile Inclusion的漏洞又學到了一點新東西。在如何寫入某個帶指令碼的檔案上,除了直接的上傳檔案外,也可以利用伺服器將使用者資訊輸入到檔案的過程,寫入某個指令碼。例如,伺服器可能會記錄訪問請求的UserAgent(/proc/self/environ),url(access.log),或者登入的使用者名稱密碼等到一個log檔案中,而這些資訊都是可以被攻擊者控制的(UserAgent和url似乎預設都是會被Apache伺服器記錄的,路徑已經寫出,當然,根據配置不同,路徑可能變化)。所以這種情況下,只需要修改對應的值,向伺服器發起請求,php指令碼就已經被寫入到伺服器某個檔案中了,接下來就只需要執行就好了。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

以上就介紹了securityoverridehacking challenge 解題思路匯總——Advanced,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.