pikachu靶场--SQL inject--insert/update/delete/HTTP header注入/盲注【4.5】~【4.9】

目录

一:insert/update注入

二:delete注入

三:HTTP header注入

四:SQL盲注

1.base on boolean(基于真假)

2.base on time(基于时间)

五:SQL inject 防范措施



一:insert/update注入

由图可知,后端用的是insert来和我们输入的内容进行拼接。所以我们要构造对应的闭合:用or来构造闭合。

用户这一行,输进去是要被‘’包裹起来的,因为用户名是char或者varchar类型。因此,我们可以构造闭合xxx' or updatexml(1,concat(0x7e,database()),0) or' ,这样,返回的报错内容里就有我们所需要的信息。

Update型也是如此,在修改信息的位置输入构造好的闭合,然后利用报错内容获取信息。


二:delete注入

每删掉一个留言,在后台其实是删掉了id=“”的message,因此真正传到后台的是一个id,是一个数值,所以我们不要需要单引号来构造闭合了,直接 :

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

点击删除之后,打开bp,将其发送到repeater模块,将id=“”改为id=“1 or xxx' or updatexml(1,concat(0x7e,database()),0) ”然后,对其进行url关键字编码,跑一下,即可在response中获取到相应的信息。

Insert/update/delete型注入利用的是函数报错获取信息,不同于之前的union联合查询,这三种是操作,不是查询。


三:HTTP header注入

这是一种场景,不是一种方法。

Pikachu平台上做相关演示:

首先登录(admin/123456),可以看到如下内容:

打开bp,找到这一个get请求,发送到repeater模块,修改 user agent为xxx' or updatexml(1,concat(0x7e,database()),0) or'  在报错信息中就可以获取我们所需要的信息了。 


四:SQL盲注

在某些情况下,后台会对错误信息进行处理,会将其屏蔽,或者用一种标准的输出来输出到前端,同时,当我们构造一些payload输进去时,它并不会把多余的内容在页面上去进行显示。

1.base on boolean(基于真假)

我们可以输入 kobe ‘ and 1=1#  页面显示:

由此可见,它存在着sqli漏洞,因为后台已经把我们输入的and 1=1# 和 and 1=2#拼接到sql语句中并且做了逻辑判断。那么在这种情况下,我们如何去获取数据?先讲一点关于sql的补充知识,打开我们的MySQL数据库。

substr(database(),1,1)意思是把database()的结果取值,取从第1个字符开始的第1个字符,再包裹一层ascii(),意思是将取出的字符转换成ASCII码输出,这里我们的数据库名称为apache,所以结果依次为:a ,97 。后面再加一个 <100,结果为1 ,意思是“真”。所以我们可以根据它的真假,判断字符到底是什么。

输入

 kobe ' and  ascii(substr(database(),1,1))>100#  返回了kobe信息,说明为真

 kobe ' and  ascii(substr(database(),1,1))>111#  返回了kobe信息,说明为真

 kobe ' and  ascii(substr(database(),1,1))>112#  未返回了kobe信息,说明为假

由此可知 数据库第一个字符为112 --“p”

那么如何得知数据库有几个字符呢?

可以输入  kobe ' and length(database())>6#   返回了kobe信息,说明为真

                kobe ' and length(database())>7#   未返回了kobe信息,说明为假

说明有7个字符,到时候是需要我们自己猜的!实际测试过程中,我们是要用工具的!

2.base on time(基于时间)

如果说基于boolean的盲注在页面上还可以看到0 or 1的回显的话,那么基于time的盲注就说明也看不到了!但还有一个条件,就是“时间”,通过特定的输入,判断后台执行的是时间,从而确定注入。

在mysql中有一个函数:sleep(k)函数,既可以让后台休息k秒钟再去去执行命令,那么我们就可以构造基于时间延迟的闭合:

kobe ‘ and if((substr(database(),1,1))=’p’,sleep(5),null)#

如果该数据库名称第一个字符为p的话,那么这个命令执行时间就比其他的多5000毫秒,可以通过web 开发者工具查看时间。


五:SQL inject 防范措施

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值