가장 잘 알려진 취약점 유형 중 하나는 인젝션 취약점이며, 특히 놀랍게도 누구도 부인할 수 없는 포스터 자식인 인젝션 취약점입니다: 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↩
사이트 간 스크립팅