9.1 注入解释型语言
1、解释型语言是一种在运动时有一个运动时组件解释语言代码并执行其中包含的指令的语言。
2、编译型语言:它的代码在生成时候转换成机器指令,然后在运行时直接由使用该语言的计算机处理器执行这些指令。
3、基于解释型语言的执行方式,产生一系列叫代码注入的漏洞。任何有实际用途的应用程序都会收到用户提交的数据,对其进行处理并执行相应的操作。
4、原本验证用户名和密码的SQL。
若攻击者知道admin账户名,然后利用漏洞,
这样也起到了admin账户的作用。
5、若攻击者不知道admin账户名,且根据(数据库表第一个往往是admin账户信息,由认为手工创建的)这一特征,以数据库中的第一个用户登录。
9.2 注入SQL
1、SQL是最普遍的漏洞,经常使用API来避免SQL注入,
9.2.1 利用一个基本的漏洞
9.2.2 注入不同的语句类型
1、SELECT语句:查询作用。其注入点通常在WHERE子句。
2、INSERT语句:建立新的数据行。利用漏洞可以为自己创建一个攻击账户,但必须保证后面数据类型符合。保证SQL正常执行。
3、UPDATE语句:更新一行或多行数据。
4、DELETE语句:删除表中一行或多行。与UPDATE类似。
9.2.3 查明SQL注入漏洞
1、注入字符串数据:如果SQL查询合并与用户提交的数据,它会将这些数据包含在单引号中。为了利用任何SQL注入漏洞,攻击者需要摆脱这些引号的束缚。
2、注入数字数据:如果SQL查询合并数据,必将其包含在单引号中,作为字符串处理。但许多时候,应用程序会将数字数据以数字格式直接传送到数据库中,并不把它放入单引号中。所以采用以下针对数字数据的特殊测试步骤。
3、注入查询结构:如果用户提交的数据被插入SQL查询结构中,而不是查询中的数据项中,这时实施SQL注入攻击只需要直接应用有效的SQL语法,而不需要进行“转义”。
9.2.4 “指纹”识别数据库
1、数据库众多,差异明显。我们已经知道如何提取数据库版本字符串,即使某种原因提取不到,还可以利用其它方法识别。一种方法就是根据数据库连接字符串的不同方式进行识别。
9.2.5 UNION操作符
1、UNION将两个或几个SELECT语句的结果组合到独立一个结果中(结果中不含重复值,且查询语句格式数据类型必须一致或者数据类型兼容)。
9.2.6 提取有用的数据
9.2.7 使用UNION提取数据
9.2.8 避开过滤
1、有时为了防止SQL注入攻击而设置多种输入过滤,如,删除或净化某些字符,禁止SQL关键字等。
2、避免使用被阻止的字符
若应用程序删除或编码某些在SQL注入攻击中经常使用到的字符,那么不使用这些字符,关键字也可以进行攻击。
3、避免使用简单确认:一些输入确认使用黑名单,易造成过滤不彻底情况。
4、使用SQL注释:注释用/*和*/。如果应用程序组织或者删除输入中的空格,可以使用注释“冒充”注入数据中的空白符。有的注释可以隔断关键字。
5、利用有缺陷的过滤:输入确认机制通常包含逻辑缺陷,可对这些缺陷加以利用,是被阻止的输入避开过滤。
9.2.9 二阶SQL注入
为了修改密码,查询旧密码
9.2.10 高级利用
1、攻击者即使遇到SQL注入漏洞,但也无法直接获取注入的查询的结果,以下为讨论这种问题出现的情况。
2、获取数字数据:如果包含单引号的输入得到正常处理,则就不存在SQL注入。
3、使用带外通道
1、许多SQL注入攻击中,浏览器不返回攻击过程中的信息,攻击者很难加以利用。
4、使用推论:条件式响应
造成带外通道不可用的原因很多,很可能是因为数据库处在一个受保护的网络中,边界防火墙禁止任何与因特网或其他网络的带外连接,只能通过Web应用程序注入点访问数据库。
9.2.11 SQL注入之外:扩大数据库攻击范围
1、成功利用一个SQL注入漏洞可完全控制应用程序所有数据,然而许多原因表明,利用数据库漏洞后者控制它的一些内置功能,从而进一步实施攻击,可能会取得更大的成效。
2、MS-SQL:被攻击者滥用的功能是xp_cmdshell存储过程,他是内置的一项功能。这个存储过程允许数据库管理员以和cmd.exe命令符相同的方式执行操作系统。
3、MySQL包含的可被攻击者滥用的内置功能较少,其中一个实例是任何拥有FILE_PRIV许可的用户都可以读取并写入文件系统。
9.2.12 使用SQL注入工具
1、多数工具通过以下方法来利用SQL注入漏洞:
①参数蛮力攻击
②附加各种字符
③蛮力参测请求列数
④注入定制查询来检索任意数据
⑤若无法适用UNION检索结果,可在查询中注入布尔类型条件(AND 1=1等)
⑥条件时间延迟检索数据
9.2.13 SQL语法与错误参考
1、主要介绍一些SQL语法和错误代码,不再列出。
9.2.14 防止SQL注入
1、部分有效的防御措施
将用户输入的单引号配对转义,但以下两种情况无效:
1)提交的数字数据内置在SQL查询中,这种数据通常不包含在单引号内。
2)
2、参数化查询,以下是两个步骤
①应用程序指定查询结构,为用户输入的每个数据项预留占位符
②应用程序指定每个占位符的内容。
3、深层防御:此是提供额外的保护,防止前端防御由于任何原因失效。
9.3 注入NoSQL
不了解,有兴趣的童鞋,自己看。
9.4 注入XPath
1、基于导航XML文档并从中获取数据的解释型语言。
9.4.1 破坏应用程序逻辑
1、Xpath与SQL区别:注入数字时都不需要单引号,但Xpath关键字和元素名都区分大小写。
9.4.2 谨慎XPath注入
1、攻击者可利用此漏洞从目标XML文档中获取任意信息。方式和上述SQL输入类似。
9.4.3 盲目XPath注入
1、即使不知道数据结构信息,也可以通过盲注来一个个试探。
9.4.4 查找XPath注入漏洞
9.4.5 防止XPath注入
9.5 注入LDAP
1、LDAP(轻量级目录访问协议)用于访问网络中的目录服务,
2、最常用的搜索过滤器:
①简单匹配条件
②析取查询
③合取查询
9.5.1 利用LDAP注入
1、析取查询:以允许用户查看指定业务部门的雇员的应用程序为例,其搜索结果仅限于用户获得授权可以查看的地理区域。
2、合取查询:应用程序允许用户按姓名在授权查看的地理区域内搜索雇员。
9.5.2 查找LDAP注入漏洞
9.5.3 防止LDAP注入
9.6 小结
1、我们已经分析了用于注入Web应用程序数据存储的漏洞,攻击者可利用这些漏洞更改应用程序数据、执行其他未授权操作、破坏应用程序逻辑等。下一章将介绍这类攻击及其它攻击。
9.7 问题
1、如果要通过实施UNION攻击、利用SQL注入漏洞获取数据,但是并不知道最初的查询返回的列数,如何才能查明这个值?
答:可以通过两个简单的方法确定列数。其一,可以SELECT每个列中的类型中性值NULL,并逐渐递增列数,直到应用程序返回数据,表明指定了正确的列数,例如:
' UNION SELECT NULL--
' UNION SELECT NULL, NULL--
' UNION SELECT NULL, NULL, NULL--
请注意,在Oracle上,需要在上述每种情况的最后一个NULL后添加FROM DUAL。
另外,可以注入ORDER BY子句并递增指定列,直到引发错误,表明请求了无效的列:
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
2、已经确定一个字符串参数中的SQL注入漏洞,已经确信数据库为MS-SQL或Oracle,但当前无法获得任何数据或错误消息确定到底是哪个数据库。如何才能查明这一点?
答:一种确认数据库类型的简单方法,是使用数据库特定的字符串串联语法在所控制的查询中构建某个良性输入。例如,如果原始参数值为London,则可以轮流提交以下数据项:
'||' London
'+'London
如果第一个数据项导致和原始参数值相同的行为,说明数据库可能为Oracle。如果第二个数据项导致和原始参数值相同的行为,说明数据库可能为MS-SQL。
3、已经在应用程序的许多位置提交了一个单引号,并通过得到的错误消息确定几个潜在的SQL注入漏洞。下列哪一种方法能够以最快的速度确定专门设计的输入是否会对应用程序的处理过程造成影响?
(a) 注册一个新用户
(b) 更新个人资料
(c) 注销服务
答:虽然看似违背常理,但用户注册功能可能是最安全的。注册功能通常使用INSERT语句,如果修改这些语句,并不会影响到其他记录。用于更新个人资料的功能可能使用条件性UPDATE语句,如果注入' or 1=1--之类的有效载荷,可能会导致数据表中的所有记录遭到修改。同样,注销功能可能使用条件性DELETE语句,如果操作不当,也可能影响到其他用户。
也就是,我们不可能提前确定某个功能会执行哪些语句;在执行测试之前,应向应用程序所有者警告可能导致的风险。
4、在登录功能中发现了一个SQL注入漏洞,并尝试使用输入' or 1=1--来避开登录,但攻击没有成功,生成的错误消息表明--字符串被应用程序的输入过滤删除。如何解决这个问题?
答:有一种简单的方法可以达到相同的效果,即使用输入' or 'a'='a,而无需使用注释符号。
5、已经发现了一个SQL注入漏洞,但由于应用程序允许任何包含空白符的输入,因而无法实施任何有效的攻击。如何解除这种限制?
答:可以使用SQL注释字符分隔注入的有效载荷中的关键字和其他项目。例如:
'UNIONSELECTusername,passwordFROMusers--
6、在将其合并到SQL查询之前,应用程序并不配对用户输入中出现的所有单引号。假设已经在一个数字字段中发现了一个SQL注入漏洞,但需要在攻击有效载荷中使用一个字符串值。不使用单引号,如何在查询中插入字符串?
答:可以使用CHAR命令通过ASCII数字字符代码返回字符串。例如,在Oracle上,字符串FOO可以表示为:
CHAR(70)||CHAR(79)||CHAR(79)
7、在极少数情况下,应用程序在用户提交的输入中使用参数化查询,以不安全的方式建立动态SQL查询。什么时候会出现这种情况?
答:在将用户提交的输入置入查询的其他元素(如表和列名称),而非查询参数中时,将会出现这种情况。参数化查询无法使用这些项目的占位符进行预编译,因此需要采用不同的解决方案(可能需要基于严格的输入确认)。
8、假设已经提升了在应用程序中的权限,现在完全拥有管理员访问权限,这时如果在某个用户管理功能中发现了一个SQL注入漏洞,如何利用这个漏洞进一步扩大攻击范围?
答:因为已经具有管理员访问权限,因此可以使用应用程序本身检索所需的任何数据,也就是说,不必通过SQL注入攻击来获取应用程序本身的数据。但是,仍然可以利用这种攻击来访问任何与保存在同一数据库中的其他应用程序有关的数据,或者提升自己在数据库或基础操作系统中的权限,或者攻破数据库服务并将攻击范围扩大到更广泛的内部网络。
9、在攻击一个并未保存任何敏感数据、也未实施任何身份验证或访问控制机制的应用程序的情况下,如何排列下列漏洞的重要性?
(a) SQL注入
(b) XPath注入
(c) OS命令注入
答:XPath注入仅可用于从目标XML文件中检索数据。因此,如果应用程序不包含任何敏感数据,则这种漏洞并不会导致严重的后果。同样,利用SQL注入漏洞并不能从数据库中提取任何敏感数据。但是,有时可以利用这类攻击提升在数据库中的权限,并以其他方式实施攻击。
在某些情况下,SQL注入漏洞可能是一个更加严重的漏洞。另一方面,OS命令注入则始终是一个高风险的漏洞,因为攻击者可以利用它直接攻破基础服务器,并可将其作为针对内部系统的其他攻击的起点。
10、假如正在检测一个允许搜索个人资料的应用程序功能,并且怀疑该功能正访问某数据库或Active Directory后端。如何确定到底是哪一种情况?
答:如果该功能正访问数据库,则提交SQL通配符%作为搜索查询可能会返回大量记录。同样,如果该功能正访问Active Directory,则提交通配符*作为搜索查询可能会返回大量记录。在其他系统中,这两个通配符都不会造成相同的效果。