檔案及目錄名稱猜測
網管人員可能因疏忽,讓CGI程式或網站設定檔等被人任意下載。
備份檔
網頁設計人員可能因一時的方便,將index.php備份為index.bak,如果有人猜到index.bak這個檔名,那麼index.php的原始碼可能被下載。
http://www.abc.com.tw/index.php
http://www.abc.com.tw/index.bak
管理介面
有些網站提供網理者介面,若管理者沒設好認證機制,可能被有心人士猜到介面的URL。
http://www.abc.com.tw
http://www.abc.com.tw/admin
設定檔
網站設定檔的路徑和名稱被猜測到,而且權限沒設定週詳。這樣可能導至整個設定檔被下載。
http://www.abc.com.tw/config/config.ini

網頁隱藏欄位欺騙
<input type="hidden" name="price" value="1000">
如果CGI程式未對name="price"隱藏欄位作查核,直接以value="1000"來處理,那麼有心人士可透過修改HTML網頁表單,來欺騙CGI程式。
<input type="hidden" name="price" value="1">

Cookie欺騙
瀏覽網頁時,cookie可能由server端傳送給瀏覽器然後存在local端的PC上,如果cookie在時效內,瀏覽器在瀏覽相同網站時,即會傳送原先所儲存的cookie給該網站。
如果某網站在使用者輸入帳號/密碼通過認証後,傳一個cookie給瀏覽器,cookie如下
www.abc.com.tw TRUE ID=abcd
因為有cookie,所以當我們把瀏覽器關掉,再重新連上相的網站時,網站程式發現有cookie就視作已認證成功,便不要求再度認證。
如果網頁程式是透過cookie上的ID欄位來判斷使用者的身份,那麼有心人士若把ID=abcd改為admin,或許有可能變成管理者身份。

SQL Injection
假如有個auth.php網頁程式,會由使用者輸入帳號/密碼後,連線端資料庫TBUSER作查詢,程式碼如下
SELECT * FROM TBUSER WHERE USERNAME='$username' AND PASSWORD = '$password'
正常情況下,使用者輸入abc/123時,瀏覽器透過GET方式送出
http://www.abc.com.tw/auth.php?username=abc&password=123
而auth.php執行如下
SELECT * FROM TBUSER WHERE USERNAME='abc' AND PASSWORD = '123'
如果auth.php網頁程式沒有過濾或檢查傳入的參數,有心人士可以透過GET的方式傳入SQL指令
http://www.abc.com.tw/auth.php?username=abc' --&password=123
即在username欄位輸入「abc' --」,此時SQL指令會變成
SELECT * FROM TBUSER WHERE USERNAME='abc' --'AND PASSWORD = '123'
由於「--」在SQL上為註解符號,所以「--」後面的指令將被視作註解而忽略執行,變成這樣
SELECT * FROM TBUSER WHERE USERNAME='abc'
如果username傳入abc,而password傳入「' OR 1=1 --」,則SQL指令變成
SELECT * FROM TBUSER WHERE USERNAME='abc' AND PASSWORD = '' OR 1=1 --'
這個SQL指令,是永遠都會成立的。

Command Injection
網頁設計為了方便,可能由網頁程式直接呼叫系統上的其他程式,如用system()。這類呼叫如果沒有檢查參數的話會造成Command Injection。
下面表單允許使用者輸入一個關鍵字,然後呼叫CGI程式search.pl查詢
<input type="text" name="keyword" value="">
search.pl程式如下
system("grep data.txt $keyword > result.log");
如果使用者輸入「;ls;」,則指令變成
system("grep data.txt ;ls; > result.log");
此時grep指令被破壞,且會執行ls指令,於是檔案及目錄資料流出去了。
常用的Command Injection測試的跳脫字元大致有下列幾項:
| ; ' ` $ ( )

URL目錄瀏覽
假設整個網頁目錄結構如下
/
/etc
/etc/passwd
/www
/www/cgi-bin
/www/cgi-bin/auth.php
/www/cgi-bin/shownews.php
/www/news/001.html
下面程式shownews.php會依item的參數決定送出哪一個html檔案
http://www.abc.com.tw/shownews.php?item=001.html
程式會幫item傳入的參如加上「/www/news」目錄路徑,組合成/www/news/001.html,然後將001.html的內容送給瀏覽器
如果未對shownew.php傳入的item參數做檢查,那麼透過GET送入
http://www.abc.com.tw/shownews.php?item=../../etc/passwd
那麼passwd檔就會被shownews.php給整個輸出
http://www.abc.com.tw/shownews.php?item=../cgi-bin/auth.php
整個auth.php程式碼也被輸出了。

CGI檔案上傳
如果網頁伺服器對於可執行的CGI目錄路徑未作好限制,而上傳檔案的內容也未被檢查或過濾,透過上傳功能,就能把簡單的web shell程式上傳並執行。
以PHP為例,如果把下面程式webshell.php上傳
<?php system($cmd); ?>
透過GET方式送入如下指令
http://www.abc.com.tw/upload/webshell.php?cmd=ls
即由php去執行系統命令ls。

參考資料:The WarGame--駭客訓練基地
arrow
arrow
    全站熱搜

    jck11 發表在 痞客邦 留言(0) 人氣()