zoukankan      html  css  js  c++  java
  • 漏洞重温之sql注入(六)

    漏洞重温之sql注入(六)

    sqli-labs通关之旅

    Less-26

    进入第26关,首先我们可以从网页的提示看出本关是get型注入。

    我们给页面添加上id参数后直接去查看源码。

    需要关注的东西我已经标注在上面了。

    首先,我们先来观察第一个红框内的代码。

    $id=blacklist($id);
    

    这行代码表示,我们通过get请求传输的id参数,在放到代码中执行的时候,是被blacklist函数给转义过了,当然,这个blacklist函数可能是原有函数,也可能是自定义函数。

    为了验证这个猜测,我们可以仔细观察代码,或者直接按ctrl+f在代码中搜索这个名称,看能否发现,如果发现了封装函数的代码块,就说明这个函数是自定义,如果没有,则为原有函数。

    根据函数的内容,我们可以发现,网页将id参数中的or,and,/*,--,#,空格,正反斜杠都过滤了。

    也就是说,我们这次想要进行注入的难度比上只过滤了or and 的第二十五关困难的多。

    然后我们接着看其他红框内的代码。

    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    

    这行代码告诉我们,如果想要在这个位置进行注入,我们需要使用单引号闭合。

    if($row)
    	{
    	  	echo "<font size='5' color= '#99FF00'>";	
    	  	echo 'Your Login name:'. $row['username'];
    	  	echo "<br>";
    	  	echo 'Your Password:' .$row['password'];
    	  	echo "</font>";
      	}
    	else 
    	{
    		echo '<font color= "#FFFF00">';
    		print_r(mysql_error());
    		echo "</font>";  
    	}
    

    这段代码告诉我们,如果代码正常执行,我们是会收获回显的,所以在这个位置,我们可以使用联合查询。同时,因为代码执行成功与否返回的结果不同,所以这里我们也可以使用布尔型盲注。

    print_r(mysql_error());
    

    最后的这行代码,是讲数据库错误打印出来,让我们可以在网页上看到,所以我们在这里也可以使用报错注入。

    明白了这些之后,首先我们先观察一下几种注入payload的语法。

    联合查询:

    union select 执行语句,占位,占位 -- 
    

    布尔型盲注:

    length((database()))>1 -- 
    

    报错注入:

    updatexml(1,concat(0x7e,(执行语句),0x7e),1) -- 
    

    首先,我们可以看到,这三条语句的后面,都使用到了注释。但是同时我们也清楚,注释是被转义。所以,可以将注释换成 or ' 来闭合语句中原有的单引号,这样我们就不需要用到注释了。

    然后,我们还知道网页过滤了空格,所以可以看到,payload里面有两条不使用空格就可以完成,所以我们就可以直接将联合查询排除,选择使用另外两条语句。

    因为盲注的步骤相比于报错植入要多的多,所以这里我们使用报错注入。

    构造payload:

    ' || updatexml(1,concat(0x7e,(database()),0x7e),1) oorr ' 
    

    PS:这里要注意的是,||就是or的意思,为什么前面使用双竖杠,就是因为如果使用双写来绕过对or的过滤的话,那原本应该是||updatexml的语句就会变成orupdatexml,这样会导致代码出错,致使无法执行出我们希望看到的结果,所以之前我们才没有选择使用空格较多的联合查询。

    第二十六关,通关。

    Less-26a

    查看源码。

    代码几乎和第二十六关一致,唯一有区别的地方,我已经用红框圈出来了。

    首先我们可以第一行被红框圈起来的代码中知道,这里的闭合需要使用括号加单引号。

    其次,因为报错信息打印的那一条被注释掉了,所以这里,我们无法使用报错注入获得我们希望获得的数据,所以这里只能使用盲注。

    构造payload如下:

    1000')||length((database()))>1||('
    

    这里要注意,让id等于11000的原因,是因为我们要让前面的代码出错,不使用复数是因为横杠属于代码过滤内容。

    第26a关,通关。

    Less-27

    27关源码。

    第27关的过滤,相比于26关,有额外多了联合查询的关键字union的大小写,以及select的大小写和两个关键字首字母大写的情况。

    但是,根据我们之前的分析,因为代码块执行成功与否所返回的代码块不同,我们可以使用布尔型盲注。以及执行失败的代码块中,有打印数据库报错信息的代码,所以我们可以使用报错注入来完成注入。

    这里,我们先使用报错注入来进行。

    构造payload:

    ' || updatexml(1,concat(0x7e,(database()),0x7e),1) or '
    

    第27关,通关。

    第27a关卡相对于27关,和26a相对于26关一样。

    源码如下。

    这里,我们只需要使用双引号闭合代码,并且使用盲注就可以了。

    第27a,通关。

    Less-28

    28关的代码格式和前面几关基本一致,区别,在于这个自定义函数的过滤内容。

    代码过滤了/*,--,#,空格等,但按照之前的逻辑。既然你过滤了这些东西,那我不使用就完全不影响我的注入了。

    但是,根据上面的图片,我们看到打印数据库报错信息的位置被注释掉了。

    也就是说,在这个位置,我们没办法直接使用报错注入获取我们希望获取的内容,所以,直接使用盲注构造payload:

    1000') || length((database()))>1 ||('
    

    第28关,通关。

    因为28a跟28关破关方式几乎一样,代码层的区别只在于注释,而且相比较于28关,注释减少,所以这里就不做演示,按照28关的思路即可成功通关。

    Less-29

    29关的index页面,基本没有防御,我们可以直接使用单引号闭合,随后直接通过联合查询,盲注,报错注入等方式获取结果。

    payload如下:

    1' and 1=2 union select 1,2,3 -- 
    

    1' and 1=2 union select 1,version(),database() -- 
    

    而29关的login页面,则是基于单引号的参数污染。

    payload如下:

    id=1&id=-1' union select 1,version(),database() -- 
    

    Less-30

    30关相对于29关,只是闭合从单引号换成了双引号,其他内容完全一致,步骤是完全一致,这里就不过多赘述了。

    index页面payload如下:

    1" and 1=2 union select 1,version(),database() -- 
    

    login页面payload如下:

    id=1&id=1' and 1=2 union select 1,version(),database() -- 
    

    第30关,通关。

    文章未经本人允许,禁止转载。 有技术问题,可加好友讨论。 联系方式:QQ:MjgxMjMxODAzNQ== 微信:bzNycjByLVhpYW9taW5n
  • 相关阅读:
    topcoder srm 445 div1
    topcoder srm 440 div1
    topcoder srm 435 div1
    topcoder srm 430 div1
    topcoder srm 400 div1
    topcoder srm 380 div1
    topcoder srm 370 div1
    topcoder srm 425 div1
    WKWebView强大的新特性
    Runtime那些事
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/13598994.html
Copyright © 2011-2022 走看看