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 的方法
需要共同去研究。這也是一個新的方向。