前言

前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御。有攻必有防,当然还要来探讨一下SQL注入防御技巧。

目录


第五节 避开过滤方法总结

  • 5.1、大小写变种
  • 5.2、URL编码
  • 5.3、SQL注释
  • 5.4、空字节
  • 5.5、二阶SQL注入


第六节 探讨SQL注入防御技巧

  • 6.1、输入验证
  • 6.2、编码输出

正文

  • 第五节 避开过滤方法总结

Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以通过外部实现,比如Web应用防火墙和入侵防御系统。避开过滤的方法是灵活的,本节我总结了一些常用的技巧。在我们不知道过滤规则的时候可以尝试一下。

5.1、大小写变种

这种技巧适用于关键字阻塞过滤器不聪明的时候,我们可以变换关键字字符串中字符的大小写来避开过滤,因为使用不区分大小写的方式处理SQL关键字。
例如:(下面的代码就是一个简单的关键字阻塞过滤器)

function waf($id1){
    if(strstr($id1,'union')){
        echo 'error:lllegal input';
        return;
    }
    return $id1;
}

这段代码的缺陷就在strstr()函数是对大小写敏感的,所以我们可以通过大小写变种来绕过。

=

5.2、URL编码

URL编码用途广泛,可以通过它绕过多种类型的输入过滤器。

function waf($id1){
    if(strstr($id1,' ') || strstr($id1,'/**/')){
        echo 'error:lllegal input';
        return;
    }
    return $id1;
}

双URL编码有时候会起作用,如果Web应用多次解码,在最后一次解码之前应用其输入过滤器。
 
因为双URL编码,第一次解码%2f%2a进入输入过滤器,所以成功绕过了。当然这个使用前提是后面有一个URL解码。

5.3、SQL注释

很多开发人员认为,将输入限制为单个就可以限制SQL注入攻击,所以他们往往就只是阻止各种空白符。

 
function waf($id1){
    if(strstr($id1,' ')){
        echo 'error:lllegal input';
        return;
    }
    return $id1;
}

但是内联注释不使用空格就可以构造任意复杂的SQL语句。

5.4、空字节

通常的输入过滤器都是在应用程序之外的代码实现的。比如入侵检测系统(IDS),这些系统一般是由原生编程语言开发而成,比如C++,为什么空字节能起作用呢,就是因为在原生变成语言中,根据字符串起始位置到第一个出现空字节的位置来确定字符串长度。所以说空字节就有效的终止了字符串。

只需要在过滤器阻止的字符串前面提供一个采用URL编码的空字节即可,例如:

%' union select username,password from users where username='admin' --
 

5.5、二阶SQL注入

实际上到目前为止,你在网上大部分搜索SQL注入文章 基本都可以归类到"一阶(first-order)"SQL注入中,因为这些例子涉及的事件均发生在单个HTTP请求和响应中,如下所示:

(1) 攻击者在HTTP请求中提交某种经过构思的输入。

(2) 应用处理输入,导致攻击者注入的SQL查询被执行。

(3) 如果可行的话,会在应用对请求的响应中向攻击者返回查询结果。

另一种不同的SQL注入攻击是"二阶(second-order)"SQL注入,这种攻击的事件时序通常如下所示:

(1) 攻击者在HTTP请求中提交某种经过构思的输入。

(2) 应用存储该输入(通常保存在数据库中)以便后面使用并响应请求。

(3) 攻击者提交第二个(不同的)请求。

(4) 为处理第二个请求,应用会检索已经存储的输入并处理它,从而导致攻击者注入的SQL查询被执行。

(5) 如果可行的话,会在应用对第二个请求的响应中向攻击者返回查询结果。

从字面上来看二阶SQL注入对于新手很难理解,所以我来介绍一个经典的例子帮助大家理解。

这是一个个人信息应用程序,我们可以更新我们的用户名,也可以查看我们的个人信息。

第二步查看我们个人信息时的SQL语句:

select * from users where username = '$name'
 

查询的语句所用到的变量name就是从数据库提取到的我们的用户名,所以我们可以先利用更新我们的用户名功能插入语句进数据库。

这样查看我们个人信息的时候就成功执行了我们的SQL注入攻击。

例如:我们在用户名插入

[SQL] 纯文本查看 复制代码
zusheng' or  ''='

那么后面我们就执行了语句

select * from users where username = 'zusheng' or ''=''
  • 第六节 探讨SQL注入防御技巧

6.1、输入验证

输入验证是指要验证所有应用程序接收到的输入是否合法。

有两中不同类型的输入验证方法:白名单和黑名单验证

白名单验证:比如id值,那么我们判断它是否为数字。

黑名单验证:使用正则表达式禁止使用某些字符和字符串

应该尽量使用白名单,对于无法使用白名单的,使用黑名单提供局部限制。

6.2、编码输出

我们除了要验证应用程序收到的输入以外,还要对数据进行编码,这样不仅可以防御SQL注入攻击,还能防止出现其他问题,比如XSS。

结束语

因为本人技术有限,所以对防御技巧了解并不是深入,希望有更好防御技巧的小伙伴可以分享一下心得,我会将收到的技巧加入本文,提供给更多的小伙伴进行参考,谢谢了。

系列文章预告及导航

渗透攻防Web篇-SQL注入攻击初级(状态:已更新)

  • 第一节 注入攻击原理及自己编写注入点
  • 第二节 寻找及确认SQL注入

渗透攻防Web篇-SQL注入攻击中级(状态:已更新)

【渗透攻防Web篇】SQL注入攻击高级的更多相关文章

  1. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...

  2. 【渗透攻防WEB篇】SQL注入攻击初级

    前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...

  3. 渗透攻防Web篇-深入浅出SQL注入

    1 背景 京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致. 2 手工检测 2.1 前 ...

  4. SQL注入攻击三部曲之高级篇

    SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...

  5. 2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践

    第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...

  6. SQL注入攻击三部曲之进阶篇

    SQL注入攻击三部曲之进阶篇 通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的.本篇文章我们将进一步的分析SQL注入攻击. ...

  7. SQL注入攻击三部曲之入门篇

    SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...

  8. 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践

    <网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理   在计算机内部,输入数据通常被存放在一个临时空间内, ...

  9. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

随机推荐

  1. Mybatis SqlsessionFactory

    在Mybatis 与 Spring 进行整合的时候,我们会进行sqlSessionFactory 的配置,来创建sqlSessionFactory 对象:如下: <bean id="s ...

  2. python_字符编码

    一 了解字符编码的知识储备 1.计算机基础知识 2.电脑存放组成: 硬盘 - 内存 -(二级缓存.一级缓存.cpu寄存器)- cpu # cpu交互的是用户能识别的数据:字符# 硬盘中最终存储的数据: ...

  3. 手机设备上touchstart与click的区别

    1.基本定义 touchstart 手指触碰开始就能触发 click 1.手指触碰 2.手指未在屏幕上移动 3.在这个dom上手指离开屏幕 4.触摸和离开屏幕之间的时间间隔较短 因此,click事件有 ...

  4. mysql 悲观锁与乐观锁的理解

    悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段. 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈. 一.悲观锁 顾名思义,就是对于数据的 ...

  5. mac pfctl / centos iptables 使用

    mac使用pfctl 为了测试zk client的重连功能,需要模拟zk client与zk server网络连接出现问题的情况,经过查询资料发现可以使用防火墙阻止zk server启动端口上的流量实 ...

  6. BP算法的矩阵推导

    目录 1. 需要的微积分知识 1.1 导数 1.2 求导的链式法则 2. 梯度下降法 2.1 梯度 2.2 梯度算法的解释 3.误差反向传播算法 3.1 理论推导 3.1.1 符号说明 3.1.2 推 ...

  7. 从本地上传项目到 github 以及从github 下载项目到本地环境

    前置条件:成功安装github,安装成功后,要配置密钥,不然上传不成功,要报错 具体上传步骤: git init   //初始化 git add  文件名  //更新文件 git commit -m ...

  8. 调用Excel宏批量处理文件

    '1.用户可以任意选择文件夹进行遍历 '2.限定遍历时仅搜索EXCEL文件(你可以改变文件类型) '这个程序要先在“引用”下选择"microsoft scripting runtime&qu ...

  9. 第一二次java实训作业

    1. 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. package java1; public class java1 { static int a=5; pub ...

  10. SHELL脚本学习-自动生成AWR报告

    自动生成AWR报告,每个小时生成一次. #编辑脚本:vim awr_auto.sh #oracle用户下执行 #!/bin/bash # 每个小时执行一次,自动生成AWR报告 source ~/.ba ...