前言
前面我们学习了如何寻找,确认,利用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注入攻击。
例如:我们在用户名插入
zusheng' or ''='
那么后面我们就执行了语句
select * from users where username = 'zusheng' or ''=''
- 第六节 探讨SQL注入防御技巧
6.1、输入验证
输入验证是指要验证所有应用程序接收到的输入是否合法。
有两中不同类型的输入验证方法:白名单和黑名单验证
白名单验证:比如id值,那么我们判断它是否为数字。
黑名单验证:使用正则表达式禁止使用某些字符和字符串
应该尽量使用白名单,对于无法使用白名单的,使用黑名单提供局部限制。
6.2、编码输出
我们除了要验证应用程序收到的输入以外,还要对数据进行编码,这样不仅可以防御SQL注入攻击,还能防止出现其他问题,比如XSS。
结束语
因为本人技术有限,所以对防御技巧了解并不是深入,希望有更好防御技巧的小伙伴可以分享一下心得,我会将收到的技巧加入本文,提供给更多的小伙伴进行参考,谢谢了。
系列文章预告及导航
渗透攻防Web篇-SQL注入攻击初级(状态:已更新)
- 第一节 注入攻击原理及自己编写注入点
- 第二节 寻找及确认SQL注入
渗透攻防Web篇-SQL注入攻击中级(状态:已更新)
- 第三节 利用SQL注入
- 第四节 SQL盲注利用
文章首链:http://bbs.ichunqiu.com/thread-10093-1-1.html
感谢您的阅读,如果您学到了,请点赞(码字不易)!
欢迎热心园友补充!
【渗透攻防Web篇】SQL注入攻击高级的更多相关文章
-
【web渗透技术】渗透攻防Web篇-SQL注入攻击初级
[web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...
-
【渗透攻防WEB篇】SQL注入攻击初级
前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...
-
SQL注入攻击三部曲之高级篇
SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...
-
2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...
-
SQL注入攻击三部曲之进阶篇
SQL注入攻击三部曲之进阶篇 通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的.本篇文章我们将进一步的分析SQL注入攻击. ...
-
SQL注入攻击三部曲之入门篇
SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...
-
2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践
<网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理 在计算机内部,输入数据通常被存放在一个临时空间内, ...
-
Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
-
web攻击之三:SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
随机推荐
-
SQL SERVER全面优化-------写出好语句是习惯
前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...
-
RPC和Socket,RMI和RPC之间的关系
远程通信机制RPC与RMI的关系 http://blog.csdn.net/zolalad/article/details/25161133 1.RPC RPC(Remote Proced ...
-
对Spring <;context:annotation-config/>;的理解
在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是向 Spring 容器注册 AutowiredAnn ...
-
Java之--Java语言基础组成—数组
Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...
-
JVM的内存管理机制
在做Java开发的时候常用的JVM内存管理有两种,一种是堆内存,一种是栈内存.堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对 ...
-
web编程速度大比拼(nodejs go python)(非专业对比)
C10K问题的解决,涌现出一大批新框架,或者新语言,那么问题来了:到底谁最快呢?非专业程序猿来个非专业对比. 比较程序:输出Hello World! 测试程序:siege –c 100 –r 100 ...
-
unittest模块的常用方法:
unittest模块的常用方法: assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool ...
-
c#枚举位运算操作
抛出预设问题 需要有一个npc需要在一周中的,周一,周二,周三会出现,其他时间不可见 解决问题 因为一周时间是固定的,所以创建枚举类型比较合适,如下 enum Days { None, Sunday, ...
-
vim 删除
shift + $ :光标往后 shift + ^ :光标往前 shift + D 删除当前光标直到末尾
-
适用于 Windows VM 的 Azure 示例基础结构演练
本文是更广泛系列的一部分,当你在 Azure 中构建应用程序基础结构时,这些系列向你提供设计注意事项和准则. 用户可以查看系列中的其他主题. 尽管用户可以在 Azure 中快速地构建出开发/测试环境, ...