安全測(cè)試實(shí)踐

此文章記錄我在平時(shí)做功能測(cè)試(故事卡測(cè)試)時(shí),在安全方面有哪些設(shè)計(jì)和執(zhí)行來(lái)覆蓋最常見(jiàn)的一些安全漏洞

XSS(cross site scripting)

如何測(cè)試

“XSS是跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫(xiě)混淆,故將跨站腳本攻擊縮寫(xiě)為XSS。惡意攻擊者往Web頁(yè)面里插入惡意Script代碼,當(dāng)用戶(hù)瀏覽該頁(yè)之時(shí),嵌入其中Web里面的Script代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶(hù)的目的。”

推薦下面的方法進(jìn)行測(cè)試

  1. 手工測(cè)試。對(duì)支持用戶(hù)動(dòng)態(tài)輸入的數(shù)據(jù)使用下列語(yǔ)句進(jìn)行攻擊
  • <script>alert(“hey!you are attacked”)</script>
  • <script>window.location.;</script>
  • <sCript>alert("hey!")</scRipt> 如果網(wǎng)站僅僅只過(guò)濾了<script>標(biāo)簽,就可以用大小寫(xiě)繞過(guò)
  • <sCri<script>pt>alert("hey!")</scRi</script>pt> 如果網(wǎng)站只過(guò)濾了一個(gè)script標(biāo)簽,就可以利用過(guò)濾后返回語(yǔ)句再次構(gòu)成攻擊語(yǔ)句來(lái)繞過(guò)
  • <script>eval(\u0061\u006c\u0065\u0072\u0074(1))</script> alert(1) 有的時(shí)候,服務(wù)器往往會(huì)對(duì)代碼中的關(guān)鍵字(如alert)進(jìn)行過(guò)濾,這個(gè)時(shí)候我們可以嘗試將關(guān)鍵字進(jìn)行編碼后再插入,不過(guò)直接顯示編碼是不能被瀏覽器執(zhí)行的,我們可以用另一個(gè)語(yǔ)句eval()來(lái)實(shí)現(xiàn)。eval()會(huì)將編碼過(guò)的語(yǔ)句解碼后再執(zhí)行
  • <img src='w.123' onerror='alert("hey!")'> <a onmousemove=’do something here’> <div onmouseover=‘do something here’> 并不是只有script標(biāo)簽才可以插入代碼
如何修復(fù)和預(yù)防
  • 首先是過(guò)濾。對(duì)諸如<script>、<img>、<a>等標(biāo)簽進(jìn)行過(guò)濾。
  • 其次是編碼。像一些常見(jiàn)的符號(hào),如<>在輸入的時(shí)候要對(duì)其進(jìn)行轉(zhuǎn)換編碼,這樣做瀏覽器是不會(huì)對(duì)該標(biāo)簽進(jìn)行解釋執(zhí)行的,同時(shí)也不影響顯示效果。
  • 最后是限制。通過(guò)以上的案例我們不難發(fā)現(xiàn)xss攻擊要能達(dá)成往往需要較長(zhǎng)的字符串,因此對(duì)于一些可以預(yù)期的輸入可以通過(guò)限制長(zhǎng)度強(qiáng)制截?cái)鄟?lái)進(jìn)行防御。輸入檢查還有包含敏感詞和特殊字符等。對(duì)于cookie設(shè)置httpOnly屬性,這樣js是無(wú)法讀取

SQL注入(SQL injection)

如何測(cè)試

SQL注入需要輸入含有惡意的SQL語(yǔ)句帶入數(shù)據(jù)庫(kù)執(zhí)行,通過(guò)這個(gè)惡意的SQL語(yǔ)句,獲取表數(shù)據(jù)以及對(duì)數(shù)據(jù)增查改刪,因?yàn)镾QL注入漏洞的危害是極大的。 推薦下面二種方法進(jìn)行測(cè)試

第一種 手工測(cè)試
如何判斷SQL注入是否存在--> 最為經(jīng)典的單引號(hào)判斷法:在參數(shù)后面加上單引號(hào),比如: http://xxx/abc.php?id=1' 如果頁(yè)面返回錯(cuò)誤,則存在 Sql 注入。原因是無(wú)論字符型還是整型都會(huì)因?yàn)閱我?hào)個(gè)數(shù)不匹配而報(bào)錯(cuò)。

判斷注入漏洞類(lèi)型總結(jié)如下

1.對(duì)于數(shù)字 使用 100 判斷查詢(xún)正常, 100 and 1=1 判斷查詢(xún)正常, 100' 判斷頁(yè)面異常或是查詢(xún)?yōu)榭眨?100 and 1=2 查詢(xún)數(shù)據(jù)為空
2.對(duì)于字符串 使用 x 判斷查詢(xún)正常, x' and '1'='1 判斷查詢(xún)正常, x' 判斷頁(yè)面異?;蚴遣樵?xún)?yōu)榭眨?x' and '1'='2 查詢(xún)數(shù)據(jù)為空
3.對(duì)于搜索 使用 x 判斷查詢(xún)正常, x%' and '%'=' 判斷查詢(xún)正常, x' 判斷頁(yè)面異?;蚴遣樵?xún)?yōu)榭眨?x%' and 'a%'='b 查詢(xún)數(shù)據(jù)為空

通過(guò)上面的方式可以確定SQL注入是否存在,存在之后,就可以結(jié)合其他sql語(yǔ)句進(jìn)行攻擊。對(duì)于我們測(cè)試人員,在已知數(shù)據(jù)庫(kù)結(jié)構(gòu)和數(shù)據(jù)的情況下,就非常簡(jiǎn)單了,比如使用 union select 聯(lián)合查詢(xún)繼續(xù)獲取信息
1' order by 1#;(按照Mysql語(yǔ)法,#后面會(huì)被注釋掉,使用這種方法屏蔽掉后面的單引號(hào),避免語(yǔ)法錯(cuò)誤) 不斷增加 order by 后面的數(shù)字會(huì)判斷出有多少列

  • 輸入1' union select database(),user()# 就等于SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#;database()將會(huì)返回當(dāng)前網(wǎng)站所使用的數(shù)據(jù)庫(kù)名字. user()將會(huì)返回執(zhí)行當(dāng)前查詢(xún)的用戶(hù)名. 類(lèi)似地還有1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#` information_schema是mysql自帶的一張表,這張數(shù)據(jù)表保存了Mysql服務(wù)器所有數(shù)據(jù)庫(kù)的信息,如數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)的表,表欄的數(shù)據(jù)類(lèi)型與訪問(wèn)權(quán)限等

第二種 使用工具sqlmap

sqlmap 是一個(gè)開(kāi)源的滲透測(cè)試工具,可以用來(lái)自動(dòng)化的檢測(cè),利用SQL注入漏洞,獲取數(shù)據(jù)庫(kù)服務(wù)器的權(quán)限。它具有功能強(qiáng)大的檢測(cè)引擎,針對(duì)各種不同類(lèi)型數(shù)據(jù)庫(kù)的滲透測(cè)試的功能選項(xiàng),包括獲取數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),訪問(wèn)操作系統(tǒng)文件甚至可以通過(guò)外帶數(shù)據(jù)連接的方式執(zhí)行操作系統(tǒng)命令。

基本命令

  • python sqlmap.py -u 'http://mytestsite.com/page.php?id=5' sqlmap會(huì)對(duì)id參數(shù)使用不同的注入方法進(jìn)行測(cè)試,檢查是否有漏洞
  • python sqlmap.py -u 'http://mytestsite.com/page.php?id=5' --dbs 獲取數(shù)據(jù)庫(kù)信息
  • python.exe sqlmap/sqlmap.py -u http://aa.com/wcms/show.php?id=3 -D cms -T cms_users -C username,password --dump 指定庫(kù)名表名字段列出指定字段

可以參考的資料

一般推薦使用sqlmap進(jìn)行測(cè)試。

如何修復(fù)和預(yù)防
  1. 當(dāng)操作數(shù)據(jù)庫(kù)時(shí),需要實(shí)現(xiàn)PreparementStatement接口對(duì)SQL語(yǔ)句進(jìn)行預(yù)編譯處理。這種采用sql語(yǔ)句預(yù)編譯和綁定變量,是防御sql注入的最佳方法。其原因就是:采用了PreparedStatement,就會(huì)將sql語(yǔ)句:”select id, no from user where id=?” 預(yù)先編譯好,也就是SQL引擎會(huì)預(yù)先進(jìn)行語(yǔ)法分析,產(chǎn)生語(yǔ)法樹(shù),生成執(zhí)行計(jì)劃,也就是說(shuō),后面你輸入的參數(shù),無(wú)論你輸入的是什么,都不會(huì)影響該sql語(yǔ)句的語(yǔ)法結(jié)構(gòu)了,因?yàn)檎Z(yǔ)法分析已經(jīng)完成了,而語(yǔ)法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面輸入了這些sql命令,也不會(huì)被當(dāng)成sql命令來(lái)執(zhí)行了,因?yàn)檫@些sql命令的執(zhí)行, 必須先的通過(guò)語(yǔ)法分析,生成執(zhí)行計(jì)劃,既然語(yǔ)法分析已經(jīng)完成,已經(jīng)預(yù)編譯過(guò)了,那么后面輸入的參數(shù),是絕對(duì)不可能作為sql命令來(lái)執(zhí)行的,只會(huì)被當(dāng)做字符串字面值參數(shù)。所以sql語(yǔ)句預(yù)編譯可以防御sql注入。實(shí)際項(xiàng)目中,一般我們都是采用各種的框架,比如ibatis, hibernate,mybatis等等。他們一般也默認(rèn)就是sql預(yù)編譯的
  2. 如果必須要用字符串拼接,也可以對(duì)輸入?yún)?shù)進(jìn)行數(shù)據(jù)類(lèi)型檢查
  3. 可以使用一些安全函數(shù) ESAPI.encoder().encodeForSQL

權(quán)限管理

如何測(cè)試
  • 越權(quán) - 不同的用戶(hù)應(yīng)該有嚴(yán)格的權(quán)限管理,不被允許的資源就應(yīng)該有相應(yīng)的處理,比如通過(guò)URL訪問(wèn)不屬于自己權(quán)限內(nèi)的資源,就應(yīng)該進(jìn)入相應(yīng)報(bào)錯(cuò)頁(yè)面。一般這類(lèi)處理都應(yīng)該在需求階段提出。越權(quán)一般分為水平越權(quán)和垂直越權(quán)。水平越權(quán)指得是同級(jí)別用戶(hù)的越權(quán),垂直越權(quán)指得是具有從屬關(guān)系,從而帶來(lái)不同權(quán)限范圍的用戶(hù)的越權(quán)

敏感數(shù)據(jù)

如何測(cè)試
  • 如果項(xiàng)目需求涉及圖片上傳,取名等時(shí),我們就應(yīng)該考慮對(duì)文字和圖片進(jìn)行風(fēng)險(xiǎn)控制,避免涉及暴力、政治和色情等不良信息在系統(tǒng)中存儲(chǔ)使用。一般做法是對(duì)接第三方平臺(tái)進(jìn)行驗(yàn)證
  • 如果項(xiàng)目中有涉及用戶(hù)密碼等隱私數(shù)據(jù),我們就應(yīng)該采用加密存儲(chǔ),不允許明文傳輸和存儲(chǔ)
  • 項(xiàng)目中的日志不允許明文顯示敏感數(shù)據(jù)

其他測(cè)試點(diǎn)

  • 修改URL的參數(shù)
  • 修改cookie中的數(shù)據(jù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容