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_双服务器_双引号_小括号_字符型注入
核心源码:
和前面的做法一样,只不过这里是小括号+双引号闭合罢了
剩下的自行尝试。
注:
JSP中Less-32没有做任何过滤,不知道作者的意图,但在PHPStudy中,Less-32是宽字节注入,后面会讲。
总结:从以上三关中,我们主要学习到的是不同服务器对于参数的不同处理,HPP 的应用有
很多,不仅仅是我们上述列出过 WAF 一个方面,还有可以执行重复操作,可以执行非法操
作等。同时针对 WAF 的绕过,我们这里也仅仅是抛砖引玉,后续的很多的有关 HPP 的方法
需要共同去研究。这也是一个新的方向。