【渗透攻防Web篇】SQL注入攻击高级

前言

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

目录


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

  • 5.一、大小写变种
  • 5.二、URL编码
  • 5.三、SQL注释
  • 5.四、空字节
  • 5.五、二阶SQL注入

第六节 探讨SQL注入防护技巧html

  • 6.一、输入验证
  • 6.二、编码输出






正文

正则表达式

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


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


5.一、大小写变种

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

 

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

 

 

 


这段代码的缺陷就在strstr()函数是对大小写敏感的,因此咱们能够经过大小写变种来绕过。

= 



5.二、URL编码

URL编码用途普遍,能够经过它绕过多种类型的输入过滤器。数据库

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

双URL编码有时候会起做用,若是Web应用屡次解码,在最后一次解码以前应用其输入过滤器。
 
由于双URL编码,第一次解码%2f%2a进入输入过滤器,因此成功绕过了。固然这个使用前提是后面有一个URL解码。

5.三、SQL注释

不少开发人员认为,将输入限制为单个就能够限制SQL注入攻击,因此他们每每就只是阻止各类空白符。编程

 

 

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


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


 

5.四、空字节


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

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

 

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

 

 

 

 


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  '1'='1


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

select * from users where username = 'zusheng' or '1'='1'



  • 第六节 探讨SQL注入防护技巧


6.一、输入验证

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


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


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


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


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


6.二、编码输出

咱们除了要验证应用程序收到的输入之外,还要对数据进行编码,这样不只能够防护SQL注入攻击,还能防止出现其余问题,好比XSS。






结束语

由于本人技术有限,因此对防护技巧了解并非深刻,但愿有更好防护技巧的小伙伴能够分享一下心得,我会将收到的技巧加入本文,提供给更多的小伙伴进行参考,谢谢了。


系列文章预告及导航

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

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

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

相关文章
相关标签/搜索