SQL注入基础知识

Posted JNMCSEC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入基础知识相关的知识,希望对你有一定的参考价值。

在owasp年度top 10 安全问题中,SQL注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

1.对于Web应用程序而言,用户核心数据存储在数据库中,例如mysqlSQL serverOracle2.通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作3.SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程4.因为SQL注入漏洞造成的严重危害性,所以常年稳居owasp top 10的榜首

常见的SQL注入类型

1)可回显注入

  • 可以联合查询的注入

  • 报错注入

  • 通过注入进行DNS请求,从而达到可回显的目的

2)不可回显注入

  • Bool盲注

  • 时间盲注

1.1 可以联合查询的注入

在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,例如

<?php...$id = $_GET['id'];$getid = "SELECT id FROM users WHERE user_id = '$id'";$resuit = mysql_query($getid) or ide('<pre>'.mysql_error().'<pre>');$num = mysql_numrows($result);...?>

我们注意看上方的SQL语句中的$id变量,该变量会将GET获取到的参数直接拼接到SQL语句中,加入此时传入一下参数:

?id = -1' union select 1 -- 

拼接后SQL语句就变成了:

SELECT id FROM users WHERE user_id = '-1' union select 1 -- '

闭合前面的单引号,注释掉后面的单引号,中间写上需要的Payload就可以了。

联合查询是最简单的一种SQL注入方法,所以大多数情况下都需要绕过某些特定字符或者是特定单词比如:空格 或者 select、and、or等字符串

1.2 报错注入

updatexml

updatexml的报错原理从本质上来说就是函数的报错

?id = 1' updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23


1.3 Bool盲注

Bool盲注通常是由于开发者将报错信息屏蔽而导致的,但是网页中真和假有着不同的回显,比如为真时返回access,为假时返回false;或者为真时返回正常页面,为假时跳转到错误页面


Bool盲注中通常会配套使用一些判断真假的语句来进行判定。常用的发现Bool盲注的方法是在输入点后面添加and 1=1和and 1=2 (该Payload应在怀疑是整型注入的情况下使用)


Bool盲注的原理是如果题目后端拼接了SQL语句,and 1=1为真时不会影响执行结果,但是and 1=2为假,页面则可能会没有正常的回显


有时我们可能会遇到将1=1过滤掉的SQL注入点,这时候我们可以通过修改关键字来绕过过滤,比如将关键字修改为不常见的数值如1352=1352

  


  


1.4 时间盲注

时间盲注出现的本质原因也是由于后端拼接了SQL语句,但是正确和错误存在明显的回显。错误信息被过滤,不过,可以通过页面响应时间进行按位判断数据。


时间盲注类似于Bool盲注,只不过是在验证阶段有所不同。Bool盲注是根据页面回显的不同来判断的,而时间盲注是根据页面响应时间来判断结果的。


sleep()函数

sleep是睡眠函数,可以使查询数据时回显数据的响应时间加长。

sleep(5),页面返回将延迟5秒

sleep()函数 sleep是睡眠函数,可以使查询数据时回显数据的响应时间加长。  sleep5),页面返回将延迟5

注入点的位置及发现

GET参数中的注入




POST中的注入

POST中的注入点一般需要我们通过抓包操作来发现,如使用BurpSuite或者浏览器插件Hackbar来发送POST包。同样也可以使用sqlmap自动注入或者手工注入等方式验证是否存在注入漏洞



User-Agent中的注入

推荐使用BurpSuite的Repeater模块,或者sqlmap自动注入。将sqlmap的参数设置为level=3,这样sqlmap会自动检测User-Agent中是否存在注入漏洞



Cookies中的注入

同样推荐BurpSuite中的Repeater模块。在sqlmap中也可以设置参数level=2,这样sqlmap就会自动检测Cookies中是否存在注入漏洞


判断注入点是否存在

判断注入点是否存在1)插入单引号 插入单引号是我们最常使用的检测方法,原理在于未闭合的单引号会引起SQL语句单引号未闭合的错误。所以输入一个单引号并且成功报错,说明此处存在SQL注入漏洞2)数字型判断 通过and 1=1(数字型)和闭合单引号测试语句'and'1'='1(字符串型)进行判断,这里采用Payload'1'='1的目的是为了闭合原语句后方的单引号 (3)通过数字的加减进行判断  比如,一个链接http://xxxx.com/?id=2,可以尝试http://xxxx.com/?id=3-1,如果结果与http://xxxx.com/?id=2相同,则证明id这个输入点可能存在SQL注入漏洞

绕过方法

一般来说有关SQL注入的地方都会重点防御。所以,要掌握花式的绕过技术。

1.过滤关键字

即过滤如select、or、from等的关键字。有些防御手段还会降这些关键字替换为空。这时候我们可以用穿插关键字的方法绕过

select -- selselectector -- oorrunion -- uniunionon...

又或者大小写来绕过


select -- SelECtor -- oRunion  --  UniON


有时候,过滤函数是通过十六进制进行过滤的。我们可以对关键字的个别字母进行替换


select -- slelc\x74or -- o\x72union  --  unio\x6e


有时候还可以通过双重URL编码进行绕过操作


from -- %25%36%36%25%36%66%25%37%32%25%36%64or  --  %25%36%66%25%37%32


2.过滤空格

还有一些后端开发人员并没有对关键字进行过滤,反而对空格进行了过滤

1)通过注释绕过,一般的注释符:

#--///**/%00

 


这时候我们可以通过这些注释符来绕过空格符

select/**/username/**/from/**/user

2)通过URL编码绕过,我们知道空格的编码是%20,所以可以通过二次URL编码进行绕过

%20  --  %252

3.绕过相等过滤

有技术大牛曾研究过,MySQL中存在utf8_unicode_ci和utf8_general_ci两种编码格式。utf8_general_ci不仅不区分大小写,而且Ä=A,Ö=O,Ü=U这三种等式都成立。对于utf8_general_ci等式β=s是成立的,但是对于utf8_unicode_ci,等式β=ss才是成立的


以上是关于SQL注入基础知识的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

PHP代码审计入门(SQL注入漏洞挖掘基础)

mybatis以及预编译如何防止SQL注入

手机只需发条消息即可开始大规模SQL注入攻击

4个单词,谷歌返回16个SQL注入漏洞