<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          安全測(cè)試須知的TOP20漏洞編碼安全規(guī)范

          共 7031字,需瀏覽 15分鐘

           ·

          2021-10-13 08:12

          1.SQL注入

          ??風(fēng)險(xiǎn)描述

          SQL注入主要發(fā)生在應(yīng)用程序數(shù)據(jù)庫層面上。程序員在設(shè)計(jì)程序的時(shí)候,沒有對(duì)用戶的輸入進(jìn)行校驗(yàn),含有特殊字符語句會(huì)被數(shù)據(jù)庫誤認(rèn)為是正常的SQL指令而運(yùn)行,從而使數(shù)據(jù)庫受到攻擊,可能導(dǎo)致數(shù)據(jù)被竊取、更改、刪除,以及進(jìn)一步導(dǎo)致網(wǎng)站被嵌入惡意代碼、被植入后門程序等危害。?

          ??特殊字符

          對(duì)SQL注入而言,特殊字符包括但不限于 (注意大小寫繞過以及雙寫繞過):

          “--,#,//(注釋符)”、“ and”、“ or”、“ select”、“ update”、“ delete”、“ drop”、“ declare”、“ insert”、“ xp_shell”以及(,)括號(hào)、||,+, (空格)連接符、' 單引號(hào)、|(豎線符號(hào))、& (& 符號(hào))、;(分號(hào))、$(美元符號(hào))、%(百分比符號(hào))、@(at 符號(hào))、'(單引號(hào))、"(引號(hào))、\'(反斜杠轉(zhuǎn)義單引號(hào))、\"(反斜杠轉(zhuǎn)義引號(hào))、<>(尖括號(hào))、CR(回車符,ASCII 0x0d)、LF(換行,ASCII 0x0a)、,(逗號(hào))、\(反斜杠)等。

          ??漏洞示例

          其中request.getParameter("searchWord")中的參數(shù)“searchWord”是從前端獲取到的,也就是jsp頁面中input標(biāo)簽中id為“searchWord”的值,如下:

          后臺(tái)SQL語句是以拼接的形式執(zhí)行,代碼所示:

          SQL語句一旦以拼接的方式執(zhí)行,那么拼接的“word”?不僅僅是作為一個(gè)參數(shù)執(zhí)行,還可以表示一個(gè)SQL語句,比如:word的值為1,那么SQL語句變成:Select * from test where id = 1;如果word的值為1’ and ‘a(chǎn)’=’a,而系統(tǒng)未對(duì)傳入后臺(tái)的參數(shù)做任何特殊字符過濾,或者字符過濾不全,那么SQL語句變成:Select * from test where id = 1’ and ‘a(chǎn)’=’a。兩條查詢語句都能成功執(zhí)行。如果這時(shí)候?qū)nd后面的字句換成union或者order by語句就能將數(shù)據(jù)庫名、表名以及表中的數(shù)據(jù)查詢出來。

          ??規(guī)范要求

          1、添加全局過濾器,過濾特殊字符。方式如下:

          Web.xml    SQLFilter    < filter -class>*.SQLFilte       SQLFilter      /*   攔截所有請(qǐng)求

          在SQLFilter.java類中:

          paramValue= paramValue.replaceAll(“>”, “”)paramValue= paramValue.replaceAll(“%”,“”)


          2、SQL語句使用參數(shù)化查詢方式,代碼如下:

          String sql=“select * from test where id=?”;db=new DBHelper(sql);     try{          db.stmt.setString(1,word);          ret=db.stmt.executeQuery();          while(ret.next()){……}}


          2.跨站腳本攻擊(XSS)

          ??風(fēng)險(xiǎn)描述

          跨站攻擊是因?yàn)榫W(wǎng)站程序?qū)τ脩糨斎脒^濾不足,將用戶輸入的惡意腳本代碼正常執(zhí)行或者提交。攻擊者可利用XSS漏洞獲取用戶cookie值、傳播蠕蟲、篡改頁面或進(jìn)行釣魚等攻擊。

          ??特殊字符

          對(duì)XSS而言,特殊字符包括但不限于 (注意大小寫繞過以及雙寫繞過):

          |(豎線符號(hào))、& (& 符號(hào))、?;(分號(hào))、$(美元符號(hào))、%(百分比符號(hào))、@(at 符號(hào))、'(單引號(hào))、"(引號(hào))、\'(反斜杠轉(zhuǎn)義單引號(hào))、\"(反斜杠轉(zhuǎn)義引號(hào))、<>(尖括號(hào))、()(括號(hào))、+(加號(hào))、CR(回車符,ASCII 0x0d)、LF(換行,ASCII 0x0a)、,(逗號(hào))、\(反斜杠)、eval方法以及關(guān)鍵字document、cookie、javascript、script、onerror等。

          ??漏洞示例

          搜索框種的值即為可控參數(shù),在URL中表現(xiàn)形式為:

          http://.../searchword?word=

          相關(guān)代碼如下:

          此處參數(shù)在前端為EL表達(dá)式獲取,并且為添加任何過濾,最后直接顯示在頁面。當(dāng)輸入框輸入的參數(shù)為: 時(shí),就會(huì)直接被瀏覽器當(dāng)作腳本執(zhí)行并彈框:

          其中URL的表現(xiàn)形式:

          http://.../searchword?word=%3Cscript%3Ealert%281%29%3C%2FscriFs%3E

          上面的示例是直接與頁面交互,通過在URL中構(gòu)造參數(shù)來實(shí)現(xiàn)XSS攻擊。還有一種是將參數(shù)進(jìn)行傳遞并最終存儲(chǔ)到數(shù)據(jù)庫當(dāng)中,因?yàn)閰?shù)在傳遞過程中未經(jīng)過任何有效過濾(或者存在過濾不全,會(huì)被繞過),作為可信資源存入到數(shù)據(jù)庫中并最終被執(zhí)行。代碼如下:


          在前端頁面會(huì)顯示用戶存儲(chǔ)的數(shù)據(jù),并且未做任何輸出過濾(或者過濾不全),頁面和代碼如下:

          前端的頁面結(jié)構(gòu)如下:

          如果在編輯用戶信息的時(shí)候輸入:

          在數(shù)據(jù)庫中的存儲(chǔ)形式為:

          在查詢的時(shí)候就會(huì)將相應(yīng)的數(shù)據(jù)顯示在頁面,并執(zhí)行腳本:

          ??規(guī)范要求

          1、添加全局過濾器,過濾特殊字符。方式如下:

          Web.xml    XSSFilter    < filter -class>*.XSSFilte       XSSFilter      /*   攔截所有請(qǐng)求

          在XSSFilter.java類中:

          paramValue= paramValue.replaceAll(“>”, “”)paramValue= paramValue.replaceAll(“%”,“”)


          2、輸出編碼,編碼就是讓解析者知道數(shù)據(jù)不是用來執(zhí)行的代碼,從而可以避免受攻擊。主要包括3種編碼:URL編碼、HTML編碼、JavaScript編碼。對(duì)于不可信來源的數(shù)據(jù)需要執(zhí)行輸出編碼,確保字符被視為數(shù)據(jù),根據(jù)場(chǎng)景分別使用以上1種編碼或多種編碼組合。


          3.任意文件下載

          ??風(fēng)險(xiǎn)描述

          網(wǎng)站在處理用戶下載文件的請(qǐng)求時(shí),允許用戶提交任意文件路徑,并把服務(wù)器上對(duì)應(yīng)的文件直接發(fā)送給用戶,這將造成任意文件下載威脅。如果服務(wù)器根據(jù)用戶提交的目錄地址,就把目錄下的文件列表發(fā)給用戶,會(huì)造成目錄遍歷安全威脅。惡意用戶會(huì)變換目錄或文件地址,下載服務(wù)器上的敏感文件、數(shù)據(jù)庫鏈接配置文件、網(wǎng)站源代碼等。

          ??系統(tǒng)敏感文件

          Linux操作系統(tǒng):/root/.ssh/authorized_keys、?/root/.ssh/id_rsa

          /root/.ssh/id_ras.keystore、?/root/.ssh/known_hosts、?/etc/httpd/conf/httpd.conf

          /root/.bash_history、/root/.mysql_history、/proc/self/fd/fd[0-9]*(文件標(biāo)識(shí)符)

          /proc/mounts、/porc/config.gz、/etc/passwd、/etc/shadow、/etc/my.cnf

          Windows操作系統(tǒng):C:\Program Files\mysql\my.ini ?//Mysql配置、

          C:\Program Files\mysql\data\mysql\user.MYD ?//Mysql root

          C:\Windows\php.ini ?//php配置信息

          C:\Windows\my.ini ?//Mysql配置信息、C:\boot.ini ?//查看系統(tǒng)版本

          C:\Windows\System32\inetsrv\MetaBase.xml ?//IIS配置文件

          C:\Windows\repair\sam ?//存儲(chǔ)系統(tǒng)初次安裝的密碼

          ????...

          ??漏洞示例

          存在下載功能的頁面

          Url表現(xiàn)形式如下:

          http://.../downloadFile.action?jpgPath=/download/&jpgName=test.jpg

          在代碼中的表現(xiàn)形式如下,文件路徑和文件名都是從前端獲取,然后執(zhí)行下載操作:

          具體下載功能代碼如下:

          當(dāng)文件正常下載時(shí),通過brupsuite截圖如下:

          在此處直接替換文件名為“WEB-INF/web.xml”,嘗試下載系統(tǒng)配置文件:

          可以看到下載文件失敗,返回不一樣的結(jié)果。但是可以通過添加“../”進(jìn)行目錄跳轉(zhuǎn):

          可以看出上面返回了web.xml內(nèi)容,表示已經(jīng)下載成功。

          ??規(guī)范要求

          1、文件下載時(shí)進(jìn)行過濾,過濾掉?“./”、“../”、“%”等,代碼如下:

          當(dāng)輸入“../”時(shí):

          2、對(duì)下載的文件路徑進(jìn)行嚴(yán)格控制,只允許下載某部分目錄下的文件:

          3、對(duì)下載文件后綴名做嚴(yán)格控制:

          4、下載文件之前做權(quán)限判斷,判斷用戶是否有下載該文件的權(quán)限。可建立文件白名單,不屬于白名單內(nèi),不允許下載。

          5、使用ID替換文件夾和文件名,使得整個(gè)輸入由路徑名變?yōu)橐粋€(gè)表示ID的字符串,這種方法很容易驗(yàn)證它的有效性。


          4.任意文件上傳

          ??風(fēng)險(xiǎn)描述

          應(yīng)用程序在處理用戶上傳的文件時(shí),沒有判斷文件是否在允許的范圍內(nèi),就把文件保存在服務(wù)器上,導(dǎo)致惡意用戶可以上傳任意文件,甚至上傳腳本木馬到服務(wù)器上,直接控制服務(wù)器。文件上傳漏洞的利用是有限制條件的,首先要能夠成功上傳木馬文件,其次上傳的木馬文件能夠被執(zhí)行,最后就是上傳文件的路徑必須可知。

          ??漏洞示例

          服務(wù)器端代碼:

          可以看到,服務(wù)器對(duì)上傳文件的類型、內(nèi)容沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞。上傳文件hack.php(一句話木馬):

          上傳成功,并且返回了上傳路徑:

          通過菜刀連接:

          連接成功后,就可以在服務(wù)器上執(zhí)行任意命令,獲取webshell權(quán)限。可以下載、修改服務(wù)器的所有文件。

          ??規(guī)范要求

          1、對(duì)上傳文件的類型進(jìn)行檢測(cè),設(shè)置白名單進(jìn)行過濾。(建議禁止上傳jsp、jspx、php、asp、aspx等格式的文件)。

          2、對(duì)上傳文件的內(nèi)容及大小進(jìn)行檢測(cè),代碼如下:

          在這里,代碼對(duì)上傳文件的類型、大小做了限制。


          5.越權(quán)操作

          ??風(fēng)險(xiǎn)描述

          如果一個(gè)Web應(yīng)用程序不正確檢查用戶是否被授權(quán)訪問的特定的資源,就有可能導(dǎo)致產(chǎn)生越權(quán)漏洞。例如帳號(hào)A在登錄的狀態(tài)下,遍歷訪問請(qǐng)求中的ID就可以查看其它人的相關(guān)信息。甚至普通權(quán)限的用戶可以通過越權(quán)獲取到管理員的權(quán)限,從而可以訪問本部屬于自己權(quán)限的數(shù)據(jù)或頁面。

          ??漏洞示例

          在test001賬號(hào)訪問的頁面URL中直接將參數(shù)art=4改成art=6,則test001賬號(hào)就可以訪問原本只能被test002號(hào)訪問的數(shù)據(jù),如下所示:

          相關(guān)代碼如下:

          在上面的代碼中,沒有判斷用戶的Session值,導(dǎo)致通過修改art的值就可以遍歷訪問其他的信息。

          ??規(guī)范要求

          1、驗(yàn)證一切來自客戶端的參數(shù),特別是和權(quán)限相關(guān)的參數(shù),如用戶ID或角色I(xiàn)D等。

          2、在進(jìn)行增、刪、改、查等操作時(shí),需將sessionID和認(rèn)證的token綁定,存放在服務(wù)器的會(huì)話里,不要相信任何客戶端發(fā)來的認(rèn)證和授權(quán)信息,包括消息頭、Cookie、隱藏的表單或者URL參數(shù)。下面時(shí)修復(fù)后的代碼:

          在修復(fù)后的代碼中,首先會(huì)判斷用戶的Session,只有在Session為True的情況下才能夠查看返回的信息,因此當(dāng)用戶遍歷art的值來嘗試訪問其他人的信息時(shí),會(huì)提示無權(quán)訪問。


          6.緩存區(qū)溢出

          ??風(fēng)險(xiǎn)描述

          緩存區(qū)溢出主要出現(xiàn)在C/C++當(dāng)中,是一種非常普遍、非常危險(xiǎn)的漏洞。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)宕機(jī)、重新啟動(dòng)等后果。更為嚴(yán)重的是,可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作。

          ??漏洞示例

          在代碼100行處,數(shù)組在復(fù)制過程中,后面一個(gè)數(shù)組的長(zhǎng)度是前一個(gè)數(shù)組的兩倍,當(dāng)需要復(fù)制的數(shù)據(jù)超過第一個(gè)數(shù)組的數(shù)組長(zhǎng)度時(shí),對(duì)數(shù)組完成復(fù)制后,由于數(shù)組沒有結(jié)束標(biāo)識(shí),讀取數(shù)組數(shù)據(jù)時(shí)存在內(nèi)存溢出的可能性。

          在代碼3278、3283行處,使用strncpy復(fù)制時(shí)只是復(fù)制了一個(gè)字節(jié),而數(shù)組沒有經(jīng)過初始化,且最后也沒有對(duì)數(shù)組做結(jié)束標(biāo)識(shí)處理,在直接讀取數(shù)組時(shí),可能會(huì)造成內(nèi)存溢出。

          ??規(guī)范要求

          1、對(duì)傳遞的數(shù)據(jù)進(jìn)行類型/大小/長(zhǎng)度的檢驗(yàn)。

          2、過濾風(fēng)險(xiǎn)數(shù)據(jù)。

          3、初始化參數(shù)。


          7.URL跳轉(zhuǎn)

          ??風(fēng)險(xiǎn)描述

          應(yīng)用程序接收到用戶提交的URL參數(shù)后,沒有對(duì)參數(shù)做“可信任URL”的驗(yàn)證,就向用戶瀏覽器返回跳轉(zhuǎn)到該URL的指令。惡意攻擊者可以發(fā)送給用戶一個(gè)鏈接,但是用戶打開后,卻來到釣魚網(wǎng)站頁面,將會(huì)導(dǎo)致用戶被釣魚攻擊,賬號(hào)被盜,或賬號(hào)相關(guān)財(cái)產(chǎn)被盜。

          ??漏洞示例

          跳轉(zhuǎn)代碼:response.sendRedirect(request.getParameter("url"));

          某應(yīng)用程序有一個(gè)名為“redirect.jsp”的頁面,該頁面的參數(shù)為“url”,攻擊者精心構(gòu)造一個(gè)鏈接將用戶重定向到一個(gè)惡意網(wǎng)站,執(zhí)行釣魚攻擊并安裝惡意程序。

          http://www.example.com/redirect.jsp?url=evil.com

          ??規(guī)范要求

          1、輸入驗(yàn)證,對(duì)跳轉(zhuǎn)的URL進(jìn)行驗(yàn)證,對(duì)于不合法的跳轉(zhuǎn)URL拒絕跳轉(zhuǎn)訪問。可通過白名單進(jìn)行驗(yàn)證。

          2、如果在本網(wǎng)站內(nèi)跳轉(zhuǎn),則使用相對(duì)路徑,而不要使用絕對(duì)路徑,如在URL的參數(shù)中使用了絕對(duì)路徑,建議在代碼里剝離URL中域名部分,然后再和網(wǎng)站的域名重新結(jié)合成絕對(duì)路徑,再跳轉(zhuǎn)。

          3、如果請(qǐng)求允許跳轉(zhuǎn)的對(duì)象只是限制在有限的范圍內(nèi),可創(chuàng)建一個(gè)匹配的規(guī)則,通過數(shù)字類型的ID來代替跳轉(zhuǎn)到具體的頁面。

          4、僅傳遞一個(gè)回調(diào)url作為參數(shù)是不安全的,增加一個(gè)參數(shù)簽名,保證回調(diào)url不被修改,在控制頁面轉(zhuǎn)向的地方校驗(yàn)傳入的URL是否為公司域名(或者其他可信域名)

          如以下是一段校驗(yàn)是否公司域名的JS函數(shù)

          function VaildURL(sUrl){ return (/^(https?:\/\/)?[\w\-.]+\.(qq|paipai|soso|taotao)\.com($|\/|\\)/i).test(sUrl)||(/^[\w][\w\/\.\-_%]+$/i).test(sUrl)||(/^[\/\\][^\/\\]/i).test(sUrl) ? true : false;}


          8.跨站請(qǐng)求偽造(CSRF)

          ??風(fēng)險(xiǎn)描述

          CSRF 是一種攻擊者迫使被攻擊者網(wǎng)頁瀏覽器發(fā)送HTTP 請(qǐng)求到攻擊者所選擇的網(wǎng)站的漏洞。CSRF依靠用戶標(biāo)識(shí),并利用網(wǎng)站對(duì)用戶標(biāo)識(shí)的信任欺騙用戶瀏覽器發(fā)送HTTP請(qǐng)求給目標(biāo)站點(diǎn)。通過跨站請(qǐng)求偽造漏洞,攻擊者能讓受害用戶修改可以修改的任何數(shù)據(jù),或者是執(zhí)行允許使用的任何功能。

          ??漏洞示例

          缺陷代碼

          攻擊者執(zhí)行完惡意代碼后用戶的賬戶和密碼會(huì)在不知情的情況下被更改

          ??規(guī)范要求

          1、執(zhí)行標(biāo)準(zhǔn)的會(huì)話管理,通過在每個(gè)會(huì)話中使用強(qiáng)隨機(jī)令牌或參數(shù)來管理賬戶。

          2、對(duì)于重要的數(shù)據(jù)提交,增加帶隨機(jī)令牌的隱藏字段,在提交給服務(wù)器后對(duì)令牌進(jìn)行驗(yàn)證,確保提交的請(qǐng)求是合法的。

          3、對(duì)于重要的數(shù)據(jù)提交,也可進(jìn)行二次重新認(rèn)證,以確保請(qǐng)求是合法的。

          4、對(duì)于重要的數(shù)據(jù)提交,也可增加圖形驗(yàn)證碼進(jìn)行驗(yàn)證,以確保請(qǐng)求是合法的。

          示例:


          9.?敏感信息泄露及錯(cuò)誤處理

          ??風(fēng)險(xiǎn)描述

          應(yīng)用系統(tǒng)常常產(chǎn)生錯(cuò)誤信息并顯示給使用者,導(dǎo)致信息泄露問題,很多時(shí)候,這些錯(cuò)誤信息是非常有用的攻擊信息,因?yàn)樗鼈儽┞读藨?yīng)用系統(tǒng)實(shí)施細(xì)則或有用的開發(fā)信息,對(duì)攻擊系統(tǒng)有很大幫助。

          ??規(guī)范要求

          1、通過web.xml配置文件實(shí)現(xiàn),產(chǎn)生異常或者錯(cuò)誤時(shí)跳轉(zhuǎn)到統(tǒng)一的錯(cuò)誤處理頁面,避免泄漏過多敏感信息。例如:

            java.lang.Throwable/error.jsp  


          10.?遠(yuǎn)程系統(tǒng)命令執(zhí)行

          ??風(fēng)險(xiǎn)描述

          系統(tǒng)命令執(zhí)行攻擊,是指代碼中有一段執(zhí)行系統(tǒng)命令的代碼,但是系統(tǒng)命令需要接收用戶輸入,惡意攻擊者可以通過這個(gè)功能直接控制服務(wù)器。

          ??漏洞示例

          以上代碼調(diào)用系統(tǒng)的shell執(zhí)行含有用戶輸入?yún)?shù)的命令,攻擊者可以將多個(gè)命令合并在一起。比如,輸入 “. & echo hello” 首先由dir命令羅列出當(dāng)前目錄的內(nèi)容,再用echo打印出友好的信息。

          ??規(guī)范要求

          1、所有需要執(zhí)行的系統(tǒng)命令,必須是開發(fā)人員定義好的,不允許接收用戶傳來的參數(shù),加入到系統(tǒng)命令中去。

          2、字符轉(zhuǎn)義,對(duì)特殊字符進(jìn)行轉(zhuǎn)義。

          3、輸入驗(yàn)證,對(duì)于進(jìn)入命令執(zhí)行的參數(shù)進(jìn)行檢查,檢查參數(shù)長(zhǎng)度及包含特殊字符,重點(diǎn)檢查各種命令分隔符(如;、&&、&、||、|等),當(dāng)發(fā)現(xiàn)非法字符,拒絕請(qǐng)求。建議過濾出以下所有字符:

          [1] |(豎線符號(hào))

          [2] & (& 符號(hào))

          [3];(分號(hào))

          [4] $(美元符號(hào))

          [5] %(百分比符號(hào))

          [6] @(at 符號(hào))

          [7] '(單引號(hào))

          [8] "(引號(hào))

          [9] \'(反斜杠轉(zhuǎn)義單引號(hào))

          [10] \"(反斜杠轉(zhuǎn)義引號(hào))

          [11] <>(尖括號(hào))

          [12] ()(括號(hào))

          [13] +(加號(hào))

          [14] CR(回車符,ASCII 0x0d)

          [15] LF(換行,ASCII 0x0a)

          [16] ,(逗號(hào))

          [17] \(反斜杠)


          文章來源:系統(tǒng)安全運(yùn)維

          版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并致歉。謝謝!



          end



          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品一区三区 | 亚洲一级a免费在线观看 | 黑人大屌无码 | 来个欧美操逼的 | PORNY九色视频9l自拍 |