SQL注入
一、简介
基于个人理解,SQL注入是在前端能提交数据与数据库互动处,通过构造特定SQL语句查询而窃取数据库信息的一种攻击。SQL注入存在诸如SQLMAP等高效的自动工具,但学习SQL注入原理并手动测试才能更好的理解,对不同实际做题情况做出修改,避免出现工具无效就止步不前的情况(出于个人才疏学浅,入门不久,内容粗糙简短,请见谅)。
二、分类
SQL注入按照数据库类型、注入位置、注入方法、注入绕过等可分为多种类型,在由学习到做题实际运用,SQL注入往往需要对多种类型尝试选取使用类型。
按数据库数据类型可分为
- 数字型
- 字符型
按注入的位置可分为
- GET请求注入
- POST请求注入
- HTTP头注入
按注入的方式分为
- 布尔与时间注入
- 直接注入
- 报错注入
按对SQL注入防护绕过时的方法可分为
- 字符变换绕过注入
- 字符重构绕过注入
- 宽字节注入
三、注入步骤
- 寻找注入点
- 选取注入方式
- 对选定方式构造SQL语句查询目标
- 得到结果
四、SQL注入语句查询主体
以MYSQL为例,在5.0版本以后新增了"information_schema"库,各个数据库的库名,表名以及字段名都被存储在内,相当于一个数据汇总,故可以在辨明版本合适后从"information_schema"库查找所求数据,因为"information_schema"库内表以及表中的项固定,故该流程也相对固定,可以在找到合适的SQL注入类型后修改套用。以下流程以获取数据库用户名和对应密码最终目的。
- select version()
- select group_concat(table_name) from information_schema.tables where table_schema=database()
- select group_concat(column_name) from information_schema.columns where table_name='users'
- select group_concat(username,0x3a,password),2 from users
查询数据库版本->查询"database()"库(即当前数据库)下的所有表->查询"database"库下"users"表中所有项->查询"database"库下"users"表中"username"和"password"两项的所有成员数据。
五、SQL类型解释
-
数字型 select * from XXX where id=id
前端SQL语句不需要引号闭合,通过配合逻辑符号("or"或"and")组成条件,再在后面构造SQL注入语句,万能密码即为构造成了永真条件使密码为真,从而成功登录。
- 字符型 select * from XXX where id='id'
前端SQL语句需要引号闭合(可能是双引号也可能时单引号,需要根据实际情况),其余同数字型。
- GET请求注入
提交的参数在URL中可见,可直接在URL构造SQL注入语句。
- POST请求注入
提交的参数在URL中不可见,需要通过抓包软甲(如Brupsuite)抓取请求包,在请求包中构造SQL注入语句。
- HTTP头注入
当SQL注入被设置防护时,GET请求和POST请求往往难以突破,此时HTTP头中部分却往往未被设置防护,通过抓包软件对HTTP头中参数修改构造SQL注入语句。
- 布尔与注入 select(if(length(database())>5,sleep(4),null))
类似于爆破,通过对特定数据设置判断条件不同的反馈达到穷尽的效果,手工较慢,但运用工具可抵消这一缺点。
- 直接注入 union select
在前段SQL查询语句构成用假条件(显示页面通常只允许一次"select"的查询结果,将原本"select"语句报错后"union select"查询结果才能显示)后查询目标信息,通常还要注意查询语句位于正确的位置保证能够被显示。
- 报错注入
在没有页面对SQL语句查询结果显示,可以使用SQL的函数,用函数的错误使用自动反馈SQL语法错误的提示,同时在函数内部SQL查询语句,在报错信息中间显示SQL查询结果。常用函数由extractvalue、updatexml、floor&rand组合等。
- 字符变换绕过注入
对SQL注入防护中由采用正则对用户提交的信息过滤SQL注入特定语句,此时可以对特定语句进行变换,采用其不常用的可行格式 进行替换,如"union"可以写成"UnIoN","or"可以写成"||",空格可以写成"%09"、"%0a"、"%0c"、"%0d"、"%0b"、"%a0"等。
- 字符串重构绕过注入
对特定语句还可以进行重构来绕过,如"union"写成"uniunionon","uni/**/on"等,可以Brupsuite来提高操作效率。
六、附
substr(string,start,length) :截取string自start开始length个字符(标号从0开始)。
extractvalue(目标xml文档,xml路径) :目标xml文档,查询长度上限为32,超过后需要截取,报错方法为第一个参数填入不符合xml语法格式字符,如"1"、"~"。
updatexml(目标xml文档,xml路径,,更新的内容) :与extractvalue函数相同的原理,对xml语法格式错填,错填位置为第一个和第三个参数。
sleep(sec) :休眠sec秒。
ascii(string) :返回string首字母的ascii值。
length(sth) :返回目标sth对应字符串长度。
if(expr1,expr2,expr3) :对expr1进行判断,TRUE执行expr2,FALSE执行expr3。

浙公网安备 33010602011771号