




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
范圍本規范從應用開發安全管理要求出發,給出了WEB編碼安全的具體要求。供浙江公司IT系統內部和廠商使用,適用于省市公司IT系統項目建設WEB工作。本規范明確定義了JAVA、PHP應用開發中和WEB編碼安全相關的技術細節。與JAVA編碼安全相關的內容包括:跨站腳本攻擊及解決方法、SQL注入及解決方法、惡意文件執行及解決方法、不安全的直接對象引用及解決方法、跨站請求偽造及解決方法、信息泄露和錯誤處理不當及解決方法、殘缺的認證和會話管理及解決方法、不安全的加密存儲及解決方法、不安全的通信及解決方法、限制URL訪問實效解決方法。與PHP編碼安全相關的內容包括:變量濫用及解決方法、文件打開漏洞及解決方法、文件包含漏洞及解決方法、文件上傳漏洞及解決方法、命令執行漏洞及解決方法、變量類型缺陷及解決方法、警告及錯誤信息處理解決方法、PHP與MYSQL組合的SQL注入解決方法、跨站腳本解決方法。1.規范概述Web應用程序為結構設計人員、設計人員和開發人員提出一系列復雜的安全問題。最安全、最有能力抵御攻擊的Web應用程序是那些應用安全思想構建的應用程序。在設計初始階段,應該使用可靠的體系結構和設計方法,同時要結合考慮程序部署以及企業的安全策略。如果不能做到這一點,將導致在現有基礎結構上部署應用程序時,要不可避免地危及安全性。本規范提供一系列安全的體系結構和設計指南,并按照常見的應用程序漏洞類別進行組織。這些指南是Web應用程序安全的重要方面,并且是經常發生錯誤的領域。2.實現目標使用本規范可以實現:確定安全Web應用程序的重要體系結構和設計問題。設計時考慮重要部署問題。制定能增強Web應用程序輸入驗證的策略。設計安全的身份驗證和會話管理機制。選擇適當的授權模型。實現有效的帳戶管理方法,并保護用戶會話。對隱私、認可、防止篡改和身份驗證信息進行加密。防止參數操作。設計審核和記錄策略。3.安全編碼原則程序只實現你指定的功能永不要信任用戶輸入,對用戶輸入數據做有效性檢查必須考慮意外情況并進行處理不要試圖在發現錯誤之后繼續執行盡可能使用安全函數進行編程小心、認真、細致地編程4.安全背景知識本規范主要提供設計應用程序時應該遵循的一些指南和原則。為充分理解本規范內容,請:了解應用程序將會受到的威脅,以確保通過程序設計解決這些問題。解需要考慮的威脅。在程序設計階段應該考慮到這些威脅。在應用程序易受攻擊的重要環節應用系統的方法。將重點放在程序部署、輸入驗證、身份驗證和授權、加密及數據敏感度、配置、會話、異常管理以及適當的審核和記錄策略上,以確保應用程序具有責任性。安全編程——OWASPTOP10ANDESAPIOWASPTOP10與ESAPIOWASP(開放Web應用安全項目-OpenWebApplicationSecurityProject)是一個開放社群、非營利性組織,目前全球有82個分會近萬名會員,其主要目是研議協助解決Web軟體安全之準、工具與技術文件,長期致力于協助政府或企業解并改善網頁應用程式與網頁服務的安全性。OWASPTOP10是10個最關鍵的Web應用安全問題清單。這份名單是每隔數年更新(最近2010年)。名單上都是那些通常很簡單的,危險的安全問題。這里是一個以在OWASP十大項目的鏈接。/index.php/Category:OWASP_Top_Ten_Project其實簡單一點來說,ESAPI就是為編寫出更加安全的代碼設計出來的一些API,方便使用者調用,從而方便的編寫安全的代碼。它本身是開源的,同時提供JAVA版本和.NET版本。代碼下載地址:下圖顯示提供的API與OWASP列出的10個安全問題的蓋關系:下圖顯示結合ESAPI設計你的程序:下圖簡單呈現ESAPI如何運作:跨站腳本(XSS)定義跨站腳本是最普遍的web應用安全漏洞。當應用程序在發送給瀏覽器的頁面中包含用戶提供的數據,但沒有經過適當驗證或轉譯那些內容,這就導致跨站腳本漏洞。危害攻擊者能在受害者瀏覽器中執行腳本以劫持用戶會話、迫害網站、插入惡意內容、重定向用戶、使用惡意軟件劫持用戶瀏覽器等等。種類已知有三種著名跨站漏洞:1)存儲式;2)反射式;3)基于DOM。反射式跨站腳本通過測試或代碼分析很容易找到。解決方法.1.驗證輸入驗證輸入很簡單-檢查每個輸入的有效性。這可能意味著很多東西,但在典型的和簡單的情況下,這意味著檢查輸入類型和數據的長度。例如,如果你是從一個文本框接受一個準的郵政編碼,你會知道,唯一有效的類型是一個數字(0-9),而長度應該是6,不能多也不能少。并非所有的案件都如此簡單,但很多是相似的。下圖顯示驗證輸入的架構。這里的關鍵是,一切都進行驗證,所有的輸入,這并不來自于應用程序(包括用戶輸入,請求頭,Cookie,數據庫數據...)。實例getValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,booleanallowNull,ValidationErrorListerrors)isValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,booleanallowNull)StringvalidatedFirstName=ESAPI.validator().getValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false,errorList);booleanisValidFirstName=ESAPI.validator().isValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false);.2.編碼輸出對驗證輸入的另一面就是編碼輸出。編碼輸出,是用來確保字符被視為數據,而不是作為HTML元字符被瀏覽器解析。這些技術定義一些特殊的"轉義"字符。沒有正確轉義的數據它仍然會在瀏覽器中正確解析。編碼輸出只是讓瀏覽器知道數據是不是要被解析,達到攻擊無法實現的目的。需要編碼的部分:1、HTML實體2、HTML屬性3、Javascript4、CSS5、URL下圖像顯示編碼輸出的架構。實例1——HTML實體編碼//performinginputvalidationStringcleanComment=ESAPI.validator().getValidInput("comment",request.getParameter("comment"),"CommentRegex",300,false,errorList);//checktheerrorListhere//performingoutputencodingfortheHTMLcontextStringsafeOutput=ESAPI.encoder().encodeForHTML(cleanComment);實例2——URL編碼//performinginputvalidationStringcleanUserName=ESAPI.validator().getValidInput("userName",request.getParameter("userName"),"userNameRegex",50,false,errorList);//checktheerrorListhere//performingoutputencodingfortheurlcontextStringsafeOutput="/admin/findUser.do?name="+ESAPI.encoder().encodeForURL(cleanUserName);SQL注入定義簡單來說,注入往往是應用程序缺少對輸入進行安全性檢查所引起的,攻擊者把一些包含指令的數據發送給解釋器,解釋器會把收到的數據轉換成指令執行,注入漏洞十分普遍,通常能在SQL查詢、LDAP查詢、Xpath查詢、OS命令、程序參數等中出現。危害注入能導致數據丟失或數據破壞、缺乏可審計性或是拒絕服務。注入漏洞有時甚至能導致完全接管主機。種類SQL注入、XPATH注入、LDAP注入、OS命令注入等。解決方法注入實例StringsqlString="SELECT*FROMusersWHEREfullname='"+form.getFullName()+"'ANDpassword='"+form.getPassword()+"'";正常:username=tony,password=123456SELECT*FROMusersWHEREusername=tony'ANDpassword='123456'攻擊:username=tony,password='OR'1'='1SELECT*FROMusersWHEREusername=tony'ANDpassword=''OR'1'='1'.2.參數化查詢預處理使用PreparedStatement()綁定變量下面的代碼示例使用一個PreparedStatement,Java的一個參數化查詢的執行情況,執行相同的數據庫查詢。Stringcustname=request.getParameter("customerName");//ThisshouldREALLYbevalidatedtoo//performinputvalidationtodetectattacksStringquery="SELECTaccount_balanceFROMuser_dataWHEREuser_name=?";PreparedStatementpstmt=connection.prepareStatement(query);pstmt.setString(1,custname);ResultSetresults=pstmt.executeQuery();.3.使用存儲過程Stringcustname=request.getParameter("customerName");//ThisshouldREALLYbevalidatedtry{CallableStatementcs=connection.prepareCall("{callsp_getAccountBalance(?)}");cs.setString(1,custname);ResultSetresults=cs.executeQuery();//resultsethandling}catch(SQLExceptionse){//logginganderrorhandling}.4.使用ESAPI//ESAPIversionofqueryCodecORACLE_CODEC=newOracleCodec();//we'reusingoracleStringquery="SELECTnameFROMusersWHEREid="+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedUserId)+"ANDdate_created>='"+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedStartDate)+"'";myStmt=conn.createStatement(query);...//executestatementandgetresults惡意文件執行定義惡意文件執行是一種能夠威脅任何網站形式的漏洞,只要攻擊者在具有引入(include)功能程式的參數中修改參數內容,WEB服務器便會引入惡意程序內容從而受到惡意文件執行漏洞攻擊。危害攻擊者可利用惡意文件執行漏洞進行攻擊取得WEB服務器控制權,進行不法利益或獲取經濟利益。解決方法.1實例1驗證輸入,使用ESAPI驗證上傳文件名if(!ESAPI.validator().isValidFileName("upload",filename,allowedExtensions,false)){thrownewValidationUploadException("Uploadonlysimplefilenameswiththefollowingextensions"+allowedExtensions,"UploadfailedisValidFileNamecheck");}.2實例2使用ESAPI檢查上傳文件大小ServletFileUploadupload=newServletFileUpload(factory);upload.setSizeMax(maxBytes);不安全的直接對象引用定義所謂"不安全的對象直接引用",即Insecuredirectobjectreferences,意指一個已經授權的用戶,通過更改訪問時的一個參數,從而訪問到原本其并沒有得到授權的對象。Web應用往往在生成Web頁面時會用它的真實名字,且并不會對所有的目對象訪問時來檢查用戶權限,所以這就造成不安全的對象直接引用的漏洞。我們看如下的一個示例,也許這樣就更容易理解什么是不安全的對象直接引用。攻擊者發現他自己的參數是6065,即?acct=6065;他可以直接更改參數為6066,即?acct=6066;這樣他就可以直接看到6066用戶的賬戶信息。危害這種漏洞能損害參數所引用的所有數據。除非名字空間很稀疏,否則攻擊者很容易訪問該類型的所有數據。解決方法.1.案例1使用ESAPI的AccessReferenceMap實現使用非直接的對象引用MyObjectobj;//generateyourobjectCollectioncoll;//holdsobjectsfordisplayinUI//createESAPIrandomaccessreferencemapAccessReferenceMapmap=newRandomAccessReferenceMap();//getindirectreferenceusingdirectreferenceasseedinputStringindirectReference=map.addDirectReference(obj.getId());//setindirectreferenceforeachobject-requiresyourappobjecttohavethismethodbj.setIndirectReference(indirectReference);//addobjecttodisplaycollectioncoll.add(obj);//storecollectioninrequest/sessionandforwardtoUI2.案例2檢查訪問。來自不受信源所使用的所有直接對象引用都必須包含訪問控制檢測,這樣才能確保用戶對要求的對象有訪問權限跨站請求偽造.定義跨站請求偽造,也被稱成為"oneclickattack"或者sessionriding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。.危害攻擊者能讓受害用戶修改可以修改的任何數據,或者是執行允許使用的任何功能。.解決方法第一步,新建CSRF令牌添加進用戶每次登陸以及存儲在httpsession里,這種令牌至少對每個用戶會話來說應該是唯一的,或者是對每個請求是唯一的。//thiscodeisintheDefaultUserimplementationofESAPI/**Thisuser'sCSRFtoken.*/PrivateStringcsrfToken=resetCSRFToken();...PublicStringresetCSRFToken(){csrfToken=ESAPI.randomizer().getRandomString(8,DefaultEncoder.CHAR_ALPHANUMERICS);returncsrfToken;}第二步,令牌同樣可以包含在URL中或作為一個URL參數記/隱藏字段。//fromHTTPUtilitilesinterfaceFinalstaticStringCSRF_TOKEN_NAME="ctoken";//thiscodeisfromtheDefaultHTTPUtilitiesimplementationinESAPIPublicStringaddCSRFToken(Stringhref){Useruser=ESAPI.authenticator().getCurrentUser();if(user.isAnonymous()){returnhref;}//iftherearealreadyparametersappendwith&,otherwiseappendwith?Stringtoken=CSRF_TOKEN_NAME+"="+user.getCSRFToken();returnhref.indexOf('?')!=-1?href+"&"+token:href+"?"+token;}...publicStringgetCSRFToken(){Useruser=ESAPI.authenticator().getCurrentUser();if(user==null)returnnull;returnuser.getCSRFToken();}第三步,在服務器端檢查提交令牌與用戶會話對象令牌是否匹配。//thiscodeisfromtheDefaultHTTPUtilitiesimplementationinESAPIPublicvoidverifyCSRFToken(HttpServletRequestrequest)throwsIntrusionException{Userenticator().getCurrentUser();//checkifuserauthenticatedwiththisrequest-noCSRFprotectionrequiredif(request.getAttribute(user.getCSRFToken())!=null){return;}Stringtoken=request.getParameter(CSRF_TOKEN_NAME);if(!user.getCSRFToken().equals(token)){thrownewIntrusionException("Authenticationfailed","PossiblyforgetedHTTPrequestwithoutproperCSRFtokendetected");}}第四步,在注銷和會話超時,刪除用戶對象會話和會話銷毀。//thiscodeisintheDefaultUserimplementationofESAPIPublicvoidlogout(){ESAPI.httpUtilities().killCookie(ESAPI.currentResponse(),ESAPI.currentRequest(),HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME);HttpSessionsession=ESAPI.currentRequest().getSession(false);if(session!=null){removeSession(session);session.invalidate();}ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(),ESAPI.currentResponse(),"JSESSIONID");loggedIn=false;(Logger.SECURITY_SUCCESS,"Logoutsuccessful");ESAPI.authenticator().setCurrentUser(User.ANONYMOUS);}信息泄露和錯處理不當定義應用程序常常產生錯誤信息并顯示給使用者。很多時候,這些錯誤信息是非常有用的攻擊,因為它們揭示實施細則或有用的開發信息利用的漏洞。危害泄露太多的細節(如錯誤堆棧跟蹤信息、SQL語句等等);登錄失敗后,通知用戶是否用戶ID或密碼出錯——登錄失敗可能是由于ID或密碼錯誤造成的。這為一個對關鍵資產發動蠻力攻擊的攻擊者提供重要信息。解決方法.1.案例1通過配置文件實現<error><exception-type>java.lang.Throwable</exception-type><location>/error.jsp</location></error>.2.案例2針對登錄嘗試的攻擊,可以使用相同的報錯信息,比如都是提示"輸入的用戶名或者密碼錯誤!"。殘缺的認證和會話管理定義與認證和會話管理相關的應用程序功能往往得不到正確實施,這就導致攻擊者破壞密碼、密匙、會話令牌或利用實施漏洞冒充其他用戶身份。危害這些漏洞可能導致部分甚至全部帳戶遭受攻擊。一旦攻擊成功,攻擊者能執行合法用戶的任何操作。因此特權帳戶會造成更大的破壞。解決方法使用內置的會話管理功能。通過認證的問候:使用單一的入口點。確保在一開始登錄SSL保護的網頁。獲取注銷的權利;添加超時;確保你使用的是安全相關的功能;使用強大的認證;不進行默認身份驗證//BAD-DON'TUSEPublicbooleanlogin(Stringusername,Stringpassword){BooleanisAuthenticated=true;try{//makecallstobackendtoactuallyperformloginagainstdatastoreif(!authenticationSuccess){isAuthenticated=false;}}catch(Exceptione){//handleexc}returnisAuthenticated;}不安全的加密存儲定義保護與加密敏感數據已經成為網絡應用的最重要的組成部分。簡單不加密的敏感數據是非常普遍。不加密的應用程序設計不當往往含有密碼,或者使用不恰當的密碼或密碼作出強烈的嚴重錯誤使用。這些缺陷可以導致違反披露敏感數據的遵守。危害攻擊者能夠取得或是篡改機密的或是私有的信息;攻擊者通過這些秘密的竊取從而進行進一步的攻擊;造成企業形象破損,用戶滿意度下降,甚至會有法律訴訟等。解決方法驗證你的結構識別所有的敏感數據;識別這些數據存放的所有位置;確保所應用的威脅模型能夠應付這些攻擊;使用加密手段來應對威脅使用一定的機制來進行保護文件加密;數據庫加密;數據元素加密。正確的使用這些機制使用準的強算法;合理的生成,分發和保護密鑰;準備密鑰的變更。驗證實現方法確保使用準的強算法;確保所有的證書、密鑰和密碼都得到安全的存放;有一個安全的密鑰分發和應急處理的方案;不安全的通信定義對于不加密的應用程序的網絡信息傳輸,需要保護敏感的通信。加密(通常SSL)的,必須用于所有身份驗證的連接,特別是通過Internet訪問的網頁,以及后端的連接。否則,應用程序將暴露身份驗證或會話令牌。危害?攻擊者能夠取得或是篡改機密的或是私有的信息;?攻擊者通過這些秘密的竊取從而進行進一步的攻擊;?造成企業形象破損,用戶滿意度下降,甚至會有法律訴訟等。解決方法提供合理的保護機制對于敏感數據的傳輸,對所有連接都要使用TLS;在傳輸前對單個數據都要進行加密;(如XML-Encryption)在傳輸前對信息進行名;(如XML-Signature)正確的使用這些機制使用準的強算法;合理管理密鑰和證書;在使用前驗證SSL證書限制URL訪問失效定義這個漏洞事實上也是與認證相關的,與我們前面提到的Top4不安全的直接對象引用也是類似的,不同在于這個漏洞是說系統已經對URL的訪問做限制,但這種限制卻實際并沒有生效。常見的錯誤是,我們在用戶認證后只顯示給用戶認證過的頁面和菜單選項,而實際上這些僅僅是表示層的訪問控制而不能真正生效,攻擊者能夠很容易的就偽造請求直接訪問未被授權的頁面。我們舉個例子來說明這個過程:1、攻擊者發現他自己的訪問地址為/user/getAccounts;2、他修改他的目錄為/admin/getAccounts或/manager/getAccounts;3、這樣攻擊者就能夠查看到更多的賬戶信息。5.11.2解決方法對每個URL,我們必須做三件事:如果這個URL不是公開的,那么必須限制能夠訪問他的授權用戶加強基于用戶或角色的訪問控制;完全禁止訪問未被授權的頁面類型(如配置文件、日志文件、源文件等)驗證你的構架在每一個層次都使用簡單肯定的模型;確保每一層都有一個訪問機制驗證你的實現不要使用自動化的分析工具;確保每個URL都被外部過濾器或其他機制保護;確保服務器的配置不允許對非授權頁面的訪問實例publicbooleanisAuthorized(Objectkey,ObjectruntimeParameter);publicvoidassertAuthorized(Objectkey,ObjectruntimeParameter)throwsAccessControlException;booleanisAuthorizedForURL(Stringurl);booleanisAuthorizedForFunction(StringfunctionName);booleanisAuthorizedForData(Stringaction,Objectdata);booleanisAuthorizedForFile(Stringfilepath);booleanisAuthorizedForService(StringserviceName);voidassertAuthorizedForURL(Stringurl)throwsAccessControlException;voidassertAuthorizedForFunction(StringfunctionName)throwsAccessControlException;voidassertAuthorizedForData(Stringaction,Objectdata)throwsAccessControlException;voidassertAuthorizedForFile(Stringfilepath)throwsAccessControlException;voidassertAuthorizedForService(StringserviceName)throwsAccessControlException;安全編程PHP簡介PHPPHP是一種非常容易上手的腳本語言,在web上應用十分廣泛。PHP的開發者已經考慮到很多安全問題,設置相當靈活。PHP自身提供的安全模式能夠在很大程度避免在程序的安全問題,但也給編程帶來一些麻煩。HP安全模式safe_mode=Onphp_admin_valuesafe_mode1safe_mode_gid=Onsafe_mode_exec_dir=/usr/local/php/execsafe_mode_include_dirstringsafe_mode_allowed_env_varsstringsafe_mode_protected_env_varsstring通用安全解決方案.1.禁用無用的函數如果覺得有些函數還有威脅,可以設置里的disable_functions(這個選項不能在里設置),比如:disable_functions=phpinfo,get_cfg_var可以指定多個函數,用逗號分開。重啟apache后,phpinfo,get_cfg_var函數都被禁止。建議關閉函數phpinfo,get_cfg_var,這兩個函數容易泄漏服務器信息,而且沒有實際用處。.2.禁用某些類這個選項是從PHP-開始才有的,它可以禁用某些類,如果有多個用逗號分隔類名。disable_classes也不能在里設置,只能在配置文件里修改。.3.限制腳本操作路徑前面分析例程的時候也多次提到用open_basedir對腳本操作路徑進行限制,這里再介紹一下它的特性。用open_basedir指定的限制實際上是前綴,不是目錄名。也就是說"open_basedir=/dir/incl"也會允許訪問"/dir/include"和"/dir/incls",如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir=/dir/incl/"。可以設置多個目錄,在Windows中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為Apache模塊時,父目錄中的open_basedir路徑自動被繼承。.4.其他安全配置取消其它用戶對常用、重要系統命令的讀寫執行權限一般管理員維護只需一個普通用戶和管理用戶,除這兩個用戶,給其它用戶能夠執行和訪問的東西應該越少越好,所以取消其它用戶對常用、重要系統命令的讀寫執行權限能在程序或者服務出現漏洞的時候給攻擊者帶來很大的迷惑。記住一定要連讀的權限也去掉,否則在linux下可以用這種方式來執行。如果要取消某程如果是在chroot環境里,這個工作比較容易實現,否則,這項工作還是有些挑戰的。因為取消一些程序的執行權限會導致一些服務運行不正常。PHP的mail函數需要/bin/sh去調用sendmail發信,所以/bin/bash的執行權限不能去掉。這是一項比較累人的工作。去掉apache日志其它用戶的讀權限apache的access-log給一些出現本地包含漏洞的程序提供方便之門。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那么把包含文件指向access-log就可以執行那些PHP代碼,從而獲得本地訪問權限。如果有其它虛擬主機,也應該相應去掉該日志文件其它用戶的讀權限。當然,如果你按照前面介紹的配置PHP那么一般已經是無法讀取日志文件。保持運行環境干凈不要在Web目錄放測試文件。變量濫用漏洞描述早起版本PHP默認register_globals=On腳本程序員已經習慣直接使用變量,包括用戶端過來的變量由于腳本程序員往往沒有對變量初始化的習慣,像如下的程序片斷就極易受到攻擊:<?if($pass=="hello")$auth=1;if($auth==1)echo"someimportantinformation";elseecho"nothing";?>攻擊方法攻擊者只需用如下的請求就能繞過檢查:http://victim/test_1.php?auth=1這雖然是一個很弱智的錯誤,但一些著名的程序也有犯過這種錯誤,比如phpnuke的程文件拷貝漏洞:解決方法PHP-發布的時候建議關閉register_globals,并提供7個特殊的數組變量來使用各種變量。對于從GET、POST、COOKIE等來的變量并不會直接注冊成變量,必需通過數組變量來存取。發布的時候,默認配置就是register_globals=Off。這使得程序使用PHP自身初始化的默認值,一般為0,避免攻擊者控制判斷變量。解決方法:配置文件設置register_globals=Off。要求程序員對作為判斷的變量在程序最開始初始化一個值。文件打開.漏洞描述極易受攻擊的代碼片斷:<?if(!($str=readfile("$filename"))){echo("Couldnotopenfile:$filename<BR>\n");exit;}else{echo$str;}?>.攻擊方法由于攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:http://victim/test_2.php?filename=/etc/passwd如下請求可以讀php文件本身:PHP中文件打開函數還有fopen(),file()等,如果對文件名變量檢查不嚴就會造成服務器重要文件被訪問讀取。.解決方法解決方法:如非特殊需要,把php的文件操作限制在web目錄里面。以下是修改apache配置文件的一個例子:<Directory/usr/local/apache/htdocs>php_admin_valueopen_basedir/usr/local/apache/htdocs</Directory>重啟apache后,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件,否則PHP就會報錯:xxxonlinexx.使用safe_mode模式也能避免這種問題,前面已經討論過。文件包含漏洞描述PHP的包含函數有include(),include_once(),require(),require_once。如果對包含文件名變量檢查不嚴就會對系統造成嚴重危險,可以程執行命令。極易受攻擊的代碼片斷:<?if(file_exists($filename))include("$filename");?>攻擊方法這種不負責任的代碼會造成相當大的危害,攻擊者用如下請求可以得到/etc/passwd文件:http://victim/test_3.php?filename=/etc/passwd如果對于Unix版的PHP(Win版的PHP不支持程打開文件)攻擊者可以在自己開http或ftp服務的機器上建立一個包含shell命令的文件,如的內容是<?passthru("ls/etc")?>,那么如下的請求就可以在目主機執行命令ls/etc:攻擊者甚至可以通過包含apache的日志文件和來得到執行命令的代碼,不過由于干擾信息太多,有時不易成功。對于另外一種文件包含形式,如下代碼片斷:<?include("$lib/config.php");?>攻擊者可以在自己控制的主機建立一個包含執行命令代碼的文件,然后用如下請求也可以在目主機執行命令:解決方法要求程序員包含文件里的參數盡量不要使用變量,如果使用變量,就一定要嚴格檢查要包含的文件名,絕對不能由用戶任意指定。如前面文件打開中限制PHP操作路徑是一個必要的選項。另外,如非特殊需要,一定要關閉PHP的程文件打開功能。修改文件:allow_url_fopen=Off重啟apache。文件上傳漏洞描述php的文件上傳機制是把用戶上傳的文件保存在的upload_tmp_dir定義的臨時目錄(默認是系統的臨時目錄,如:/tmp)里的一個類似phpxXuoXG的隨機臨時文件,程序執行結束,該臨時文件也被刪除。PHP給上傳的文件定義四個變量:(如form變量名是file,而且register_globals打開)$file#就是保存到服務器端的臨時文件(如/tmp/phpxXuoXG)$file_size#上傳文件的大小$file_name#上傳文件的原始名稱$file_type#上傳文件的類型推薦使用:$HTTP_POST_FILES['file']['tmp_name']$HTTP_POST_FILES['file']['size']$HTTP_POST_FILES['file']['name']$HTTP_POST_FILES['file']['type']或:$_FILES['file']['tmp_name']$_FILES['file']['size']$_FILES['file']['name']$_FILES['file']['type']攻擊方法易受攻擊的文件上傳代碼片斷:<?if(isset($upload)&&$file!="none"){copy($file,"/var/www/upload/".$file_name);echo"文件".$file_name."上傳成功!點擊<ahref=\"$PHP_SELF\">繼續上傳</a>";exit;}?><html><head><title>文件上傳</title><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"></head><bodybgcolor="#FFFFFF"><formenctype="multipart/form-data"method="post">上傳文件:<inputtype="file"name="file"size="30"><inputtype="submit"name="upload"value="上傳"></form></body></html>這樣的上傳代碼存在讀取任意文件和執行命令的重大問題。下面的請求可以把/etc/passwd文檔拷貝到web目錄/var/www/upload(注意:這個目錄必須nobody可寫)下的文件里:然后可以用如下請求讀取口令文件:攻擊者可以把php文件拷貝成其它擴展名,泄漏腳本源代碼。攻擊者可以自定義form里file_name變量的值,上傳覆蓋任意有寫權限的文件。攻擊者還可以上傳PHP腳本執行主機的命令。解決方法PHP-以后提供is_uploaded_file和move_uploaded_file函數,可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統文件拷貝到web目錄。使用$HTTP_POST_FILES或$_FILES數組來讀取用戶上傳的文件變量。嚴格檢查上傳變量。比如不允許是php腳本文件。把PHP腳本操作限制在web目錄可以避免程序員使用copy函數把系統文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改里upload_tmp_dir的值。把PHP腳本用phpencode進行加密,避免由于copy操作泄漏源碼。嚴格配置文件和目錄的權限,只允許上傳的目錄能夠讓nobody用戶可寫。對于上傳目錄去掉PHP解釋功能,可以通過修改實現:<Directory/usr/local/apache/htdocs/upload>php_flagengineoff#如果是php3換成php3_engineoff</Directory>重啟apache,upload目錄的php文件就不能被apache解釋,即使上傳php文件也沒有問題,只能直接顯示源碼。命令執行漏洞描述下面的代碼片斷是從PHPNetToolpack摘出,詳細的描述見:<?system("traceroute$a_query",$ret_strs);?>攻擊方法由于程序沒有過濾$a_query變量,所以攻擊者可以用分號來追加執行命令。攻擊者輸入如下請求可以執行cat/etc/passwd命令:http://victim/test_6.php?a_query=;cat/etc/passwdPHP的命令執行函數還有system(),passthru(),popen()和``等。命令執行函數非常危險,盡量用相關的函數來代替。如果要使用一定要嚴格檢查用戶輸入。解決方法解決方法:要求程序員使用escapeshellcmd()函數過濾用戶輸入的shell命令。啟用safe_mode可以絕很多執行命令的問題,不過要注意PHP的版本一定要是最新的,小于PHP-的都可能繞過safe_mode的限制去執行命令。變量類型缺陷缺陷描述PHP程序員基本上不關注變量類型serialize字串可以定義各種類型的變量編程的疏忽就導致漏洞的產生phpBB以下版本驗證繞過漏洞if($sessiondata['autologinid']==$auto_login_key)解決方法邏輯比較時注意變量類型必要的時候使用"===",那么連變量類型一起比較警告及錯誤信息漏洞描述PHP默認顯示所有的警告及錯誤信息:error_reporting=E_ALL&~E_NOTICEdisplay_errors=On在平時開發調試時這非常有用,可以根據警告信息馬上找到程序錯誤所在。正式應用時,警告及錯誤信息讓用戶不知所措,而且給攻擊者泄漏腳本所在的物理路徑,為攻擊者的進一步攻擊提供有利的信息。而且由于自己沒有訪問到錯誤的地方,反而不能及時修改程序的錯誤。所以把PHP的所有警告及錯誤信息記錄到一個日志文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯誤所在。解決方法修改中關于Errorhandlingandlogging部分內容:error_reporting=E_ALLdisplay_errors=Offlog_errors=On然后重啟apache,注意文件必需可以讓nobody用戶可寫。與Mysql組合的SQl注入漏洞描述PHP相對安全默認magic_quotes_gpc=Onmysql_query()函數只允許執行一條SQL語句最可能被注入的SQL語句:select*fromtestwhereid=$id對于數字類型的字段,很多程序員會這樣寫危害比較嚴重的情況MySQL版
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空航天復合材料 課件知識點6 高熵合金基復合材料
- 會滾的汽車課件
- 剪輯技巧培訓課件
- 腫瘤科常用藥物臨床應用與管理
- 路基工程這知識培訓
- 2025年 安康市紫陽縣民歌藝術研究中心招聘考試筆試試卷附答案
- 2025年中國噴泉套件行業市場全景分析及前景機遇研判報告
- 小動物搬家課件
- 蛛網膜下腔出血疑難病例討論
- 紅血絲皮膚的成因及護理
- 大模型備案-落實算法安全主體責任基本情況-XX集團有限公司
- 護理禮儀與人際溝通試題(含答案)
- 2025-2030中國蔬菜溫室大棚市場消費趨勢分析與經營管理風險報告
- 學校外來人員登記制度
- 應急物資中轉站項目可行性研究報告(模板范文)
- 2025年初級等保測評試題及答案
- 薄壁空心墩施工方案
- 多重耐藥菌醫院感染預防與控制技術指南(試行)
- 教師如何使用AI開展教學DeepSeek使用指南人工智能 課件
- 油氣田地面工程詳解
- 地面注漿施工方案
評論
0/150
提交評論