SQL注入基础知识

萝らか妹 提交于 2020-10-05 09:05:34

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

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

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

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

%20	--	%2520

3.绕过相等过滤

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

#
--
//
/**/
%00

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

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

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才是成立的

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!