如何检查是否存在SQL注入漏洞PROGRAMMATICALLY?

问题描述:

我看到一些破解工具可以自动找到SQL注入漏洞的网页。如何检查是否存在SQL注入漏洞PROGRAMMATICALLY?

它是如何工作的?

通常,可以对SQL代码结构进行有根据的猜测,以允许注入。

例如,对于一个脆弱的用户名/密码,验证码,这将是在大多数情况下是这样的:

select count(*) from users where [email protected] and [email protected]; 

所以黑客会尝试注入是这样的:

@username=" 'blabla' or 1=1 " 
@password=" 'blabla' or 1=1 " 

所以结果将是计数(*)将> 0,因此登录接受。

+0

但是漏洞发现工具(不是人)不能直接运行SQL,它只能向Web服务器发送请求,如何知道注入是否失败? – jxu 2011-02-08 07:22:19

+0

黑客必须具有创造性。例如,如果在响应页面中不再有“登录”文本框,则表示黑客已成功。“漏洞发现工具”的工作原理类似于黑客,并且无法覆盖所有场景。 – 2011-02-08 07:31:35

+0

但作为一个工具,它永远不知道一个页面是否是一个登录页面。 – jxu 2011-02-08 07:32:12

一个简单的测试可以是在输入字段中放一个单引号,然后查看是否收到mysql错误消息。

如果您得到类似'您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,在第1行''''附近使用正确的语法'

或者如果您得到一个php/mysql错误(可能通过其格式编程识别常见的错误信息),那么你也知道你有一个注入漏洞。

如果你只是得到一个通用的“没有这样的用户名”或有效的空结果集,那么你很可能没有注入漏洞。

很多这些工具都有已知会中断网页的参数列表。他们在多个requestsm解雇这些参数关中插入参数:

  1. 表单字段
  2. 的GET URL
  3. HTTP头

他们的工具通常会蜘蛛网站,以确保它们打尽可能多的网站。

其中一个棘手的问题是确定您何时找到可利用的网页。在某些情况下,Web服务器可能需要较长时间才能重新启动页面,或者页面的某些部分可能会略有不同。要检查的事项:

  1. HTTP响应代码(500服务器错误可能意味着SQL无效)
  2. 尺寸返回页面
  3. 采取的页面时返回

说了这么多,如果您实际上有权访问网站的源代码,则可以使用静态分析技术来查找漏洞。