API 是调用方和被调用方之间的约定。最常见的 API 滥用是由于调用方未能遵守此约定的终止导致的。例如,如果某个程序在调用 chroot() 后未能调用 chdir(),则违反了用于指定如何安全地更改活动根目录的约定。库滥用的另一个典型示例是期望被调用方向调用方返回可信的 DNS 信息。在这种情况下,调用方通过对被调用方行为做出某种假设(返回值可用于身份验证目的)滥用其 API。另一方也可能违反调用方-被调用方约定。例如,如果编码器子类化 SecureRandom 并返回一个非随机值,则将违反此约定。
DBMS_UTILITY.EXEC_DDL_STATEMENT
将仅执行归类为数据定义语言的一部分的指令。嵌入式 SQL 不支持的其他指令将在不提示的情况下忽略。当使用该程序时,这种行为将导致很难检测到错误。http://www.example.com/index.php?param=...
,如果 URL 参数 param
(代替“...”传递)与表示“零个或更多字母数字字符”的 POSIX 正则表达式 '^[[:alnum:]]*$'
相匹配,则 index.php
中 php 的以下片段会将其输出到屏幕中。
<?php
$pattern = '^[[:alnum:]]*$';
$string = $_GET['param'];
if (ereg($pattern, $string)) {
echo($string);
}
?>
Example 1
可在使用字母数字输入的情况下正常运行,但由于使用不安全的 ereg()
函数来验证受破坏的输入,因此可能会通过注入 null
字节发动 Cross-Site Scripting (XSS) 攻击。如果为 param
传递一个值,而该值包含一个有效的字母数字字符串,并后跟 null
字节和 <script>
标签(例如 "Hello123%00<script>alert("XSS")</script>"
),则 ereg($pattern, $string)
仍会返回 true
,因为 ereg()
函数在读取输入字符串(从左至右)时会忽略 null
字节字符后面的所有内容。在此示例中,这意味着 null
字节之后注入的 <script>
标签将显示给用户并进行求值。xp_cmdshell
。不应该使用此函数。xp_cmdshell
会启动 Windows 命令 shell 来执行提供的命令字符串。该命令会在默认系统中或提供的代理上下文中执行。但目前没有一种方法可将用户限制为只能执行一组预先指定的特权操作,为用户授予任何权限都会允许其执行任何命令字符串。chroot()
系统调用的使用不当会让攻击者从 chroot 监牢中逃脱出来。chroot()
系统调用允许程序修改其 file system 根目录的含义。适当地调用 chroot()
后,程序无法访问在新的根目录下定义的目录树之外的任何文件。这样的环境称为 chroot 监牢,通常用来防止攻击者破坏进程,继而访问未经授权的文件。例如,在 chroot 监牢环境中运行多个 FTP 服务器,可以防止攻击者发现新服务器漏洞后下载密码文件或者其他系统中的敏感文件。chroot()
的使用不当可能会让攻击者从 chroot 监牢中逃脱出来。因为 chroot()
函数的调用不会改变进程当前的工作目录,所以在调用 chroot()
之后,相对路径可能仍然会引用 chroot 监牢之外的 file system 资源。
chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);
GET
命令。FTP 服务器在其初始化例程中调用 chroot()
,试图阻止对 /var/ftproot
之外的文件的访问。但因为服务器没有通过调用 chdir("/")
来更改当前的工作目录,所以攻击者可以请求文件的 "../../../../../etc/passwd
”,并获取该系统密码文件的副本。java.io
包,这违反了企业级 JavaBeans 编程规范。FileResponse
实例可允许攻击者下载应用程序二进制码,或者查看受保护目录下的任意文件。
from django.http import FileResponse
...
def file_disclosure(request):
path = request.GET['returnURL']
return FileResponse(open(path, 'rb'))
...
例 2:下面的代码会接受不可信赖的数据,并使用其构造服务器端转发所使用的路径。
...
String returnURL = request.getParameter("returnURL");
RequestDispatcher rd = request.getRequestDispatcher(returnURL);
rd.forward();
...
...
<% String returnURL = request.getParameter("returnURL"); %>
<jsp:include page="<%=returnURL%>" />
...
...
String returnURL = request.getParameter("returnURL");
return new ModelAndView(returnURL);
...
<webflow:end-state id="finalStep" view="${requestParameters.url}"/>
<webflow:view-state id="showView" view="${requestParameters.test}">
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver
将使用其配置的前缀,然后连接在视图属性中传递的值,最后添加后缀。
...
String returnURL = request.getParameter("returnURL");
return new ActionForward(returnURL);
...
realloc()
来调整储存敏感信息的缓冲区大小。因为该函数可能会将敏感信息的副本遗留在内存中,而您又无法对这部分内存进行覆盖。realloc()
函数通常用来提高某个分配的内存块的大小。该操作经常要求将以前的内存块中的内容复制到新的且更大的内存块中。该操作会完整地保留原内存块中的内容,但不允许程序进行访问,这就使程序无法清除内存中的敏感数据。如果攻击者能够后期访问某个内存转储中的内容,敏感数据就会暴露。realloc()
:
plaintext_buffer = get_secret();
...
plaintext_buffer = realloc(plaintext_buffer, 1024);
...
scrub_memory(plaintext_buffer, 1024);
realloc()
,所以在原来对 plaintext_buffer
分配的内存中仍会看到该数据的副本。VirtualLock
来锁定包含敏感数据的页面。因为该函数并不总会执行。VirtualLock
函数旨在锁定内存中的页面,以防这些页面在磁盘上被标注页码。然而,在 Windows 95/98/ME 操作系统上,这一函数仅作为桩函数使用,因而不会产生什么影响。