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
  • 相关阅读:
    中国MOOC_零基础学Java语言_第1周 计算_第1周编程题_1温度转换
    郝斌_GUI
    郝斌_生产消费
    WCF技术剖析(卷1)WCF全面解析文摘
    构建搞性能可扩展asp.net网站文摘
    net 程序员面试宝典
    【工具推荐】ELMAH——可插拔错误日志工具(转)
    各大主流.Net的IOC框架性能测试比较(转)
    2013年总结
    GCT英语口语复试中的常见问题总汇
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/13598994.html
Copyright © 2011-2022 走看看