目录
在一切开始之前,我们先来了解一下sql-labs。
SQL-Labs是一个专注于SQL注入攻击的在线靶场,提供了从基础到高级的多个关卡,供学习者实践和挑战
一、注入方式简要概括
1.1 SQL常见注入方式
- 错误注入(Error-based Injection):攻击者利用应用程序返回的错误消息来识别漏洞。通过在SQL查询中插入恶意代码引发数据库错误,根据错误消息获得关于数据库结构和内容的信息;
- 联合查询注入(Union-based Injection): 利用UNION操作符将多个查询结果合并成一个结果集,获取数据库中其他表的数据,从而泄露敏感信息;
- 时间盲注(Time- based Blind Injection):攻击者通过在SQL查询中插入恶意代码,利用数据库的延时函数来确定查询是否成功执行,通过观察应用程序在响应时间方面的差异推断数据库信息;
- 布尔盲注(Boolean-based Blind Injection):通过在SQL查询语句中插入恶意代码,利用布尔逻辑来逐位猜测查询结果,通过观察应用程序在不同条件下的行为来推断数据库信息;
- 存储过程注入(Stored Procedure Injection):攻击者利用应用程序调用的存储过程中存在的漏洞,通过插入恶意参数执行未经授权的数据库操作;
- 盲注(Blind Injection):包括布尔盲注、时间盲注和基于报错的注入,攻击者通过观察页面的响应来判断数据库中的信息;
- 堆叠注入:在SQL语句末尾添加额外的SQL语句,执行多条SQL命令;
- 二次注入:攻击者通过构造数据,使得在第二次请求中执行第一次请求中构造的SQL语句;
- User-Agent注入:通过修改HTTP头中的User- Agent字段进行注入;
- Cookie注入:通过在Cookie中注入恶意的SQL代码;
- 宽字节注入:利用字符编码特性进行注入,常见于使用GBK编码的数据库。
1.2 爆破函数
1.经度爆破(mysql>=5.7x)
and ST_LatFromGeoHash(concat(0x7e,(select user()),0x7e))--+
2.纬度爆破(mysql>=5.7x)
and ST_LongFromGeoHash(concat(0x7e,(select user()),0x7e))--+
3.获取数据库版本信息
')or (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
select count(*), concat(version(), floor(rand(0) * 2))x from information
4.获取当前数据库
')or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
5.updatexml()
updatexml(1,1,1) 一共可以接收三个参数,报错位置在第二个参数
6.extractvalue()
extractvalue(1,1) 一共可以接收两个参数,报错位置在第二个参数
二、靶场实操
2.1 Less-1
2.1.1 判断类型
现在,让我们来正式开始靶场实操。
来到第一关
对于很多SQL注入漏洞,我们第一步要做的是判断“是否存在漏洞”,下面的字提示我们输入数字值的id作为参数,我们输入一个1来试一下
?id=1
同理再将id改为2或3,输入结果不同。不同的数字值返回不同的内容,这说明我们输入的内容被直接代入到数据库查询语句中,在数据库里面查询了。
接下来我们判断SQL语句是否拼接,是字符型还是数字型
我们在id=1后加了一个单引号,结果数据库报错,这说明数据库存在漏洞。继续使用--注释掉后续的内容,又返回了正确的结果,至此注入初获成功。
上面的实验验证了第一关为字符型且存在SQL注入漏洞。因为该页面存在回显,所以我们可以使用联合查询来攻破。
2.1.2 联合注入查询
联合注入的第一步首先要知道表格有几列,如果报错就是超过列数,如果正常显示就是没有超出
?id=1'order by 3 --+
order by 3的时候还正常输出,4的时候报错,这证明此数据库有三列。
第二步我们要爆出显示位,也就是看表格里面哪一列会在页面显示。
?id=-1'union select 1,2,3 --+
可以看出表格的第2,3列是在页面中显示的,这说明本表格大概是一个如下的结构,第一列是id之类的标识字段,在页面中不显示,第二列是名字,第三列是密码。(注意:我们这里只说明了有三列数据,并没有证明有几行,在上面博主只是做了id=1,2,3的三个例子,很可能不只三行)