神秘的安全测试思考案例(一)
? ? ? ?定義:安全測試是在軟件產品開發基本完成時,驗證產品是否符合安全需求定義和產品質量標準的過程。
概念:安全測試是檢查系統對非法侵入滲透的防范能力。
準則:理論上來講,只要有足夠的時間和資源,沒有無法進入的系統。因此,系統安全設計的準則是使非法侵入的代價超過被保護信息的價值。
目標:通過對系統進行精心、全面的脆弱性安全測試,發現系統未知的安全隱患并提出相關建議,確保系統的安全性。安全性一般分為應用程序級別和系統級別,區別如下:
應用程序級別:包括對應數據或業務功能的訪問,核實應用程序的用戶權限只能操作被授權訪問的那些功能或數據。
系統級別:包括對操作系統的目錄或遠程訪問,主要核實具備系統和應用程序訪問權限的操作者才能訪問系統和應用程序。
?
一、短信驗證碼
1、確保驗證碼與用戶名、密碼是一次性同時提交給服務器進行驗證的,如果分開提交、分開驗證,那么系統存在漏洞
2、在登錄界面單擊右鍵查看HTML 源代碼,如果在HTML 源代碼中可以查看到驗證碼的值,說明系統存在漏洞
3、測試生成的驗證碼的有效次數只為一次,即只要使用該驗證碼登錄過一次后,該驗證碼就失效
4、驗證碼隨機生成規則
5、驗證碼有效時間內使用,失效無法使用
6、對手機號做驗證,正確的手機號才可發短信成功
7、同1個手機號不能連續獲取短信驗證碼,如設置1分鐘僅允許使用1次
8、同1手機號,1天設置最大發送驗證碼次數,如同1手機號1天最多發10條
9、設置每日短信總成功條數上限
10、當同1個手機號碼或者ip重復連續不斷發起請求時,將手機號碼或者ip拉黑處理
?
二、開關
1、功能增加開關,當功能出現嚴重BUG(如刷錢操作)時,關閉功能,避免損失
?
三、支付
昨日有用戶使用時發現,摩拜單車安卓最新版(4.1.0版)出現技術漏洞,用戶充值1元竟被返現110元。無獨有偶,上網搜索看到,發現一漏洞的網友并不在少數,有網友設置截圖顯示,從昨日上午到12:15-13:42,其連續充值7次1塊錢,系統連續7次返值110元,共計返值770元,不過截止到下午14:45分左右,類似情況不再出現
例:充100送120
1、充值時攔截請求,修改充值金額為1元,發出請求,測試服務端是否進行金額校驗
例:購買100元商品
2、余額99,下單購買商品進行支付,攔截請求修改金額為100,發出請求,測試服務端是否進行金額校驗
例:發薪資、提現
3、余額100,發薪資100并發100次,測試加鎖校驗
? ? ?余額100,發薪資100,并發審核100次,測試加鎖校驗
? ? ?余額100,提現100并發100次,測試加鎖校驗
?
四、篡改響應
1、認證成功可獲得積分
輸入任意認證信息,提交成功,抓取接口,攔截響應,修改響應為成功,導致認證成功并獲得積分
?
五、越權
1、登錄權限越權
token失效、賬號被踢出,使用創建訂單、充值、付款功能,對token檢驗進行測試
2、業務邏輯越權
新建的訂單、已付款的訂單、已發貨的訂單、已收貨的訂單、已完成的訂單、已評價的訂單,進行付款操作測試
3、垂直越權未授權的功能
主管有修改權限,客服有查看權限,主管賬號更換為客服賬號,進行修改操作測試
4、水平越權其它用戶資源
通過修改URL鏈接上的參數來進行一些非對應賬號信息的查看和操作。
例1:修改URL上的訂單號為別人的,查看、修改、刪除、評價、操作別人的訂單進行測試
例2:修改URL上的訂單參數為不存在的,查看、修改、刪除、評價、操作別人的訂單進行測試
?
六、敏感數據傳輸
1、登錄密碼、交易密碼是否加密處理傳輸
2、用戶身份證號、銀行卡是否暴露在接口中
?
七、密碼、修改密碼、找回密碼、重置密碼
1、如果為輸入密碼的方式,查看HTML 源代碼,檢查是否存在關于密碼的一些數據
2、重置后的密碼一般通過用戶的郵箱或手機短信來通知用戶
3、修改密碼時是否要求輸入舊密碼,如果不需要用戶填寫舊密碼,說明系統存在缺陷。
4、測試是否可以修改其他用戶密碼,一般只有管理員或有相關權限的用戶可以修改其他用戶密碼
5、如果初始口令為系統提供的默認口令或者是由管理員設定,用戶使用初始口令成功登錄,系統必須強制用戶更改初始口令,直至更改成功,否則存在漏洞
6、修改密碼、找回密碼、重置密碼,需強制踢出用戶
7、密碼輸入錯誤,需限制每日上限次數,達到上限,暫時鎖定,無法使用,過天可恢復正常使用
8、密碼需使用強口令
9、密碼復制粘貼
?
八、SQL、代碼注入
SQL注入漏洞原理
SQL 注入是一種將 SQL 代碼插入或添加到應用(用戶)的輸入參數中,之后再將這些參數傳遞給后臺的 SQL 服務器加以解析并執行的攻擊。
攻擊者能夠修改 SQL 語句,該進程將與執行命令的組件(如數據庫服務器、應用服務器或 WEB 服務器)擁有相同的權限。 如果 WEB
應用開發人員無法確保在將從 WEB 表單、cookie、輸入參數等收到的值傳遞給 SQL查詢(該查詢在數據庫服務器上執行)之前已經對其進行過驗證,通常就會出現 SQL 注入漏洞。
1、登錄注入
賬號登錄時SQL: select * from users where username='wangli' and password='123456'
<1>我們現在需要構建一個比如:在用戶名輸入框中輸入: ’ or 1=1#,密碼隨便輸入111,這時候的合成后SQL語句為:
select * from users where username=' ' or 1=1#' and password='111'
等價于select * from users where username='' or 1=1
等價于select * from users就可以登錄成功了
2、搜索類
<1>搜索姓名,輸入單引號、雙引號,點搜索,系統報錯,證明我們提交數據被系統接收,存在SQL注入漏洞
搜索姓名' 如:wangli'
搜索姓名" 如:wangli"
<2>搜索id=1時,判斷是否存在注入
輸入1查詢成功
輸入1' or '1'='1 、1' or '1'='1' #、1' or 1=1#? 返回多個結果,說明存在字符型注入
輸入1 or 1=1返回多個結果,說明存在數字型注入
輸入1' and '1'='2 查詢失敗
' and 1=2#
3、url傳參注入
字符型注入:
在url后面加單引號、雙引號報錯
接著用 ' and '1'='1,' and '1'='2判斷頁面,或者' and 1=1#,' and 1=2#
首先應測試是否存在注入漏洞,簡單的:’ 或 and 1=1 and 1=2之類的SQL語句。
如果沒有檢測,直接運行SQL語句,說明有機會注入。
舉例:
從參數注入,簡單的測試方法是:
http://www.xxx.com/index.php?id=2'
http://www.xxx.com/index.php?id=2' and 1=1
http://www.xxx.com/index.php?id=2' and 1=2
4、代碼注入
1、提交死循環代碼,測試是否進行過濾處理
<script>
?for(i=0;i<1;i--)
?{
?alert("msg")
?}
?</script>
<input type="text"/>
<input/>
<input/?
<script>alert('hello');</script>
1.jpg" οnmοuseοver="alert('xss')
"></a><script>alert(‘xss’);</script>
http://xxx';alert('xss');var/ a='a
‘”>xss&<
a=”\” ; b=”;alert(/xss/);//”
<img src=“輸出內容” border=“0” alt=“logo” />
2、輸入<html”>”gfhd</html>,看是否出錯;
3、輸入<input type=”text” name=”user”/>,看是否出現文本框;
4、輸入<script type=”text/javascript”>alert(“提示”)</script>看是否出現提示。
5、輸入特殊字符 如:~!@#$%^&*()_+<>:”{}|
6、輸入超大數9999999999,超長字符、0、null、NULL、負數
?
5、枚舉查詢表列數(order by)
搜索框輸入' order by 10?#
構造出SQL為select * from user where mobile=''? order by 10 # '
select * from user where mobile='正確的手機號'? order by 10 # '
如果10報錯[Err] 1054 - Unknown column '10' in 'order clause',說明列不足10個,依次向前實驗
如果9時不報錯,說明有9列
?
總結與主流防御
1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號、雙"--"、#、恒等進行轉換等。
2.永遠不要使用動態拼裝SQL,可以使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
4.不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息存放在獨立的表中
6、過濾關鍵字,對一些sql語句中可能出現的關鍵詞進行過濾
7、編碼/轉移特殊符號,對用戶輸入的進行編碼或轉義,使其無法產生原有效果
8、語義分析攔截,對用戶輸入進行判斷,保證不存在于任意可執行的sql語句的片段中
?
?
總結
以上是生活随笔為你收集整理的神秘的安全测试思考案例(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析python类继承(一)
- 下一篇: python list,str的拼接与转