Loading

SQL注入

一、简介

  基于个人理解,SQL注入是在前端能提交数据与数据库互动处,通过构造特定SQL语句查询而窃取数据库信息的一种攻击。SQL注入存在诸如SQLMAP等高效的自动工具,但学习SQL注入原理并手动测试才能更好的理解,对不同实际做题情况做出修改,避免出现工具无效就止步不前的情况(出于个人才疏学浅,入门不久,内容粗糙简短,请见谅)。

二、分类

  SQL注入按照数据库类型、注入位置、注入方法、注入绕过等可分为多种类型,在由学习到做题实际运用,SQL注入往往需要对多种类型尝试选取使用类型。

  按数据库数据类型可分为

  • 数字型
  • 字符型

  按注入的位置可分为

  • GET请求注入
  • POST请求注入
  • HTTP头注入

  按注入的方式分为 

  • 布尔与时间注入
  • 直接注入
  • 报错注入

  按对SQL注入防护绕过时的方法可分为

  • 字符变换绕过注入
  • 字符重构绕过注入
  • 宽字节注入

三、注入步骤

  1. 寻找注入点
  2. 选取注入方式
  3. 对选定方式构造SQL语句查询目标
  4. 得到结果

四、SQL注入语句查询主体

  以MYSQL为例,在5.0版本以后新增了"information_schema"库,各个数据库的库名,表名以及字段名都被存储在内,相当于一个数据汇总,故可以在辨明版本合适后从"information_schema"库查找所求数据,因为"information_schema"库内表以及表中的项固定,故该流程也相对固定,可以在找到合适的SQL注入类型后修改套用。以下流程以获取数据库用户名和对应密码最终目的。

  1. select version() 
  2. select group_concat(table_name) from information_schema.tables where table_schema=database()
  3. select group_concat(column_name) from information_schema.columns where table_name='users'
  4. 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。

 

posted @ 2021-01-31 16:26  Article_kelp  阅读(157)  评论(0)    收藏  举报