目录
一: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 开发者工具查看时间。