欢迎来到HDUISA wiki,如果这是你的第一次到来,请点击此处注册

SQL注入攻击(SQL Injection Attack),简称注入攻击SQL注入,在某些情况下也被称为SQLi。 简单来讲,由于数据库并不区分来自用户的输入到底是指令还是数据,错误的将用户的输入当作了数据库操作的指令并执行,从而形成了一种攻击。 支持SQL或类SQL的数据库服务器都有可能收到此攻击的影响,包括很多人觉得很厉害的NoSQL。

简介

SQL注入攻击(SQL Injection Attack),简称注入攻击或SQL注入,在某些情况下也被称为SQLi。
简单来讲,由于数据库并不区分来自用户的输入到底是指令还是数据,错误的将用户的输入当作了数据库操作的指令并执行,从而形成了一种攻击。 支持SQL或类SQL的数据库服务器都有可能收到此攻击的影响,包括很多人觉得很厉害的NoSQL。
SQL注入也是想学习安全的同学必修的一部分内容,有一本很不错的书《SQL注入攻击与防御》讲的十分详细,电子版请移步drops进行寻找。除此之外,还可以参考一下lightless同学编写的[http://lightless.me/category/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8BSQL%E6%B3%A8%E5%85%A5/ 从零开始SQL注入]教程(需要一定的前置知识,例如PHP、SQL等)。

攻击原理

例如,原本的SQL语句为下面这样:

SELECT user, passwd FROM tbl_user WHERE user#'<输入点1>' AND passwd#'<输入点2>'

当我们进行正常查询的时候,会执行:

SELECT user, passwd FROM tbl_user WHERE user#'admin' AND passwd#'123456'

看似没什么问题,但是当我们在输入点1输入admin' or 1#,输入点2随便输入的时候,会造成以下查询:

SELECT user, passwd FROM tbl_user WHERE user#'admin' or 1#' AND passwd#'aaaaa'

造成了SQL注入,执行了本不应该执行的代码,从而绕过了身份验证。 本质上,还是因为程序员在编写相关程序的时候,直接将字符串进行拼接,而且未经任何的过滤,导致了可以被SQL注入攻击,目前SQL注入漏洞还是占相当一部分,且危害较大。

分类

  • 根据出现的位置不同,可以分为以下几类:

    • GET注入:出现在GET参数中的注入。
    • POST注入:出现在POST参数中的注入。
    • HTTP头注入:出现在HTTP头参数中的注入,例如REFERER、XFF、UA等。
    • Cookie注入:出现在Cookie参数中的注入。
  • 根据注入类型,可以分为以下几类:(关于这几种注入类型,有很多种说法,各处看到的名称可能不一样,但所表述的意思应该相同)

    • 报错注入:根据回显的错误信息进行注入。
    • 盲注:指页面不会回显可以直接利用的信息时的注入,例如只返回“系统错误”,攻击者必须根据回显的内容提取数据库的信息。盲注又分为基于时间的盲注和基于回显的盲注。基于时间盲注:根据返回页面的时间获取信息。基于回显的盲注:根据回显的内容进行盲注。
    • 回显注入:可以将想要的内容直接提取到网页页面上,是最容易的一种注入。

防御

  • 对用户输入的参数进行严格过滤。
  • 进行SQL查询的时候使用预处理。

危害

关于SQL注入的危害网上讲的已经很多了,大家可以自行搜索一下,这里只罗列些比较严重的。 * 数据库信息泄漏 * 数据库被破坏 * 导致服务器被GETSHELL * 导致攻击者获取服务器root权限

常用检测工具

关于这类的工具实在是太多了,旧到古董级的啊D、明小子,新到红极一时的SQLMAP,如何使用还是要看需求。 * SQLMAP:感觉是必须掌握的工具,用法极其丰富,只要会用这个,就可以应付日常中各种注入点了。 * 不过还是推荐手注+自己写脚本,这样可以锻炼漏洞利用能力,不能只依靠工具。

注入点挖掘技巧

  • 黑盒:
    • 对一个请求的所有参数进行逐个测试,不要漏掉POST和HTTP头中的信息。
    • 注意观察返回页面与正常页面的区别,包括HTTP头和状态码等微小的区别。
    • 对响应状态码为500的请求需特别留意。
  • 白盒:
    • 追踪变量的输入来源以及最后的去向。
    • 监控SQL语句执行的过程,寻找是否有输入可控点。
    • 寻找是否有让过滤函数失效的漏洞。
    • 寻找是否有些变量忘记使用过滤函数。
  • 相关教程:

拓展

windows下利用DNS查询让MYSQL盲注变回显

oracle等有更方便的方法

实际案例

外部链接


打印/导出