Pikachu靶场-SQL Inject
SQL Inject 漏洞原理概述
owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
SQL Inject攻击流程
第一步:注入点探测
自动:使用web漏洞扫描工具,自动进行注入点的发现
手动:手工构造sql inject测试语句注入点发现
第二步:信息获取
通过注入点去取到期望的数据
1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息
2.数据库信息:数据库名称,数据库表,表字段 ,字段内容
第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
如何判断是否存在注入
1.显错注入的判断方法
如这么一个网站www.example.com/index.php?id=1,首先第一步我们先进行是否存在注入的判断,先在
数字1后加单引号 ',若页面处错,则存在Sql注入,但注入点是否可利用还和服务端代码和服务器配置息息
相关(如过滤一些危险函数或者限制参数的长度时就不可以利用)。其次还可以使用逻辑符号来判断是否
存在注入,参数后加and 1=1和and 1=2,若and 1=1页面返回正常,and 1=2返回错误时,则存在Sql注
入(这是Sql语法运算符的特点,SQL AND & OR 运算符如果第一个条件和第二个条件都成立,则 AND 运
算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。),
否则不一定存在注入。 同理也可以使用or来判断是否存在注入。需要注意的是,我们需要根据注入点的类
型来判断是否需要在整个参数中添加注释符或引号。
2.不显错的判断方法
在单引号and和or下都不报错时,也可能存在注入,由于服务器可能配置在参数错误时依然返回原有页
面,这样即使存在注入页面也不会发生变化了。我们可利用页面返回时间来判断是否存在注入,如and
if(1=0,1, sleep(10)),注意是否需要使用单引号或者注释符。不同的数据库有不同的延时函数,需要
结合具体情况来使用。
如何判断注入点类型及常见注入类型
常见类型
· 数字型 user id=$id
· 字符型 user id='$id'
· 搜索型 text like '%{$_GET['search']}%'
如何判断常见类型呢?
我们就是看他输入的变量,当变量传到sql语句中的时候,是以什么类型拼接进去的
纯数字类型的话,就是数字型
如果是有单引号或者双引号,以一个字符串的形式拼接进去,就是字符型
如果有like ‘% %’这样的,就是搜索型
数字型
首先还是看我们的Pikachu
这就是一个输入点
我们来搜索看一下
可以看到参数不是在URL中提交,可见它是post请求
我们来抓包看一看
这时候,我们来想一想,它后台是个什么操作
前端接受到这个数字1
然后,前端获取到输入后,把这个输入放到对应的数据库操作中
然后获取数据库的信息
大致是这么个流程吧
那么它通过sql语句操作数据库的地方是怎么搞呢?
我们猜测
后端通过查询1,然后返回了email和name
大致就是 select 字段1,字段2 from 表名 where id=1;
这样的话,我们就清楚了
如果构造一个非法的sql语句,它会不会去执行呢?
我们来试试
select 字段1,字段2 from 表名 where id=1 or 1=1;
我们将刚刚抓到的包中数据修改,然后Forward
发现数据都被显示了出来
其实这就是一个数字型注入的sql漏洞
字符型
我们来看字符型
我们输入kobe看看
我们的id为3,邮箱为kobe@pikachu.com
我们还是像数字型一样,想想它是怎么个操作
我们猜想它操作数据库的语句
select 字段1,字段2,from 表名 where username ='kobe';
(这边要说一下,因为是字符串,如果没有这个单引号的话,就会报错)
那么,我们来构造一个payload,我们根据之前的思路
kobe or 1=1
会发现,查不出来,这就是这个单引号的问题
这里我们就要构造闭合了
kobe’ or 1=1 #
这里我们解释一下,单引号就是为了闭合前面的单引号,#就是为了注释后面的单引号
构造完成后,我们来试试
提交后
成功输出全部内容
这里如果想要通过url来写的话,还需要多做一个URL的编码