在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的榜首1)可回显注入
可以联合查询的注入报错注入通过注入进行DNS请求,从而达到可回显的目的2)不可回显注入
Bool盲注时间盲注在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,例如
<?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等字符串
updatexml
updatexml的报错原理从本质上来说就是函数的报错
?id = 1' updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
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
时间盲注出现的本质原因也是由于后端拼接了SQL语句,但是正确和错误存在明显的回显。错误信息被过滤,不过,可以通过页面响应时间进行按位判断数据。
时间盲注类似于Bool盲注,只不过是在验证阶段有所不同。Bool盲注是根据页面回显的不同来判断的,而时间盲注是根据页面响应时间来判断结果的。
sleep()函数 sleep是睡眠函数,可以使查询数据时回显数据的响应时间加长。 sleep(5),页面返回将延迟5秒
GET中的注入点一般最容易发现,因为我们可以在地址栏中获得URL和参数等,可以用sqlmap自动注入或者手工注入等验证是否存在注入漏洞
POST中的注入点一般需要我们通过抓包操作来发现,如使用BurpSuite或者浏览器插件Hackbar来发送POST包。同样也可以使用sqlmap自动注入或者手工注入等方式验证是否存在注入漏洞
推荐使用BurpSuite的Repeater模块,或者sqlmap自动注入。将sqlmap的参数设置为level=3,这样sqlmap会自动检测User-Agent中是否存在注入漏洞
同样推荐BurpSuite中的Repeater模块。在sqlmap中也可以设置参数level=2,这样sqlmap就会自动检测Cookies中是否存在注入漏洞
一般来说有关SQL注入的地方都会重点防御。所以,要掌握花式的绕过技术。
即过滤如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 -- %66%6f%72%6d or -- %6f%72还有一些后端开发人员并没有对关键字进行过滤,反而对空格进行了过滤
1)通过注释绕过,一般的注释符:
# -- // /**/这时候我们可以通过这些注释符来绕过空格符
select/**/username/**/from/**/user2)通过URL编码绕过,我们知道空格的编码是 ,所以可以通过二次URL编码进行绕过
-- %201)通过注释绕过,一般的注释符:
# -- // /**/这时候我们可以通过这些注释符来绕过空格符
select/**/username/**/from/**/user2)通过URL编码绕过,我们知道空格的编码是 ,所以可以通过二次URL编码进行绕过
-- %20有技术大牛曾研究过,MySQL中存在utf8_unicode_ci和utf8_general_ci两种编码格式。utf8_general_ci不仅不区分大小写,而且Ä=A,Ö=O,Ü=U这三种等式都成立。对于utf8_general_ci等式β=s是成立的,但是对于utf8_unicode_ci,等式β=ss才是成立的