技术开发 频道

如何防范SQL注入:测试篇

  Union查询SQL注入测试

  还有一种测试是利用Union的,利用Union可以连接查询,从而从其他表中得到信息,假设我们有如下的查询: 

SELECT Name, Phone, Address FROM Users WHERE Id=$id

  然后我们设置id的值为:

 $id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable

  那么整体的查询就变为:

SELECT Name, Phone, Address FROM Users WHERE Id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable

  显然这样就能得到所有信用卡用户的信息。

  盲SQL注入测试

  在上面我们提到过盲SQL注入,即blind SQL injection,它意味着对于某个操作我们得不到任何信息,通常这是由于程序员已经编写了特定的出错返回页面,从而隐藏了数据库结构的信息。

  利用推理方法,有时候我们能够恢复特定字段的值。这种方法通常采用一组对服务器的布尔查询,依据返回的结果来推断结果的含义。仍然延续上面的www.example.com,有一个参数名为id,那么我们输入以下url请求:

http://www.example.com/index.php?id=1'

  显然由于语法错误,我们会得到一个预先定义好的出错页面,假设服务器上的查询语句为SELECT field1, field2, field3 FROM Users WHERE Id='$Id',假设我们想要得到用户名字段的值,那么通过一些函数,我们就可以逐字符的读取用户名的值。在这里我们使用以下的函数: 

SUBSTRING (text, start, length),ASCII (char),LENGTH (text)

  我们定义id为: 

$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1

  那么最终的SQL查询语句为: 

SELECT field1, field2, field3 FROM Users WHERE Id='1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1'

  那么,如果在数据库中有用户名的第一个字符的ASCII码为97的话,那么我们就能得到一个真值,那么我们就继续寻找该用户名的下一个字符;如果没有的话,那么我们就递增猜测第一个字符的ASCII码为98的用户名,这样反复下去就能判断出合法的用户名。

  那么,什么时候我们可以结束推理呢,我们假设id的值为:

 $Id=1' AND LENGTH(username)=N AND '1' = '1

  其中N是我们到目前为止已经分析的字符数目,那么整体的sql查询为: 

SELECT field1, field2, field3 FROM Users WHERE Id='1' AND LENGTH(username)=N AND '1' = '1'

  这个查询的返回值如果是真,那我们就已经完成了推理并且我们已经得到了想要的数值,如果为假,则表示我们还要继续分析。

  这种盲SQL注入会要求我们输入大量的sql尝试,有一些自动化的工具能够帮我们实现,SqlDumper就是这样的一种工具,对MySQL数据库进行GET访问请求。

0
相关文章