Pikachu-Sql Inject

Pikachu-Sql Inject

在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!                     

SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

第一步:注入点探测

  • 自动方式:使用web漏洞扫描工具,自动进行注入点发现
  • 手动方式:手工构造SQL注入测试语句进行注入点发现

第二步:信息获取

  通过注入点取得期望得到的数据

  • 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
  • 2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)

第三步:获取权限

  • 获取操作系统权限:通过数据库执行shell,上传木马

1.数字型注入(POST)

Pikachu-Sql Inject_第1张图片

 

 最简单的注入。

这里可以根据我们选择的 userid 返回用户名和邮箱

Pikachu-Sql Inject_第2张图片

 

 

正常来说,我们的数据是放在数据库里的,当我们提交了这个id的,后台会带这个参数到数据库里查询。

Pikachu-Sql Inject_第3张图片

 

 

构造注入,因为是数字型

1 or 1 = 1

发到 Repeater ,修改id参数的值,取出了数据库中全部数据

Pikachu-Sql Inject_第4张图片

 

 

2.字符型注入(GET)

可以看出这是一个get型注入

Pikachu-Sql Inject_第5张图片

 

 

构造闭合,闭合后台查询语句中的第一个单引号,然后注释掉第二个单引号

111' or 1 = 1#

这时候我们也能看到这个表中的全部信息了

Pikachu-Sql Inject_第6张图片

 

 

3.搜索型注入

这个功能运行我们输入用户名的一部分来查找,可以猜想后台使用了数据库中的搜索这个逻辑,比如用了 LIKE 。

构造对应的闭合,留下单引号和百分号,注释后面的部分。

aaa% 'or 1=1#

Pikachu-Sql Inject_第7张图片

 

 

 

4.XX型注入

后台存在各种方式拼接我们的SQL语句,所以我们需要尝试构造各种各样的闭合。

构造如下

111') or 1=1#

Pikachu-Sql Inject_第8张图片

 

 

 

5.insert/update注入

先输入一个单引号,提交后后台报错,说SQL语句错误,说明存在注入点。

技术图片

先注册

Pikachu-Sql Inject_第9张图片

 

 可以登录

Pikachu-Sql Inject_第10张图片

 

所谓 insert 注入是指我们前端注册的信息,后台会通过 insert 这个操作插入到数据库中。如果后台没对我们的输入做防 SQL 注入处理,我们就能在注册时通过拼接 SQL 注入。 

看一下报错:

 

 

我们继续利用 SQL注入漏洞,获取基础信息

基于 insert 下的报错来进行注入

111' or updatexml(1, concat(0x7e,database()), 0) or '
结果如下:
Pikachu-Sql Inject_第11张图片

 

 构造sql注入语句

111' and 1=(updatexml(1,concat(0x3a,(select user())),1)))#

Pikachu-Sql Inject_第12张图片

 

6、delete注入

这里有一个留言板,点删除可以把对应的留言删掉

Pikachu-Sql Inject_第13张图片

 

 

我们点删除并用 BurpSuite 抓包,实际上就是传递了一个留言的 id,后台根据这个 id 去删除

Pikachu-Sql Inject_第14张图片


后台可能的 SQL 语句如下

delete from message where id=1

我们发送到 Repeater 中继续进行实验,由于参数的值是数字型,所以后台可能存在数字型注入漏洞,构造:

1 or updatexml(1, concat(0x7e,database()), 0)

Pikachu-Sql Inject_第15张图片

 

 

 

 

 

结果如下:

Pikachu-Sql Inject_第16张图片

 

 

 

 

 

7.http header注入

Pikachu-Sql Inject_第17张图片

有些时候,后台开发人员为了验证客户端头信息(比如cookie验证),或者通过http header获取客户端的一些信息,比如useragent,accept字段等,会对客户端的http header信息进行获取并使用SQL进行处理,如果此时并没有足够的安全考虑,则可能会导致基于 http header 的 SQL 注入漏洞

先登录:

Pikachu-Sql Inject_第18张图片

 

 既然他获取了我的http头信息,所以应该是在http头构造sql语句。

Pikachu-Sql Inject_第19张图片

 

 

把 User-Agent 改为一个单引号,发包看看后台处理的结果,发现直接报了 SQL 语法错误

Pikachu-Sql Inject_第20张图片

 

 

这说明存在 SQL 注入漏洞,后台可能会 insert 到数据库中

 1 ' or updatexml(1,+concat(0x7e,database()), 0) or '

Pikachu-Sql Inject_第21张图片

 

 

 

8.盲注(based on boolian)

Pikachu-Sql Inject_第22张图片

 

 可以看出能输出相关值

再试试:

Pikachu-Sql Inject_第23张图片

 

 报告错误,说明有过滤

直接注释掉是有显示的

Pikachu-Sql Inject_第24张图片

 

 一个一个测试后,发现注册用户表单应该有两行

Pikachu-Sql Inject_第25张图片

 

 Pikachu-Sql Inject_第26张图片

 

 那就直接注入好了

-1' union select group_concat(id,username,pw,sex,phonenum,address,email),2 from member#

Pikachu-Sql Inject_第27张图片

 

 读出数据库

9.盲注(based on time)

Pikachu-Sql Inject_第28张图片

 

 Pikachu-Sql Inject_第29张图片

 

 数据可能没有传入后台,或者前端无论后端传回什么信息都不显示。

测试一下传入时间的测试:

Pikachu-Sql Inject_第30张图片

 

 五秒后传入,才显示了结果

于是构造payload

111' and  if((substr(database(), 1, 1))='p', sleep(5), null)#

 

 五秒之后成功查询,猜测成功 

10.宽字节注入

当我们输入有单引号时被转义为\’,无法构造 SQL 语句的时候,可以尝试宽字节注入。

在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入 payload

Pikachu-Sql Inject_第31张图片

 

 测试失败。

强行闭合一下:

Pikachu-Sql Inject_第32张图片

 

 也不行。

抓包上传试试看

Pikachu-Sql Inject_第33张图片

 

 成功爆出。

你可能感兴趣的:(Pikachu-Sql Inject)