SQL注入基础知识
在owasp年度top 10 安全问题中,SQL注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
1.对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL server、Oracle
2.通过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秒
注入点的位置及发现
GET参数中的注入
GET中的注入点一般最容易发现,因为我们可以在地址栏中获得URL和参数等,可以用sqlmap自动注入或者手工注入等验证是否存在注入漏洞
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 -- selselectect
or -- oorr
union -- uniunionon
...
又或者大小写来绕过
select -- SelECt
or -- oR
union -- UniOn
有时候,过滤函数是通过十六进制进行过滤的。我们可以对关键字的个别字母进行替换
select -- slelc\x74
or -- o\x72
union -- unio\x6e
有时候还可以通过双重URL编码进行绕过操作
from -- %25%36%36%25%36%66%25%37%32%25%36%64
or -- %25%36%66%25%37%32
2.过滤空格
还有一些后端开发人员并没有对关键字进行过滤,反而对空格进行了过滤
1)通过注释绕过,一般的注释符:
#
--
//
%00
这时候我们可以通过这些注释符来绕过空格符
selectusernamefromuser
2)通过URL编码绕过,我们知道空格的编码是%20,所以可以通过二次URL编码进行绕过
%20 -- %2520
3.绕过相等过滤
1)通过注释绕过,一般的注释符:
#
--
//
%00
这时候我们可以通过这些注释符来绕过空格符
selectusernamefromuser
2)通过URL编码绕过,我们知道空格的编码是%20,所以可以通过二次URL编码进行绕过
%20 -- %2520
3.绕过相等过滤
有技术大牛曾研究过,MySQL中存在utf8_unicode_ci和utf8_general_ci两种编码格式。utf8_general_ci不仅不区分大小写,而且Ä=A,Ö=O,Ü=U这三种等式都成立。对于utf8_general_ci等式β=s是成立的,但是对于utf8_unicode_ci,等式β=ss才是成立的