一、注入分类
1、依据注入点类型分类
- 数字类型的注入
- 字符串类型的注入(单引号、双引号、加括号等)
- 搜索型注入
2、依据提交方式分类
- GET注入
- POST注入
- COOKIE注入
- HTTP头注入(XFF注入、UA注入、REFERER注入)
3、依据获取信息的方式分类
- 基于布尔的盲注
- 基于时间的盲注
- 基于报错的注入
- 联合查询注入
- 堆查询注入 (可同时执行多条语句)
二、注入判断
1、工具扫描
常见的网站漏洞扫描工具:AWVS、AppScan、OWASP-ZAP、Nessus 等
2、手动测试
a. 添加单引号 ' 、双引号 '' 、单括号 ) 、双括号 )) ,进行组合测试,看是否报错,如果报错,就可能SQL注入漏洞。
b.对于数字型:
语句:and 1=1 ;and 1=2 (经典)
结果:在URL后面加 and 1=1 、 and 1=2 看页面是否显示一样,显示不一样的话,肯定存在SQL注入漏洞了。
分析:and 的意思是“和”如果没有过滤我们的语句,and 1=1就会被代入SQL查询语句进行查询,
如果and前后的两条语句都是真的话就不会出错,但如果前后语句有一个为假的话,程序就会暴错。也就表明程序有注入漏洞。
c.对于字符型:
语句:' and '1'=1;' and '1=2(经典)
结果:分别返回不同的页面,说明存在注入漏洞。
分析:加入' and '1'=1返回正确页面,加入' and '1=2返回错误页面,说明有注入漏洞。
d.Timing Attack测试:
也就是时间盲注。有时候通过简单的条件语句比如 and 1=2 是无法看出异常的。
三、盲注
盲注:就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的信息,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到了执行。
例:这是sqli的Less-5,我自己对源码稍微改动了一下,使得页面会显示执行的sql语句
通过输入 http://127.0.0.1/sqli/Less-1/?id=1 我们得到了下面的页面
然后输入 http://127.0.0.1/sqli/Less-5/?id=-1 我们得到下面的页面
当我们输入 http://127.0.0.1/sqli/Less-5/?id=1' 我们得到下面的页面
由此可以看出代码把 id 当成了字符来处理,而且后面还有一个限制显示的行数 limit 0,1 。当我们输入的语句正确时,就显示You are in.... 当我们输入的语句错误时,就不显示任何数据。当我们的语句有语法错误时,就报出 SQL 语句错误。
于是,我们可以推断出页面的源代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; //sql查询语句
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){ //如果查询到数据
echo 'You are in...........';
}else{ //如果没查询到数据
print_r(mysql_error());
}
于是我们可以通过构造一些判断语句,通过页面是否显示来证实我们的猜想。盲注一般用到的一些函数:ascii() 、substr() 、length(),exists()、concat() 等
1、布尔盲注
1.1 什么是布尔盲注
例:?id=1' and '1 、 ?id=1' and 'a (这里没有使用注释符号进行后面的单引号闭合,使用的是手工单引号闭合)或者 ?id=1' and 1=1# 、 ?id=1' and 1=2#
1.2 布尔盲注利用前提
页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入。
2、时间盲注
在MySQL中,有一个Benchmark() 函数,它是用于测试性能的。 Benchmark(count,expr) ,这个函数执行的结果,是将表达式 expr 执行 count 次 。
因此,利用benchmark函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长,通过时间长短的变化,可以判断注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中被称为Timing Attack,也就是时间盲注。
MySQL | benchmark(100000000,md(5)) sleep(3) |
PostgreSQL | PG_sleep(5) Generate_series(1,1000000) |
SQLServer | waitfor delay '0:0:5' |
易出现SQL注入的功能:凡是和数据库有交互的地方都容易出现SQL注入,SQL注入经常出现在登陆页面、涉及获取HTTP头(user-agent / client-ip等)的功能点及订单处理等地方。例如登陆页面,除常见的万能密码,post 数据注入外也有可能发生在HTTP头中的 client-ip 和 x-forward-for 等字段处。这些字段是用来记录登陆的 i p的,有可能会被存储进数据库中从而与数据库发生交互导致sql注入。