【轉載】僞靜態SQL注入

僞靜態,主要是爲了隱藏傳遞的參數名,僞靜態只是一種URL重寫的手段,既然能接受參數輸入,因此並不能防止注入。目前來看,防止注入的最有效的方法就是使用LINQ。常規的僞靜態頁面以下:http://www.2cto.com /play/Diablo.html, 在看到以前先要肯定這個頁面是靜態仍是僞靜態,鑑別方法不少。

例如關聯的動態頁面是game.php ,那麼當用戶訪問後程序會自動轉換成相似http://www.XXX.com/game.php?action=play& name=Diablo 的形式,固然這部分是PHP執行的因此在訪問時看不到。假如name=Diablo這個參數有注入點可是訪問的是僞靜態頁面,那麼注入的語句其實差很少,不過若是是MYSQL數據庫是不能用註釋符的,因 爲註釋的斜槓會被當成目錄訪問,那麼就會出現問題,因此這裏的注入須要把語句補全。

注入點檢測能夠用:http://www.XXX.com/play/Diablo’and 1=’1.html與http://www.XXX.com/play/Diablo’and 1=’2.html來判斷,聯合查詢我也試過,不過失敗了。我用的語句以下:http://www.XXX.com/play/diablo’and 1=2 union select 1,2…from information_schema.columns where 1=’1.html,可是測試了N次都不能成功,有可能程序的SQL語句後面還有其餘條件,具體緣由沒仔細看。

因此這個時候只能用盲注來檢測,不過由於僞靜態注入的URL比較特殊,通常的注入工具是利用不了的,因此就把刺蝟寫的COOKIES注入中轉器的get方式注入的代碼修改了一下,只要把注入的參數寫成Diablo ,而後在提交的語句後面加上.html那麼就能夠直接放到穿山甲裏注入了。

注入的速度就看中轉的速度了,感受用低版本的穿山甲效果更好,高版本有可能由於速度比較快因此在猜解字母的時候會致使部份內容檢測不到。爲了更好的解釋僞靜態,先看看四種僞靜態的php實現方法:


代碼
//僞靜態方法一

// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl.」
」;// /php100/test.php?id|1@action|2
$Php2Html_UrlString = str_replace(「?」,」",str_replace(「/」, 「」, strrchr(strrchr($Php2Html_FileUrl, 「/」),」?」)));
echo $Php2Html_UrlString.」
」;// id|1@action|2
$Php2Html_UrlQueryStrList = explode(「@」, $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList);// Array ( [0] => id|1 [1] => action|2 )
echo 「
」;
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode(「|」, $Php2Html_UrlQueryStr);
print_r($Php2Html_TmpArray);// Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )
echo 「
」;
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
//echo ‘假靜態:$_GET變量
’;
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo 「
」;
echo 「」;
echo $_GET[id].」
」;// 1
echo $_GET[action];// 2
?>

代碼
//僞靜態方法二

// localhost/php100/test.php/1/2
$filename = basename($_SERVER[''SCRIPT_NAME'']);
echo $_SERVER[''SCRIPT_NAME''].」
」;// /php100/test.php
echo $filename.」
」;// test.php

if(strtolower($filename)==’test.php’){
if(!empty($_GET[id])){
$id=intval($_GET[id]);
echo $id.」
」;
$action=intval($_GET[action]);
echo $action.」
」;
}else{
$nav=$_SERVER[''REQUEST_URI''];
echo 「1:」.$nav.」
」;// /php100/test.php/1/2
$script=$_SERVER[''SCRIPT_NAME''];
echo 「2:」.$script.」
」;// /php100/test.php
$nav=ereg_replace(「^$script」,」",urldecode($nav));
echo $nav.」
」; // /1/2
$vars=explode(「/」,$nav);
print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 )
echo 「
」;
$id=intval($vars[1]);
$action=intval($vars[2]);
}
echo $id.’&’.$action;
}
?>

代碼
//僞靜態方法三

function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
echo $nav.」
」;
$script_name=$_SERVER["SCRIPT_NAME"];
echo $script_name.」
」;
$nav=substr(ereg_replace(「^$script_name」,」",urldecode($nav)),1);
echo $nav.」
」;
$nav=preg_replace(「/^.ht(m){1}(l){0,1}$/」,」",$nav);//這句是去掉尾部的.html或.htm
echo $nav.」
」;
$vars = explode(「/」,$nav);
print_r($vars);
echo 「
」;
for($i=0;$i
$_GET["$vars[$i]「]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$year=$_GET["year"];//結果爲’2006′
echo $year.」
」;
$action=$_GET["action"];//結果爲’_add’
echo $action;
?>

代碼
//僞靜態方法四

//利用server變量 取得PATH_INFO信息 該例中爲/1,100,8630.html 也就是執行腳本名後面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正則匹配一下參數
if(preg_match(「/\/(\d+),(\d+),(\d+)\.html/si」,$path_info,$arr_path)){
$gid =intval($arr_path[1]); //取得值1
$sid =intval($arr_path[2]); //取得值100
$softid =intval($arr_path[3]); //取得值8630
}else dIE(「Path:Error!」);
//至關於soft.php?gid=1&sid=100&softid=8630
}else dIE(‘Path:Nothing!’);
?>
代碼
PHP防注入,主要是爲了防止惡意寫入後臺數據庫;
//防注入函數
function inject_check($sql_str){
$check=eregi(‘select|insert|update|delete|\’|\/\*|\*|\.\.\/|\.\/|union|into|load_file
|outfile’, $sql_str);
if($check){
echo 」 輸入非法內容」;
exit();
}else{
return $sql_str;
}
}
//接收傳遞參數後進行轉換
$_GET[type]=inject_check($_GET[type]);
//以後再使用轉換後的參數

以前寫的這篇關於僞靜態注入的文章,寫的比較簡單基本上只算是對僞靜態注入的方法和原理作了簡單介紹,不少細節方面的東西都沒有提到,不過要糾正一點,僞 靜態注入同樣能夠用聯合查詢的,只是具體的字段數要一個一個猜,這個有點麻煩,今年主要在看老美的網站,發現不少僞靜態站點都有注入點,只是大部分注入點 都比較隱蔽因此在滲透的時候須要花費不少時間,這裏就以美國某遊戲站點的滲透做爲實例,介紹一下整個滲透利用過程。

前段時間比較無聊,上了某遊戲站點放鬆,發現那個站作的很不錯並且在線人數達到1W多,由於我是在白天訪問的當時美國應該是晚上,因此能夠看出這個 站的流量很是大,去alexa上查了一下排名在4千左右,流量25W,那麼這個站流量估計有50W+,看了口水都留下來了!!!隨即打算檢測一下這個網站 的安全性,訪問了整個網站只有2個頁面是調用PHP的,可是沒有注入點,整個網站大體信息以下:APACHE、PHP、數據庫未知(應該是MYSQL 吧)、僞靜態頁面(檢查後發現的)、後臺找不到、不能破解目錄(訪問不存在的頁面或目錄後會返回首頁,狀態碼始終是200和301,掃描的時候會有不少誤 報)、能夠註冊(沒有注入點)、不能上傳文件、沒有常見的配置漏洞(好比目錄瀏覽之類的)、沒有掃到冗餘文件、沒有FTP、沒有SSH、端口掃描後也沒有 發現。彷佛這個網站很棘手,畢竟別人也是排名4K內的站啊!!!在GG、baidu上搜了一下PHP以及敏感的頁面也沒新發現,其實有時候用百度搜國外站 的收錄頁會有驚喜哦!由於這個站是僞靜態的,因此對主要的幾個頁面作了僞靜態的注入測試,可是都沒漏洞,也不知道這個網站是用什麼模版作的。用旁註工具掃 了一下域名,發現服務器上綁定了十幾個站,悲劇的是全部站用的是同一個網站模版,全部狀況和主站同樣。估計到這裏不少人都想到C段吧,惋惜老外的IDC比 較怪,通常不會把一個C放在一個交換機環境裏,我碰到最BT的是把子網掩碼設爲255.255.255.252,稍微好點的是255.255.255.244,就算弄到同網段的,通常都是LINUX服務器,提權超難,公佈的0day基本都不行,因此C段直接放棄。

關注入點繼續回到網站上,註冊了一個帳號,看了一下用戶功能,基本上只有修改本身信息的權限,COOKIES方面測試了一下沒漏洞,不過發現網站管理 員的帳號和註冊人員是同一個表的,把URL裏的ID改一下就能得到用戶名,惋惜只有用戶名,並且用戶名還很BT,哎!!!!難啃的骨頭,繼續深刻~~~~ 看到遊戲頁面後找到一個投票的鏈接,抓包後發現也是僞靜態(鏈接類型以下:http://www.XXXXX.com/vote/5453/1), 經過僞靜態的注入點檢測肯定存在注入漏洞而且提交後會執行update語句,檢測時提交如下語句(http://www.XXXXX.com/vote /5453′/1 報錯,http://www.XXXXX.com/vote/5453-0/1 返回正常遊戲名字http://www.2cto.com /vote/5453-1/1 返回5452的遊戲名字,判斷存在注入點)鏈接的表是member,惋惜顯示的出錯語句很複雜,各類符號都有,想了幾種辦法也都沒補全,並且數據庫中的表 和列也都不知道,彷佛只有看源碼後才能構造注入語句,雞肋的注入點,餘下來看完了整個網站也只發現一個暴物理路徑的漏洞,又是雞肋!彷佛初步的檢查到這步 已經完成了,一個字,難!

由於弄到很晚因此睡覺了,隔了幾天仍是時不時的上來看看網站、看看管理員在線狀態,一個星期後以爲很不爽,再次打開這個網站,而後把註冊頁面、登錄 頁面、提交頁面做爲關鍵字去網上找相同模版,此次終於有發現了,找到一個新部署的網站,並且後臺路徑是admin管理員帳戶是默認的admin,進去後發 現後臺能夠直接拿SHELL,而後去網上查了一下這個網站的0day,可是比較老因此沒法利用,看了一下源碼也只發現那個雞肋的注入點,這個時候突然想到 了什麼,經過上傳的SHELL查看數據庫的表結構,原來member的表中有一個管理員的選項,設爲1就是普通用戶,設爲2就是管理員,這樣就能經過那個 注入點提高權限了,並且在php頁面中看到了投票的SQL語句,在構造以後直接在遊戲站上測試(語句以下:http://www.XXXXX.com /vote/5453;}’,xxx=’xxx’,xxx=’{xxxx/1), 成功提高爲管理員(通過驗證發現只要用這個網站模版均可以提權,又一個0day!),並且發現只要帳戶具備管理權限,前臺頁面中會以黃色顯示用戶名,狂喜 之下登錄遊戲站,發如今用戶界面中多了一個管理員登陸的選項,但是!!!悲劇再次發生,鏈接的目錄是默認路徑,後臺找不到,是在不甘心用平時用的後臺掃描 字典,以及本身生成了1-5位的數字以及字符的字典放到havij裏爆破,由於havij能夠DIY狀態代碼,因此我把200和301的狀態去掉了,掃了3天后無果!!!!糾結!!!!

在1個星期以後的某天再次打開這個網站,用一個網上下的字典再次掃了整個目錄,此次發如今根目錄裏有一個server-status,訪問以後狂 喜,裏面有APACHE提供當前服務的URL,因此用戶訪問的頁面都能檢查,而後找了website watch進行監控,設置了一些關鍵字後以平均每3秒鐘對該頁面檢測一次,若是發現有關鍵字就以MAIL方式報警,同時把有關鍵字的頁面覆蓋在郵件中,2 天后成功抓到後臺頁面,打開後發現是401驗證,網站沒有下載和FL漏洞,用獲取的管理員信息嘗試登錄,結果通通失敗,感受腦子都充血了!!!!對了,不 是還有UPDATE權限的雞肋注入點嗎!!因爲MYSQL的關係,沒法把同表中的內容更新到同表的其餘列中,因此第一次失敗了,上網查了一下從新構造語句 成功,拿到的是管理員md5的密碼,上CMD5上查到源碼,而後用管理員的帳戶經過了401驗證,成功登錄後臺,進去後隨便逛了一下上傳webshell,反彈cmdshell,發現是X64的系統,用了網上找的道的全部EXP都不能提權,不過發現服務器上有2個外網IP,另一個IP可 以連接FTP和SSH,用了管理員的密碼以及passwd裏的用戶名登錄結果發現網管用了公鑰驗證,RSA加密,直接訪問存放public key的目錄顯示DENY,直接下載公鑰仍是DENY,不過能夠看全部網站目錄。

到這步基本上網上入侵成功了,但是還沒提權,不過把管理員的用戶名放到GG上搜了一下發現處處都有他的」足跡」,並且都不能用他的密碼登錄,只能社 工和跟蹤了,看來又是一個漫長的提權過程,整個網站入侵從開始到拿到權限大體用了2個月時間,等有時間了就想辦法提權,謝了稍微多了一點,其實僞靜態注入 的利用價值仍是很高的,並且結合其餘雞肋的安全問題能夠直接威脅到網站甚至服務器的安全,相比之下國內站臺爛了,即時LINUX有了WEBSHELL 80%均可以提權,用public key作SSH驗證的基本沒見過,大概這就是差距吧,先寫到這裏吧,等有時間了寫一個完整的關於僞靜態注入和檢查方法!!!提權內容待續(若是能成功提權的話!)php

 

------------僞靜態注入,尚無經驗,體會回寫:2013.8.27html

相關文章
相關標籤/搜索