1. 程式人生 > >web安全/滲透測試--51--異常資訊洩漏

web安全/滲透測試--51--異常資訊洩漏

1、漏洞名稱:

未自定義統一錯誤頁面導致資訊洩露,丟擲異常資訊洩露,錯誤詳情資訊洩漏

2、漏洞描述:

JBOSS預設配置會有一個後臺漏洞,漏洞發生在jboss.deployment名稱空間,中的addURL()函式,該函式可以遠端下載一個war壓縮包並解壓。如果壓縮包裡含有webshell檔案,是直接可以解析的。

3、檢測方法

1、通過web掃描工具對網站掃描可得到結果。

2、或者通過手工,去嘗試開啟一些不存在的網站路徑,或者檔案,以及在url中輸入一些敏感的字元,看其頁面是否會丟擲異常或者報錯,導致錯誤訊息中包含一些網站架構,版本,等敏感資訊。

4、修復方案

詳細的各種修復方案請參考如下:

1、對於tomcat的中介軟體下,常用修復方式如下:找到配置檔案web.xml,修改內容如下:

    <error-page>
    	<exception-type>java.lang.Throwable</exception-type>
    	<location>/jsp/common/error.jsp</location>
    </error-page>
    <error-page>
    	<error-code>500</error-code>
    	<location>/jsp/common/500.jsp</location>
    </error-page>
    <error-page>
    	<error-code>404</error-code>
    	<location>/jsp/common/404.jsp</location>
    </error-page>
    <error-page>
    	<error-code>403</error-code>
    	<location>/jsp/common/403.jsp</location>
    </error-page>

2、對於常用的jsp語言開發的網站,可在業務流程中,加入異常捕獲過程中預定義的錯誤編碼,將異常輸出到錯誤日誌中,並在前臺頁面返回相應的錯誤編碼,以便應用系統運維人員進行異常排查。程式碼參考:

    try  {
    	//某業務處理流程
    }  catch (Exception e)  {
    	e.printStackTrace();
    	logger.error(e.getMessage());
    	resultMessage = getText("業務處理髮生異常,錯誤編碼A-04221!");
    	return "errorJsp";
    }

3、對於IIS/ASP.net下設定404錯誤頁面:這樣便可以保證IIS能夠正確地返回“404”狀態碼。首先,修改應用程式根目錄的設定,開啟“web.config”檔案編輯,在其中加入如下內容:

<configuration>
	<system.web>
		<customErrors mode=”On” defaultRedirect=”error.asp”>
			<error statusCode=”404″ redirect=”notfound.asp” />
		</customErrors>
	</system.web>
</configuration>

注:上文例中“error.asp”為系統預設的404頁面,“notfound.asp”為自定義的404頁面,使用時請修改相應檔名。然後,在自定義的404頁面“notfound.asp”中加入將顯示的程式碼頁面,如“not found”。

4、對於apache伺服器的設定:修改httpd.conf,找到如下:

#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

httpd.conf中的這一部分,#ErrorDocument 404 /missing.html 是顯示錯誤頁資訊的,去掉前面的#,修改為:ErrorDocument 404 /404.jsp

5、對於PHP中介軟體的使用者,可通過修改php.ini檔案來實現如果關閉與開啟錯誤資訊,關閉錯誤顯示後,php函式執行錯誤的資訊將不會再顯示給使用者,這樣能在一定程度上防止攻擊者從錯誤資訊得知指令碼的物理位置,以及一些其它有用的資訊,起碼給攻擊者的黑箱檢測造成一定的障礙。這些錯誤資訊可能對我們自己有用,可以讓它寫到指定檔案中去,那麼修改以下:

log_errors = Off 改為:log_errors = On 

以及指定檔案,找到下面這行: 
;error_log = filename 
去掉前面的;註釋,把filename改為指定檔案,如/usr/local/xxx/logs/php_error.log 
error_log = /usr/local/xxx/logs/php_error.log 
這樣所有的錯誤都會寫到php_error.log檔案裡。

6、對於J2EE專案開發的網站,如果想通過捕獲丟擲的異常資訊的方式來修復,可以使用使用Spring MVC統一異常處理的方法來進行修復,Spring MVC處理異常有3種方式

A、使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定義預設的異常處理頁面,當該異常型別的註冊時使用 -->
	<property name="defaultErrorView" value="error"></property>
	<!-- 定義異常處理頁面用來獲取異常資訊的變數名,預設為exception -->
	<property name="exceptionAttribute" value="ex"></property>
	<!-- 定義需要特殊處理的異常,用類名或完全路徑名作為key,異常也頁名作為值 -->
	<property name="exceptionMappings">
		<props>
			<prop key="cn.basttg.core.exception.BusinessException">error-business</prop>
			<prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>
			<!-- 這裡還可以繼續擴充套件對不同異常型別的處理 -->
		</props>
	</property>
</bean>

啟動測試專案,經驗證,各種層面所丟擲的異常(業務異常BusinessException、引數異常ParameterException和其它的異常Exception)都能準確顯示定義的異常處理頁面,達到了統一異常處理的目標。使用SimpleMappingExceptionResolver進行異常處理,具有整合簡單、有良好的擴充套件性、對已有程式碼沒有入侵性等優點,但該方法僅能獲取到異常資訊,若在出現異常時,對需要獲取除異常以外的資料的情況不適用。

B、實現Spring的異常處理介面HandlerExceptionResolver自定義自己的異常處理器;增加HandlerExceptionResolver介面的實現類MyExceptionHandler,程式碼如下:

public class MyExceptionHandler implements HandlerExceptionResolver {  
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  {  
		Map<String, Object> model = new HashMap<String, Object>();  
		model.put("ex", ex);  
		// 根據不同錯誤轉向不同頁面  
		if(ex instanceof BusinessException) {  
			return new ModelAndView("error-business", model);  
		} else if(ex instanceof ParameterException) {  
			return new ModelAndView("error-parameter", model);  
		} else {  
			return new ModelAndView("error", model);  
		}  
	} 
} 

在Spring的配置檔案applicationContext.xml中增加以下內容:

<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>

啟動測試專案,經驗證各種層丟擲的異常(業務異常BusinessException、引數異常ParameterException和其它的異常Exception)都能準確顯示定義的異常處理頁面,達到了統一異常處理的目標,使用實現HandlerExceptionResolver介面的異常處理器進行異常處理,具有整合簡單、有良好的擴充套件性、對已有程式碼沒有入侵性等優點,同時,在異常處理時能獲取導致出現異常的物件,有利於提供更詳細的異常處理資訊。

C、使用@ExceptionHandler註解實現異常處理;增加BaseController類,並在類中使用@ExceptionHandler註解宣告異常處理,程式碼如下:

public class BaseController {  
	public String exp(HttpServletRequest request, Exception ex) {  
		request.setAttribute("ex", ex);  
		// 根據不同錯誤轉向不同頁面  
		if(ex instanceof BusinessException) {  
			return "error-business";  
		}
		else if(ex instanceof ParameterException) {  
			return "error-parameter";  
		} else {  
			return "error";  
		}  
	}  
}

修改程式碼,使所有需要異常處理的Controller都繼承該類,如下所示,修改後的TestController類繼承於BaseController:

public class TestController extends BaseController  

使用@ExceptionHandler註解實現異常處理,具有整合簡單、有擴充套件性好(只需要將要異常處理的Controller類繼承於BaseController即可)、不需要附加Spring配置等優點,但該方法對已有程式碼存在入侵性(需要修改已有程式碼,使相關類繼承於BaseController),在異常處理時不能獲取除異常以外的資料。