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_双服务器_双引号_小括号_字符型注入

核心源码:

和前面的做法一样,只不过这里是小括号+双引号闭合罢了

剩下的自行尝试。

注:

JSP中Less-32没有做任何过滤,不知道作者的意图,但在PHPStudy中,Less-32是宽字节注入,后面会讲。

总结:从以上三关中,我们主要学习到的是不同服务器对于参数的不同处理,HPP 的应用有
很多,不仅仅是我们上述列出过 WAF 一个方面,还有可以执行重复操作,可以执行非法操
作等。同时针对 WAF 的绕过,我们这里也仅仅是抛砖引玉,后续的很多的有关 HPP 的方法
需要共同去研究。这也是一个新的方向。

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值