做網(wǎng)站運營需要培訓嗎在線搭建網(wǎng)站
安全測試理論
-
什么是安全測試?
安全測試:發(fā)現(xiàn)系統(tǒng)安全隱患的過程
-
安全測試與傳統(tǒng)測試區(qū)別
傳統(tǒng)測試:發(fā)現(xiàn)bug為目的 安全測試:發(fā)現(xiàn)系統(tǒng)安全隱患
-
什么是滲透測試
滲透測試:已成功入侵系統(tǒng)為目標的的攻擊過程
-
滲透測試與安全測測似區(qū)別
滲透測試:攻擊 安全測試:防護
-
如何進行安全測試(安全測試常用方法)
1、代碼走讀:檢查代碼是否有安全隱患 2、動態(tài)滲透 3、掃描程序緩存問題
-
安全測試方面(維度)
客戶端安全
-
常見分類
XSS:跨站腳本攻擊 CSRF:跨站請求偽造
XSS
-
什么是XSS
跨站腳本(cross site script)為了避免與前端css混淆,改名為xss
攻擊者通過改變前端頁面元素請求地址或注入JS,來獲取非法數(shù)據(jù)(cookie)。
-
XSS攻擊原理
-
XSS可用攻擊頁面標簽
-
攻擊方式分類
-
存儲型:將攻擊代碼存儲到數(shù)據(jù)庫,每次打開指定的頁面自動加載執(zhí)行。
場景:留言板、注冊
-
反射性:臨時修改頁面代碼,用戶打開頁面中招。
場景:圖片、連接
-
-
XSS攻擊步驟
-
核心:查找是否有XSS漏洞
執(zhí)行:<script>alert(123)</script>,證明可以執(zhí)行JS或沒有對<進行過濾。
-
目的:盜取敏感數(shù)據(jù),如cookie
-
XSS防護策略
- 將cookie設置只讀(HttpOnly)
- 輸入控制:禁止輸入特殊符號(</>'等)
- 輸出控制:過濾或轉(zhuǎn)義特殊符號的輸出
-
總結
-
XSS安全測試解決什么問題?
避免客戶端被注入惡意JS程序或修改標簽鏈接地址,導致數(shù)據(jù)丟失或訪問黑客網(wǎng)站
-
XSS測試人員使用的步驟
1、驗證碼頁面是否屏蔽了JS的注入 2、如果存在JS注入,提醒開發(fā)防護策略
-
CSRF(跨站攻擊)
- 什么是CSRF
CSRF(Cross-site request forgery)是指跨站請求偽造攻擊
- 目的
- 原理
- 攻擊操作步驟
1、獲取刪除或修改網(wǎng)站數(shù)據(jù)的接口
2、在黑客網(wǎng)站上生成一個刪除或修改鏈接(領取優(yōu)惠券)
3、黑客在要攻擊的網(wǎng)站上生成一個跳轉(zhuǎn)到黑客網(wǎng)站的鏈接(優(yōu)惠活動)
4、用戶在黑客網(wǎng)站上領取優(yōu)惠券
- 測試CSRF步驟
檢查項目是否對請求頭->HTTP Referer做校驗。后臺判斷是操作請求來源只能是自己的網(wǎng)站。
- 防御
HTTP Referer:請求頭來源的顯示,從哪個點擊鏈接訪問,會記錄鏈接訪問的地址。
網(wǎng)絡安全
協(xié)議加密
數(shù)據(jù)加密
數(shù)據(jù)簽名
DOS攻擊
- 協(xié)議加密:常用HTTPS協(xié)議(基于HTTP協(xié)議之上進行加密傳輸和證書策略)
1、數(shù)據(jù)完整性
2、數(shù)據(jù)保密性
3、安全校驗
- 數(shù)據(jù)加密
數(shù)據(jù)加密:md5/AES/DES/自定義
- 數(shù)據(jù)簽名
特點:對請求數(shù)據(jù)生成一個無法偽造的字符串,發(fā)送給服務器。
- Dos攻擊
目的:讓目標計算機或網(wǎng)絡無法提供正常的服務或資源訪問,使目標系統(tǒng)停止響應甚至崩潰。
防御:
1、請求添加訪問時間戳,服務器進行判斷是否在有效期內(nèi),如果在處理,否則不處理。
2、指定時間內(nèi)控制請求參數(shù)(百度->1秒之內(nèi)3次)
3、流量限制(驗證碼->越模糊越好)
用戶安全策略
密碼登錄:①:session②:token
其他登錄
- 密碼
提示:
1、密碼純6位數(shù)字,有10**6
2、密碼純8位數(shù)字,有10**8
-
session
- 說明:密碼登錄成功后,服務器可以生成session|token|cookie等認證方式來進行后續(xù)認證處理。
- 特點:session:一次會話(會話結束session關閉)
- 危害:如果在session會話有效期內(nèi),session被盜取,那么后果是很可怕的(相當于賬號密碼泄露)
- 防護策略:
- 在一定時間后后臺關閉session
- 相同用戶只能生成1個對象
- 當用戶客戶端發(fā)生變化(瀏覽器、ip發(fā)生改變)時,要求用戶重新登錄
- 養(yǎng)成好的習慣,用戶退出后,及時清除session信息
其他登錄策略
- 多因素策略
提示:多因素策略一般根據(jù)項目類型來定
暴力破解
- 說明:理論來說,是密碼就一定可以通過多次嘗試來進行破譯,這種稱為暴力破解。
- 提示:暴力破解一般使用密碼字典結合自動化程序來實施。
- 防護:
權限安全漏洞
-
危害:容易出現(xiàn)越權操作(查看別人信息、刪除他人的信息、查看核心數(shù)據(jù))
-
分類
?
提示:權限漏洞主要驗證垂直權限(基于用戶角色設置權限),水平權限暫時無法驗證
- 越權示例:
張三刪除李四的留言信息
- 防護
服務端在執(zhí)行操作之前,需要驗證權限。
應用服務器安全
- 安全漏洞分類
1、SQL注入(項目數(shù)據(jù)庫)
2、文件上傳(針對應用服務器代碼)
SQL注入
- 說明:sql注入,顧名思義就是通過頁面輸入sql語句,達到特定的目的
- 危害:數(shù)據(jù)庫丟失,意味攻擊者可以用任何人的賬號進行違規(guī)操作
- 原理:
- 攻擊步驟
1、在頁面輸入框中查找注入點
2、注入sql語句
3、通過sql語句獲取項目庫名、表名、字段名
4、通過Mysql數(shù)據(jù)庫自己的庫,獲取項目庫中所有的表、字段、數(shù)據(jù)
- 安全測試(sql注入),查找注入點
1、方式1:手動,在輸入框中輸入',看提示信息。如果提示相關sql報錯信息且是語句拼接方式,說明可以sql注入
2、方式2:使用專業(yè)的工具進行掃描
- sql注入防護
1、對用戶的輸入數(shù)據(jù)進行校驗
2、不要動態(tài)拼接SQL,使用參數(shù)化語句
3、不要使用管理員權限的數(shù)據(jù)庫連接,為每個應用使用單獨的權限進行數(shù)據(jù)庫連接
4、不要把敏感數(shù)據(jù)直接保存到數(shù)據(jù)庫中
5、應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。
應用服務器(文件上傳漏洞)
- 危害: 獲取正向web項目的目錄和文件(源代碼暴露)
- 原理:
- 1、利用上傳功能,上傳惡意文件
- 2、執(zhí)行惡意文件
- 3、獲取項目源代碼
- 防護:
數(shù)據(jù)庫安全
- 安全防護策略
數(shù)據(jù)庫備份和恢復
敏感數(shù)據(jù)加密
審計追蹤機制
認證和權限控制
- 數(shù)據(jù)備份和恢復
數(shù)據(jù)庫必須有備份,正常1天1個備份
- 敏感數(shù)據(jù)加密
用戶數(shù)據(jù)在傳輸和存儲過程都需要進行加密
- 審計追蹤機制
對數(shù)據(jù)庫操作,尤其是(刪除、修改、新增)操作,必須有日志記錄
- 認證和權限控制
不能給root權限
文件操作必須有權限控制
接口加解密
- 加解密說明
- 思考?如果要對加解密怎么做?
1、找開發(fā)拷貝加密和解密工作
2、確定工具如何使用(如何加密、如何解密)
3、明確請求示例(請求參數(shù)格式及使用)
接口-案例
- 案例
接口說明:登錄接口
請求方法:POST
請求參數(shù)類型:form
url:"http://mobile-p2p-test.itheima.net/phone/member/login"
請求參數(shù)
data={
"member_name":"13012345678",
"password":"test123"
}
- 未加密解密
import requests
url="http://mobile-p2p-test.itheima.net/phone/member/login"
data={"member_name":"13012345678","password":"test123"
}
result=requests.post(url,data=data)
print(result.json())
加解密應用示例
- 步驟
1、找開發(fā)拷貝加密和解密工作
2、確定工具如何使用(如何加密、如何解密)
3、明確請求示例(請求參數(shù)格式及使用)
- 1、加解密工具
- 2、確定工具如何使用
- 3、明確請求示例
- 加解密應用示例:
import requests
from EncryptUtil import EncryptUtil
url="http://mobile-p2p-test.itheima.net/phone/member/login"
data={"member_name":"13012345678","password":"test123"
}
# 1、對請求參數(shù)進行加密
diyou =EncryptUtil.get_diyou(data)
# 2、對加密后的數(shù)據(jù)進行簽名
xmdy = EncryptUtil.get_xmdy(diyou)
# 3、調(diào)用請求 參數(shù)格式("xmdy":"簽名","diyou":"加密后的數(shù)據(jù)")
result=requests.post(url,data={"xmdy":xmdy,"diyou":diyou})
# 4、響應數(shù)據(jù)解密
diyou =result.json().get("diyou")
print("--" * 50)
print("解密后的數(shù)據(jù)",EncryptUtil.aes_decrypt(diyou))
- EncryptUtil.py
import base64
import hashlib
import json
import refrom Crypto.Cipher import AES# 加解密工具類
class EncryptUtil:# 發(fā)送請求時,加密密碼SEND_AES_KEY = ";3jm$>/p-ED^cVz_j~.KV&V)k9jn,UAH"# 發(fā)送請求時,簽名密鑰SEND_SIGN_KEY = "DY34fdgsWET@#$%wg#@4fgd345sg"# 接收數(shù)據(jù)時,解密密鑰RECEIVE_AES_KEY = "54Ms5bkE6UEdyrRviJ0![OR]g+i79x]k"@staticmethoddef padding_pkcs5(value):BS = AES.block_sizereturn str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))# 替換空字符@staticmethoddef replace_blank(str_data):str_data = re.compile("\t|\r|\n").sub("", str_data)print("replace_blank str_data=", str_data)return str_data@staticmethoddef aes_encrypt(key, data):"""AES加密:param key: 密鑰:param data: 待加密數(shù)據(jù):return: 加密后數(shù)據(jù)"""data = base64.encodebytes(data.encode()).decode()# 替換特殊字符data = EncryptUtil.replace_blank(data)print("data=", data)# 初始化加密器aes = AES.new(key.encode(), AES.MODE_ECB)# 加密padding_value = EncryptUtil.padding_pkcs5(data)encrypt_aes = aes.encrypt(padding_value)# 用base64轉(zhuǎn)成字符串形式encrypted_text = base64.encodebytes(encrypt_aes).decode()return encrypted_text@staticmethoddef aes_decrypt(key, data):"""AES解密:param key: 密鑰:param data: 待解密數(shù)據(jù):return: 解密后數(shù)據(jù)"""# 初始化加密器aes = AES.new(key.encode(), AES.MODE_ECB)# 優(yōu)先逆向解密base64成bytesbase64_decrypted = base64.decodebytes(data.encode())# 執(zhí)行解密decrypted_bytes = base64.decodebytes(aes.decrypt(base64_decrypted))# 轉(zhuǎn)換為字符串decrypted_text = str(decrypted_bytes, encoding="utf-8")# 把Unicode轉(zhuǎn)成中文result = decrypted_text.encode().decode("unicode_escape")return result@staticmethoddef md5value(data):print("md5value data=", data)md5 = hashlib.md5()md5.update(data.encode())return md5.hexdigest()# 加密調(diào)用@staticmethoddef get_diyou(data):# 把字典轉(zhuǎn)換為JSON字符串if isinstance(data, dict):data = json.dumps(data)aes_encrypt_data = EncryptUtil.aes_encrypt(EncryptUtil.SEND_AES_KEY, data)return EncryptUtil.replace_blank(aes_encrypt_data)# 簽名調(diào)用@staticmethoddef get_xmdy(data):return EncryptUtil.md5value(EncryptUtil.SEND_SIGN_KEY + EncryptUtil.replace_blank(data) + EncryptUtil.SEND_SIGN_KEY)# 解密調(diào)用@staticmethoddef decrypt_data(data):return EncryptUtil.aes_decrypt(EncryptUtil.RECEIVE_AES_KEY, data)if __name__ == '__main__':# 加密send_data = {}content = json.dumps(send_data)diyou = EncryptUtil.get_diyou(content)print("diyou=", diyou)xmdy = EncryptUtil.get_xmdy(diyou)print("xmdy=", xmdy)
加密解密標準
- 說明:加密標準常用美國聯(lián)邦政府高級密碼標準(AES)
- 安裝:
pip install pycryptodome==3.9.6 -i https://pypi.douban.com/simple
-
提示:拿到工具如果報錯提示缺少庫,需要跟開發(fā)確定安裝的依賴庫。