• 寻找sql注入

  sql注入可以出现在任何从系统或用户接受数据的前端应用程序中,这些应用程序之后被用于访问数据库服务器。

  WEB浏览器是客户端,它扮演向用户请求数据并将数据发送到远程服务器的前端角色。

  远程服务器使用提交的数据创建SQL查询。

  在很难访问到源代码的情况下,需要借助推理进行测试,向服务器发送请求,然后检测响应中的异常。

  • 借助推理进行测试

  识别sql注入漏洞有一种简单的规则:通过发送意外数据来触发异常

  1.识别数据输入

  Web环境是一种客户端/服务器架构(cs),服务器和客户端采用HTTP协议进行通信,与SQL注入相关的的两种数据请求方式为:GET和POST

 

  1.1  GET请求

    GET请求是一种请求服务器的HTTP方法。

    使用该方法时,信息包含在url中,一般首次点击链接时使用该方法,Web服务器根据请求发送请求的数据给Web客户端。

    该请求在url中发送参数。

  对于GET请求来说,只要在浏览器的导航栏中稍作修改即可操纵这些参数。

 

  1.2   POST请求

  post请求是一种用于向WEB服务器发送信息的HTTP方法。在浏览器中填写表单并点击Submit按钮时通常使用该方法。

  post请求的数据位于报文中。

  

 

  数据在浏览器如何呈现并不重要,这些只是客户端功能,我们可以完全控制发送给服务器的内容,也不需要将客户端的接口机制看作安全功能。

  如果浏览器禁止修改数据,可以1.浏览器修改扩展,2.代理服务器

  其中使用代理服务器,需要在自己的计算机上安装代理服务器,再在浏览器上配置使用代理服务器

  其他注入型数据

  cookie被发送给用户端的浏览器,并在每个请求中都会自动回发给服务器,cookie一般用于验证,会话控制和保存用户指定的信息,我们可以完全控制发送給服务器的内容,

  所以cookie很容易受注入影响。

  其他的还有主机头,引用站点头和用户代理头,可以借助代理软件来修改cookie和HTTP头。

  2.操纵数据

  通过对URL的参数进行修改,触发异常漏洞

 

 

  有两种原因会引发SQL注入漏洞:

  缺少用户输入验证

  数据和控制结构混合在同一传输通道中

  缺少用户输入验证,将导致攻击者可以从数据部分(例如使用单引号引起来的字符串和数字)跳到注入控制命令(例如,SELECT,UNION,AND ,OR等)

  为了防止出现这种漏洞,首要措施是执行严格的用户输入验证和输出编码。例如可以采用白名单方法,即如果参数是数字,那么可以对Web应用进行配置以拒绝所有由用户提供的非数字输入字符

  

  3.信息工作流

  动态Web请求所涉及的各方之间的信息工作流:

  1.客户端用Web服务器发送请求

  2.Web服务器检索用户数据,创建包含用户输入的sql语句。然后向数据库服务器发送查询

  3.数据库服务器执行SQL语句,并将结果返回给Web服务器,这里数据库服务器不知道应用逻辑,他只是负责执行查询并将结果返回

  4.Web服务器根据数据库服务器响应动态创建HTML页面

  这里的Web服务器和数据库服务器是相互独立的实体,Web服务器只负责创建查询,解析结果,将结果返回给客户端浏览器。

  • 数据库错误

  当数据库服务器接收了格式不正确的SQL查询时,会向Web服务器返回一条错误消息。

  根据应用程序的不同,会返回不同的页面,有的直接返回SQL错误,并对Web浏览器可见,或者将sql错误隐藏在WEB页面的源代码中以便调试,或者跳转到另一个页面,返回HTTP错误代码500(服务器错误)或HTTP重定向代码302,或通用的错误页面。

  

  1.常见的SQL错误

  1)Microsoft SQL Server错误

  1.将字符串转换成整数来产生错误

  http:// www.victim.com /showproducts.aspx?category=bikes ' and 1=0/@@version;--

  最终的sql语句就会变成select * from table where category=' bikes ' and 1=0/@@version;--'

  最后的‘被注释掉,0/@@version作为部分注入代码,除法运算需要两个数字作为运算数,所以数据库尝试将0/@@version函数的结果转换为数字,当该操作失败时,数据库就会显示出变量的内容

  同理:

  http:// www.victim.com /showproducts.aspx?category=bikes ' and 1=0/user;--

  显示出user变量的值。

  http:// www.victim.com /showproducts.aspx?category=bikes'  having ’1' ='1

  select * from table where category=' bikes' having ‘1' ='1';  having子句在有聚合函数的时候用来过滤GROUP BY返回的结果。

  GROUP BY 要求SELECT语句选择的字段是某个聚合函数的结果或者包含在GROUP BY子句中,如果条件不满足,那么数据库会返回错误

  从错误中披露出字段名productid

  http:// www.victim.com /showproducts.aspx?category=bikes'  GROUP BY  productid  having ’1' ='1

  从错误中披露出字段名name

  http:// www.victim.com /showproducts.aspx?category=bikes'  GROUP BY  productid,name having ’1' ='1

  从错误中披露出字段名price

  枚举出字段名后,可以用类型转换错误技术来检索列的值

  http:// www.victim.com /showproducts.aspx?category=bikes ' and 1=0/name;--

 

  2)MYSQL 错误

  3)Oracle错误

  4)PostgreSQL错误

  • 应用程序的响应

  1)常见错误

  存在不管遇到什么错误,应用程序都会返回一个通用的错误页面,这时就需要弄清错误是否由SQL注入引起。

  可以通过向参数中插入不会触发应用错误的SQL代码来测试。

  像 ' or '1'='1这种永真条件

  或者 ' and '2'='1这种永假条件

  有时注入永假条件也会有结果,这是因为,注入的只是其中一个查询,没有影响UNION SELECT后面的查询。

  2)HTTP代码错误

  http 200  成功接收

  http  500     服务器错误

  HTTP   302        重定向

  3)不同大小的响应

  • 数据库盲注

  根据永真或者永假条件确认存在SQL注入