1.概述
1.1发生原因
SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
1.2SQL注入攻击流程
第一步:注入点探测
- 自动方式:使用web漏洞扫描工具,自动进行注入点发现
- 手动方式:手工构造SQL注入测试语句进行注入点发现
第二步:信息获取
通过注入点取得期望得到的数据
- 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
- 2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)
第三步:获取权限
- 获取操作系统权限:通过数据库执行shell,上传木马
1.3注入点类型
分类根据:输入的变量传入到SQL语句是以什么类型拼接的
- 数字型:user_id=$id
- 字符型:user_id=‘$id‘
- 搜索型:text LIKE ‘%{$_GET[‘search‘]}%‘"
2.数字型注入(POST)
这里可以根据我们选择的 userid 返回用户名和邮箱
因为是用POST语句取得我们传递的参数值,传递给一个变量,再到数据库查询。所以我们猜测后台的查询语句大概是下面这样的
$id=$_POST[‘id‘] select 字段1,字段2 from 表名 where id=1$id
下面我 BurpSuite 抓包来测试一下
把传入的参数改成1 or 1=1,看看返回的结果
注入成功
三、字符型注入
kobe‘ or 1=1#
注入成功
四、搜索型注入
k%‘ or 1=1#
注入成功
五.XX型注入
构造的payload如下
kobe‘) or 1=1#
六、insert/update注入
我们就填必填的两项,用户那里输入单引号,密码随便输入,页面会有报错信息,说明存在SQL注入漏洞
这种情况下,我们知道后台使用的是 insert 语句,我们一般可以通过 or 进行闭合。后台的 SQL 语句可能是下面这个样子
insert into member(username,pw,sex,phonenum,email,adderss) values(‘doge‘, 11111, 1, 2, 3, 4);
构造下面的 payload,基于 insert 下的报错来进行注入
adminminmin 'or updatexml(1, concat(0x7e,database()), 0) or '两个单引号分别闭合 values数据的前后两个单引号,所以不用注释后面的句子

注入成功
七、delete注入
这里有一个留言板,点删除可以把对应的留言删掉我们点删除并用 BurpSuite 抓包,实际上就是传递了一个留言的 id,后台根据这个 id 去删除留言
构造出 or updatexml(1, concat(0x7e,database()), 0) 在id=67后
八、http header 注入
有些时候,后台开发人员为了验证客户端头信息(比如cookie验证)
或者通过http header获取客户端的一些信息,比如useragent,accept字段等
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时并没有足够的安全考虑
则可能会导致基于 http header 的 SQL 注入漏洞
登陆之后会记录以下信息
下面BurpSuite修改发包内容
把 User-Agent 改为一个单引号,发包看看后台处理的结果,发现直接报了 SQL 语法错误
还有 cookie 也是可以注入的,后端可能会取得我们的 cookie,后端通过拼接 SQL 语句进行验证
九、盲注boolian
我们在皮卡丘平台一进行实验,输入下面的测试语句
kobe‘ and 1=1#

kobe‘ and 1=2#

于是利用and来构造payload
kobe' and ascii(substr(database(),1,1))=112 #
来一个个进行测试,爆出database
不对的话就会出现用户名不存在,正确的话就会出现用户正确信息,可采用二分法来减少盲注次数
十、盲注time
发现其存在时间盲注,只要kobe存在就会执行后面的响应五秒延迟
根据这个在加上测试
payload: kobe' and if((substr(database(),1,1))='p',sleep(4),null) #
此时412ms就返回结果,说明数据库名第一位是p
将p改为a,则1ms返回结果
说明数据库名第一位是p
十一、宽字节注入
当我们用通常的测试 payload时,是无法执行成功的,下面的payload会报错
kobe‘ or 1=1#

抓包看一下
因为在后台单引号会被转义,在数据库中执行时多了个反斜杠。我们可以用下面的payload,在单引号前面加上 %df,让单引号成功逃逸
kobe%df‘ or 1=1#
成功