1 SQL注入、盲注1.1 SQL注入、盲注概述Web 应用程序通常在后端使用数据库,以与企业数据仓库交互。查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本)。Web 应用程序通常会获取用户输入(取自 HTTP 请求),将它并入 SQL 查询中,然后发送到后端数据库。接着应用程序便处理查询结果,有时会向用户显示结果。 如果应用程序对用户(攻击者)的输入处理不够小心,攻击者便可以利用这种操作方式。在此情况下,攻击者可以注入恶意的数据,当该数据并入 SQL 查询中时,就将查询的原始语法更改得面目全非。例如,如果应用程序使用用户的输入(如用户名和密码)来查询用户帐户的数据库表,以认证用户,而攻击者能够将恶意数据注入查询的用户名部分(或密码部分),查询便可能更改成完全不同的数据复制查询,可能是修改数据库的查询,或在数据库服务器上运行 Shell 命令的查询。 1.2 安全风险及原因高风险漏洞,攻击者可能会查看、修改或删除数据库条目和表 原因:未对用户输入正确执行危险字符清理 固定值: 查看危险字符注入的可能解决方案 1.3 AppScan扫描建议若干问题的补救方法在于对用户输入进行清理。 通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意 SQL 查询、嵌入将在客户端执行的 Javascript 代码、运行各种操作系统命令,等等。 建议过滤出所有以下字符: [1] |(竖线符号) [2] & (& 符号) [3];(分号) [4] $(美元符号) [5] %(百分比符号) [6] @(at 符号) [7] '(单引号) [8] "(引号) [9] \'(反斜杠转义单引号) [10] \"(反斜杠转义引号) [11] <>(尖括号) [12] ()(括号) [13] +(加号) [14] CR(回车符,ASCII 0x0d) [15] LF(换行,ASCII 0x0a) [16] ,(逗号) [17] \(反斜杠) 以下部分描述各种问题、问题的修订建议以及可能触发这些问题的危险字符: SQL 注入和 SQL 盲注: A. 确保用户输入的值和类型(如 Integer、Date 等)有效,且符合应用程序预期。 B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。当使用存储过程时,请利用 ADO 命令对象来实施它们,以强化变量类型。 C. 清理输入以排除上下文更改符号,例如: [1] '(单引号) [2] "(引号) [3] \'(反斜线转义单引号) [4] \"(反斜杠转义引号) [5] )(结束括号) [6] ;(分号) 跨站点脚本编制: A. 清理用户输入,并过滤出 JavaScript 代码。我们建议您过滤下列字符: [1] <>(尖括号) [2] "(引号) [3] '(单引号) [4] %(百分比符号) [5] ;(分号) [6] ()(括号) [7] &(& 符号) [8] +(加号)
LDAP 注入: A. 使用正面验证。字母数字过滤(A..Z,a..z,0..9)适合大部分 LDAP 查询。 B. 应该过滤出或进行转义的特殊 LDAP 字符: [1] 在字符串开头的空格或“#”字符 [2] 在字符串结尾的空格字符 [3] ,(逗号) [4] +(加号) [5] "(引号) [6] \(反斜杠) [7] <>(尖括号) [8] ;(分号) [9] ()(括号)
ORM 注入: A. 确保用户输入的值和类型(如 Integer、Date 等)有效,且符合应用程序预期。 B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。 C. 使用参数化查询 API D. 清理输入以排除上下文更改符号,例如: (*): [1] '(单引号) [2] "(引号) [3] \'(反斜线转义单引号) [4] \"(反斜杠转义引号) [5] )(结束括号) [6] ;(分号) 1.4 应用程序解决方案1、我们为了调试方便,在页面上会抛出数据库异常信息,如果入侵工具获取了这些信息,就可以获取系统的一些配置信息,如web系统框架、采用的数据库等,从而找出系统漏洞。所以不要在页面上抛出异常的详细信息,这些信息对客户并没有用,只是方便技术人员调试罢了,处理方法是在异常处理页面把打印异常代码删除即可; 2、新建一个过滤器,通过过滤器过滤SQL注入特殊字符,配置成功后,重启服务,用Appsan工具扫描,漏洞得到解决。 通过过滤器可以解决SQL注入、跨站点脚本编制及通过框架钓鱼等问题,具体实现方式如下: 1、在web.xml文件中配置过滤器
<!--配置过滤器 通过过滤器过滤SQL注入特殊字符 --> <filter> <filter-name>InjectFilter</filter-name> <filter-class>com.filter.InjectFilter</filter-class> </filter> <!--映射过滤器--> <!--<filter-mapping> <filter-name>InjectFilter</filter-name>--> <!--“/*”表示拦截所有的请求 --> <!-- <url-pattern>/*</url-pattern> </filter-mapping>--> <filter-mapping> <filter-name>InjectFilter</filter-name> <!--“/*”表示拦截所有的请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
2、过滤器过滤代码
3.如果跨站点的脚本编制还存在或者存在其他漏洞风险就再搞个过滤器继续加固验证过滤 1.在xml文件继续配置一个新的过滤器: <!--配置过滤器 跨站点脚本编制过滤 --> <filter> <filter-name>XssFilter</filter-name> <filter-class>com.filter.XssFilter</filter-class> </filter> <!--映射过滤器--> <filter-mapping> <filter-name>XssFilter</filter-name> <!--“/*”表示拦截所有的请求 --> <url-pattern>/*</url-pattern> </filter-mapping> 2.过滤器代码:
2.类RequestWrapper
3.类XssClean
|
|