- 寻找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注入