계: Input Validation and Representation
입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
LDAP Injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
이런 경우, Fortify Static Code Analyzer는 데이터 소스를 신뢰할 수 있는 것으로 판단하지 않습니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
쿼리가 실행되는 권한에 따라
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
이런 경우, Fortify Static Code Analyzer는 데이터 소스를 신뢰할 수 있는 것으로 판단하지 않습니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;
foreach(SearchResult res in src.FindAll()) {
...
}
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
(manager=Smith, John)
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
쿼리가 실행되는 권한에 따라
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.desc.semantic.dotnet.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 네트워크 소켓에서 읽어들이므로 신뢰할 수 없습니다.
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
쿼리가 실행되는 권한에 따라
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 네트워크 소켓에서 읽어들이므로 신뢰할 수 없습니다.
fgets(manager, sizeof(manager), socket);
snprintf(filter, sizeof(filter, "(manager=%s)", manager);
if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
(manager=Smith, John)
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
manager
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 manager
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
쿼리가 실행되는 권한에 따라
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.desc.dataflow.cpp.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
쿼리가 실행되는 권한에 따라
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
...
DirContext ctx = new InitialDirContext(env);
String managerName = request.getParameter("managerName");
//retrieve all of the employees who report to a manager
String filter = "(manager=" + managerName + ")";
NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
(manager=Smith, John)
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
쿼리가 실행되는 권한에 따라
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.desc.dataflow.java.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
쿼리가 실행되는 권한에 따라
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.
2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.
...
$managerName = $_POST["managerName"]];
//retrieve all of the employees who report to a manager
$filter = "(manager=" . $managerName . ")";
$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...
관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.
(manager=Smith, John)
하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
쿼리가 실행되는 권한에 따라
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 액세스할 수 있는 모든 레코드에 영향을 줄 수 있습니다.desc.dataflow.php.ldap_injection