原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html

1.1.1 总结

前几天,国内最大的程序猿社区CSDN网站的用户数据库的黑客公告。600登录名和万用户password被公开泄露,随后又有多家站点的用户password被流传于网络,连日来引发众多网民对自己账号、password等互联网信息被盗取的普遍担忧。

网络安全成为了如今互联网的焦点,这也恰恰触动了每一位用户的神经,因为设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些经常使用的攻击技术和防范策略。

SQL Injection或许非常多人都知道或者使用过,假设没有了解或全然没有听过也没有关系。由于接下来我们将介绍SQL Injection。

1.1.2 正文

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,终于达到欺骗server运行恶意的SQL命令。

详细来说。它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎运行的能力。它能够通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的站点上的数据库。而不是依照设计者意图去运行SQL语句。

首先让我们了解什么时候可能发生SQL Injection。

如果我们在浏览器中输入URL www.sample.com,因为它仅仅是对页面的简单请求无需对数据库动进行动态请求。所以它不存在SQL Injection。当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,而且提供值为23。因为它是对数据库进行动态查询的请求(当中?testid=23表示数据库查询变量)。所以我们能够该URL中嵌入恶意SQL语句。

如今我们知道SQL Injection适用场合。接下来我们将通过详细的样例来说明SQL Injection的应用。这里我们以pubs数据库作为样例。

我们通过Web页面查询job表中的招聘信息,job表的设计例如以下:

图1 jobs表

接着让我们实现Web程序,它依据工作Id(job_id)来查询对应的招聘信息,示意代码例如以下:

/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, EventArgs e)
{if (!IsPostBack){// Gets departmentId from http request.string queryString = Request.QueryString["departmentID"];if (!string.IsNullOrEmpty(queryString)){// Gets data from database.gdvData.DataSource = GetData(queryString.Trim());// Binds data to gridview.gdvData.DataBind();}}
}

如今我们已经完毕了Web程序。接下来让我们查询对应招聘信息吧。

图2 job表查询结果

如图所看到的。我们要查询数据库中工作Id值为1的工作信息,并且在页面显示了该工作的Id。Description,Min Lvl和Max Lvl等信息。

如今要求我们实现依据工作Id查询对应工作信息的功能,想必大家非常快能够给出解决方式。SQL示意代码例如以下:

SELECT     job_id, job_desc, min_lvl, max_lvl
FROM         jobs
WHERE     (job_id = 1)

如果如今要求我们获取Department表中的全部数据。并且必须保留WHERE语句,那我们仅仅要确保WHERE恒真就OK了。SQL示意代码例如以下:

SELECT     job_id, job_desc, min_lvl, max_lvl
FROM         jobs
WHERE     (job_id = 1) OR 1 = 1

上面我们使得WHERE恒真,所以该查询中WHERE已经不起作用了。其查询结果等同于下面SQL语句。

SELECT     job_id, job_desc, min_lvl, max_lvl
FROM         jobs

SQL查询代码实现例如以下:

string sql1 = string.Format("SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs WHERE job_id='{0}'", jobId);

如今我们要通过页面请求的方式,让数据库运行我们的SQL语句。我们要在URL中嵌入恶意表达式1=1(或2=2等等)。例如以下URL所看到的:

OR '1' = 1'

图3 job表查询结果

如今我们把job表中的全部数据都查询出来了。只通过一个简单的恒真表达式就能够进行了一次简单的攻击。

尽管我们把job表的数据都查询出来了,但数据并没有太大的价值。因为我们把该表暂时命名为job表。所以接着我们要找出该表真正表名。

首先我们如果表名就是job。然后输入下面URL:

http://localhost:3452/ExcelUsingXSLT/Default.aspx?

jobid=1'or 1=(select count(*) from job)--

等效SQL语句例如以下:

SELECT       job_id, job_desc, min_lvl, max_lvl
FROM         jobs
WHERE      job_id='1'or 1=(select count(*) from job) --'

图4 job表查询结果

当我们输入了以上URL后。结果server返回我们错误信息,这证明了我们的如果是错误的。那我们该感觉到挫败吗?不,事实上这里返回了非常多信息,首先它证明了该表名不是job,并且它还告诉我们后台数据库是SQL Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户。

接下假定表名是jobs。然后输入下面URL:

http://localhost:3452/ExcelUsingXSLT/Default.aspx?

jobid=1'or1=(select count(*) from jobs) --

等效SQL语句例如以下:

SELECT       job_id, job_desc, min_lvl, max_lvl
FROM         jobs
WHERE      job_id='1'or 1=(select count(*) from jobs) --'

图5 job表查询结果

如今证明了该表名是jobs。这能够迈向成功的一大步,因为我们知道了表名就能够对该表进行增删改操作了。并且我们还能够推測出很多其它的表对它们作出改动,一旦改动成功那么这将是一场灾难。

如今大家已经对SQL Injection的攻击有了初步的了解了。接下让我们学习怎样防止SQL Injection。

总的来说有下面几点:

1.永远不要信任用户的输入,要对用户的输入进行校验。能够通过正則表達式,或限制长度,对单引號和双"-"进行转换等。

2.永远不要使用动态拼装SQL。能够使用參数化的SQL或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每一个应用使用单独的权限有限的数据库连接。

4.不要把机密信息明文存放。请加密或者hash掉password和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自己定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

通过正则表达校验用户输入

首先我们能够通过正則表達式校验用户输入数据中是包括:对单引號和双"-"进行转换等字符。

然后继续校验输入数据中是否包括SQL语句的保留字。如:WHERE。EXEC,DROP等。

如今让我们编写正則表達式来校验用户的输入吧。正則表達式定义例如以下:

private static readonly Regex RegSystemThreats =new Regex(@"\s?or\s*|\s?;\s?

|\s?drop\s|\s?grant\s|^'|\s?--|\s?union\s|\s?delete\s|\s?truncate\s|"

+ @"\s?

sysobjects\s?|\s?xp_.*?|\s?

syslogins\s?|\s?

sysremote\s?|\s?sysusers\s?|\s?

sysxlogins\s?

|\s?sysdatabases\s?|\s?aspnet_.*?|\s?exec\s?"

, RegexOptions.Compiled | RegexOptions.IgnoreCase);

上面我们定义了一个正則表達式对象RegSystemThreats,而且给它传递了校验用户输入的正則表達式。

因为我们已经完毕了对用户输入校验的正則表達式了,接下来就是通过该正則表達式来校验用户输入是否合法了。因为.NET已经帮我们实现了推断字符串是否匹配正則表達式的方法——IsMatch(),所以我们这里仅仅需给传递要匹配的字符串就OK了。

示意代码例如以下:

/// <summary>
/// A helper method to attempt to discover [known] SqlInjection attacks.
/// </summary>
/// <param name="whereClause">string of the whereClause to check</param>
/// <returns>true if found, false if not found </returns>
public static bool DetectSqlInjection(string whereClause)
{return RegSystemThreats.IsMatch(whereClause);
}/// <summary>
/// A helper method to attempt to discover [known] SqlInjection attacks.
/// </summary>
/// <param name="whereClause">string of the whereClause to check</param>
/// <param name="orderBy">string of the orderBy clause to check</param>
/// <returns>true if found, false if not found </returns>
public static bool DetectSqlInjection(string whereClause, string orderBy)
{return RegSystemThreats.IsMatch(whereClause) || RegSystemThreats.IsMatch(orderBy);
}

如今我们完毕了校验用的正則表達式,接下来让我们须要在页面中加入校验功能。

/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, EventArgs e)
{if (!IsPostBack){// Gets departmentId from http request.string queryString = Request.QueryString["jobId"];if (!string.IsNullOrEmpty(queryString)){if (!DetectSqlInjection(queryString) && !DetectSqlInjection(queryString, queryString)){// Gets data from database.gdvData.DataSource = GetData(queryString.Trim());// Binds data to gridview.gdvData.DataBind();}else{throw new Exception("Please enter correct field");}}}
}

当我们再次运行下面URL时。被嵌入的恶意语句被校验出来了。从而在一定程度上防止了SQL Injection。

SQL注入的原理解说,挺好!相关推荐

  1. SQL注入基础原理与案例(详细总结)

    SQL注入基础原理与案例 一.前言 二.漏洞概述及危害 1.漏洞概述 2.漏洞危害 3.漏洞防范 三.SQL注入 1.SQL注入方式 (1)信息收集 (2)数据注入 (3)高权限注入 2.判断是否存在 ...

  2. 什么是SQL注入攻击?SQL注入攻击原理是什么?

    SQL注入攻击是网络安全中非常常见的攻击方式之一,该攻击隐蔽性好.危害大.操作方便,也是各大企业及站长最容易遇到的攻击方式.那么SQL注入攻击原理是什么?如何防范?接下来跟着小编来看看吧. SQL注入 ...

  3. sql注入的原理详解

    sql注入原理详解(一) 我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到 ...

  4. sql注入基础原理(SQL injection)

    sql注入基础原理 文章目录 sql注入基础原理 Sql注入简介 案例表 产生sql注入的写法 python 相关 java 相关 php 相关 sql注入相关技术 B: 基于布尔的盲注特征 案例 总 ...

  5. SQL注入的原理、过程及如何防范

    SQL注入的原理: 定义:通过把SQL命令插入到 web表单提交.输入域名.页面请求的查询字符串,最终达到欺骗服务器 执行恶意的sql命令. 它的本质就是服务器对代码和数据不区分,未对用户提交的参数进 ...

  6. 浅谈SQL注入漏洞原理及利用方式

    1.SQL注入 原理: 在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判断,导致其传入的恶意"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行.漏洞产生于脚 ...

  7. 【SQL注入漏洞-01】SQL注入漏洞原理及分类

    SQL注入简介 结构化查询语言(Structured Query Language,缩写︰SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言. SQL注入(SQL Injection)是一 ...

  8. sql注入的原理分析

    1.知识点一:什么是sql注入? 用户输入的内容被网站当做数据库语句进行执行.关键点:输入的内容 一定要是[数据库语句]. 用户输入的内容: 我们输入的内容. 在一个网站上能够输入的地方:     1 ...

  9. 张小白的渗透之路(二)——SQL注入漏洞原理详解

    SQL注入漏洞简介 乱七八糟的就不多说了,自己百度去 SQL注入原理 想要更好的学习SQL注入,那么我们就必须要深入的了解每种数据库的SQL语法及特性.下面通过一个经典的万能密码的例子带大家来拨开一下 ...

最新文章

  1. Android:解决Gradle DSL method not found: 'runProguard()' 问题
  2. 开放源码,华为鸿蒙HarmonyOS 2.0来了
  3. 开发必备快速定位排查日志 9 大类命令详解
  4. Android之category
  5. c语言利用fun求最小值,c语言:请编写函数fun(),他的功能是:求f(0)到f(50)的最小值,已知:f(0)=f(1)=1,f(2)=0,f...
  6. 统计信息自动更新导致查询超时
  7. Python中的“ @”(@)符号有什么作用?
  8. java10个整数反向输出_输入一个整数,实现反转输出,如输入123,输出321。
  9. 响应服务器589,示例HTTP范围请求会话
  10. 显示器显示颜色差,导致BUG一例
  11. 计算机通过注册表修改摄像机设备的名称
  12. Guass Rank(深度学习数值特征归一化方法)
  13. 在mtk6223的软t卡上实现对sdhc卡的读写
  14. 基于Q-Learning 的FlappyBird AI
  15. Xcelsius启动出现Problem Accessing Excel: Exiting问题的解决
  16. Vue.js 源码分析(五) 基础篇 方法 methods属性详解
  17. 傻傻分不清楚的研究设计类型
  18. 数据库恢复技术-数据库习题
  19. 蓝屏代码page_fault_in_nonpaged_area (0x00000050)
  20. 适用于火车头7.6的翻译插件-亲测10000篇文章稳定不报错

热门文章

  1. caffe检测图片是否包含人脸_caffe入门-人脸检测1
  2. C++11学习笔记-----线程库std::thread
  3. 速来围观!leetcode java实现汇总
  4. POJ 1064 -- Cable master(二分)
  5. CMake基础 第7节 编译标志
  6. nginx的函数调用
  7. [NOTE] sqli-labs Adv Injections
  8. 整理记录word2016小技巧,自用
  9. c++ 模板教程(c语言中文网) 自己运行实例
  10. 复数域上x^n ±1=0的解