Sqli-labs之Less-29和Less-30和Less-31

                                              Less-29

基於錯誤_GET_雙服務器_單引號_字符型注入

服務器(兩層)架構

注:截圖等來自《MySQL注入天書:Less 29》

服務器端有兩個部分:第一部分爲 tomcat 爲引擎的 jsp 型服務器,第二部分爲 apache 爲引擎的 php 服務器,真正提供 web 服務的是 php 服務器。

工作流程爲:client 訪問服務器,能直接訪問到 tomcat 服務器,然後 tomcat 服務器再向 apache 服務器請求數據。數據返回路徑則相反。

接下來是參數解析的問題。
問:index.php?id=1&id=2,這時回顯是id=1還是id=2呢?
答:apache (php) 解析最後一個參數,即回顯id=2;tomcat (jsp) 解析第
一個參數,即回顯id=1

大多數服務器對於參數解析:

這裏有一個新問題。
問:index.jsp?id=1&id=2,針對這關的兩層結構,客戶端請求首先過 tomcat,tomcat 解析第一個參數,接下來 tomcat 請求 apache,apache 解析最後一個參數。那麼最終返回客戶端的是哪個參數?
答:此處應該還是id=2,因爲實際上提供服務的是 apache 服務器,返回的數據也應該是 apache 處理的數據。

而在我們實際應用中,也是有兩層服務器的情況,那爲什麼要這麼做?是因爲我們往往在 tomcat 服務器處做數據過濾和處理,功能類似爲一個 WAF

而正因爲解析參數的不同,我們此處可以利用該原理繞過 WAF 的檢測。如 payload:index.jsp?id=1&id=0 or 1=1--+,tomcat 只檢查第一個參數id=1,而對第二個參數id=0 or 1=1--+不做檢查,直接傳給了 apache,apache 恰好解析第二個參數,便達到了攻擊的目的。

該用法就是 HPP(HTTP Parameter Pollution)即 HTTP 參數污染攻擊的一個應用。HPP 可對服務器和客戶端都能夠造成一定的威脅。

測試:

正常訪問:

注入測試:

192.168.33.1:8080/sqli/Less-29/?id=1'

返回:

點擊Go back... 

從跳轉到.jsp頁面可以看出來是 Tomcat 服務器,一般來說,現在沒有拿 jsp 寫後臺的了,大都用 php ,我們果斷猜測是雙服務器。

注入點測試:

192.168.33.1:8080/sqli/Less-29/?id=1&id=1'

有正確回顯和錯誤回顯,單引號無小括號,剩下的事就好辦了,可以發現沒有其他任何的過濾條件,是最簡單的注入之一。

接下來我們分析源代碼:

login.php

首先,有一個whitelist()方法,確保輸入變量爲數字,如果輸入變量中包含非數字的字符,跳轉到hacked.php

//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{
    $match = preg_match("/^\d+$/", $input); //這個正則表達式 意思是 匹配 以數字開頭的一個或多個數字且以數字結尾的字符串。
    if($match)
    {
        //echo "you are good";
        //return $match;
    }
    else
    {    
        header('Location: hacked.php');
        //echo "you are bad";
    }
}

然後,我們發現input就是id1,id1來自於javaimplimentation(qs)

接着,查看java_implimentation()方法,發現這個方法是用來模擬HPP的,意思就是說這個方法存在HPP漏洞我們可以利用。

// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
//當受到HPP(HTTP參數污染)的影響時,以下功能可模仿參數的行爲。
function java_implimentation($query_string)
{
    $q_s = $query_string;
    $qs_array= explode("&",$q_s); //根據&分割字符串並打散爲數組

    foreach($qs_array as $key => $value)
    {
        $val=substr($value,0,2);
        if($val=="id")
        {
            $id_value=substr($value,3,30); 
            return $id_value;
            echo "<br>";
            break;
        }
    }
}

這個login.php寫的很清楚,後來我發現如果不搭建JSPStudy環境,利用login.php和index.php也是可以模擬HPP的:

反倒是index.jsp有點看不懂了,javaWeb基礎太差,我想作用應該是和login.php裏描述的是一樣的,只不過語法不同罷了,反正搭建了JSPStudy,login.php文件是不需要用的,早知道就搭建JSP了,麻煩。

<%
	String id = request.getParameter("id");
	String qs = request.getQueryString();
		
	if(id!=null)
	{
		if(id!="")
		{
			try
			{
				String rex = "^\\d+$";
				Boolean match=id.matches(rex);
				if(match == true)
				{
					URL sqli_labs = new URL("http://192.168.33.1/sqli/Less-29/index.php?"+ qs);
			        URLConnection sqli_labs_connection = sqli_labs.openConnection();
			        BufferedReader in = new BufferedReader(
			                                new InputStreamReader(
			                                sqli_labs_connection.getInputStream()));
			        String inputLine;
			        while ((inputLine = in.readLine()) != null) 
			            out.print(inputLine);
			        in.close();
				}
				else
				{
					response.sendRedirect("hacked.jsp");
				}
			} 
			catch (Exception ex)
			{
				out.print("<font color= '#FFFF00'>");
				out.println(ex);
				out.print("</font>");				
			}
			finally
			{
				
			}
		}
		
	}
	else
	{
		URL sqli_labs = new URL("http://192.168.33.1/sqli/Less-29/index.php");
        URLConnection sqli_labs_connection = sqli_labs.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                sqli_labs_connection.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) 
            out.print(inputLine);
        in.close();
	}
%>

我們再看一下index.php:

驗證了我們上面說的,最簡單的注入-單引號字符注入:

剩下的自己嘗試。

                                                     Less-30

基於錯誤_GET_雙服務器_雙引號_字符型_盲注

核心源碼:

有正確回顯但無錯誤回顯,所以可以盲注,延時注入,聯合注入

剩下的自己嘗試。

 

                                                        Less-31

基於錯誤_GET_雙服務器_雙引號_小括號_字符型注入

核心源碼:

和前面的做法一樣,只不過這裏是小括號+雙引號閉合罷了

剩下的自行嘗試。

總結:從以上三關中,我們主要學習到的是不同服務器對於參數的不同處理,HPP 的應用有
很多,不僅僅是我們上述列出過 WAF 一個方面,還有可以執行重複操作,可以執行非法操
作等。同時針對 WAF 的繞過,我們這裏也僅僅是拋磚引玉,後續的很多的有關 HPP 的方法
需要共同去研究。這也是一個新的方向。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章