가이드라인

주입 101

가장 잘 알려진 취약점 유형 중 하나는 인젝션 취약점이며, 특히 놀랍게도 누구도 부인할 수 없는 포스터 자식인 인젝션 취약점입니다: SQL 인젝션입니다. 기술 업계에서 SQL 인젝션에 대한 얘기를 피하기는 어렵기 때문에 오늘은 이에 대해 이야기해 보겠습니다. 

SQL 인젝션을 사용하면 SQL 쿼리의 동작을 공격자의 의도에 맞게 조작할 수 있습니다. 

표면적으로는 다르지만 모두 같은 원리로 작동하는 다른 많은 유형의 주사도 있습니다. 

간단히 요약하자면, 가장 일반적인 주입 유형은 다음과 같습니다:

  • SQL 주입
  • 교차 사이트 스크립팅(HTML/자바스크립트 삽입)
  • 경로 탐색(경로/URL 삽입)
  • 명령 주입
  • 코드 삽입 

간단한 주사 101

앞의 주입 유형 목록을 보면 공통점이 하나 있는데, 모두 문자열을 포함하고 인터프리터를 통해 실행된 다음 문자열이 나타내는 모든 작업을 수행한다는 점입니다. 중괄호로 "사용자 입력"을 표시했습니다.     

유형 입력 예시 해석 방법
SQL SELECT name FROM users WHERE username = '{admin}' 사용자 테이블의 모든 행에서 사용자 이름이 'admin'인 '이름' 열을 선택합니다.
HTML {존 스미스} "John Smith"라는 이름을 굵은 글씨로 표시합니다.
경로 /var/www/app/documents/{privacy-policy.pdf} var/www/app/documents/` 폴더에 있는 `privacy-policy.pdf` 파일을 가리킵니다.
명령 ping {8.8.8.8} IP `8.8.8.8`로 일련의 ICMP 핑을 보냅니다.
코드 const name = '{John Smith}'; 상수 변수 'name'을 'John Smith' 값으로 설정합니다.

그렇다면 사용자 입력 입력이 안전하지 않은 경우 어떻게 될까요? 공격자는 무엇을 할 수 있을까요? 다시 말하지만, 이 시나리오에서는 괄호 안에 들어오는 모든 것이 "사용자 입력"으로 간주됩니다.

유형 입력 예시 해석 방법
SQL - 주입됨 SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' 사용자 테이블의 모든 행에서 사용자 아이디가 'admin'인 사용자의 '이름'과 사용자 아이디가 'admin'인 사용자의 비밀번호 해시를 선택합니다.
HTML - 삽입됨 {} "John Smith"라는 이름을 굵은 글씨로 표시합니다.
경로 - 주입됨 /var/www/app/documents/{../../../../../etc/shadow} etc/` 폴더의 `shadow` 파일을 가리킵니다.
명령 - 주입 ping {8.8.8.8 && ls . } IP `8.8.8.8`로 일련의 ICMP 핑을 보내고, 현재 디렉토리의 내용을 `ls`로 출력합니다.
코드 - 주입 const name = '{John Smith'; exec('ls .'); # }'; 상수 변수 `name`을 `John Smith` 값으로 설정한 다음 시스템 명령 `ls`를 실행합니다.

이 예제에서는 사용자 입력이 결과에 어떤 영향을 미칠 수 있는지 살펴보세요. 

이것이 바로 인젝션의 본질입니다. 원래 프로그래머가 의도한 것과 다른 작업을 수행하도록 인터프리터에 전달되는 내용에 영향을 주는 것입니다.

이는 고려해야 할 기본 사항일 뿐입니다. 몇 가지 다른 주입 유형은 좀 더 자세히 살펴볼 필요가 있기 때문에 별도의 페이지로 분리했습니다. 

여기에서 찾을 수 있습니다:

명령어 주입↪CF_200D↩

경로 탐색↪CF_200D↩

SQL 주입↪CF_200D↩

사이트 간 스크립팅