인젝션(Injection), 가장 오래되고 파워풀한 보안 공격

인젝션이란 정상적이지 않은 일련의 입력값을 주입하여 인터프리터나 SQL 해석 등에서 처리되도록 하여 정상적인 프로그램의 흐름을 방해하는 일련의 공격 메커니즘을 의미합니다. 가장 널리 알려진 SQL 인젝션을 포함하여 다양한 유형의 인젝션 공격이 존재합니다. OWASP Top 10의 첫 번째 자리를 지키고 있는 웹 애플리케이션 보안의 기본이자 핵심이 인젝션 공격입니다.

 

인젝션 공격의 유형

 

SQL Injection(SQLi)

사진: CloudFlare

데이터베이스에서 처리되는 SQL(Standard Query Language)를 주입하여 의도치 않은 데이터의 노출이나 권한 획득, 심지어는 OS Command까지 실행되도록 하는 인젝션 공격입니다.

  • 일반적인 SQL Injection
    • 데이터베이스로 전달되는 SQL Query를변경시키기 위해 Web Application에서 입력받은 parameter를 변조 후 삽입하여 비정상적인 데이터베이스 접근을 시도하거나 쿼리를 재구성하여 원하는 정보를 열람하는 해킹 기법입니다. 인증 우회, 권한상승, 에러메시지통한 정보 엿보기, 저장 데이터 유출 및 조작 등을 목적으로 합니다.
    • 예시
      • SQL의 라인 주석 --을 이용하여 조건문에 1=1(무조건 참)을 주어 권한상승을 노립니다. 아래 예시의 경우 admin계정의 패스워드를 모르더라도 admin계정이 존재한다면 로그인이 가능해집니다.
      • SELECT * FROM users WHERE username='admin' and password='password' OR 1=1 --'
  • Blind SQL Injection
    • 악의적인 문자열의 삽입 대신 SQL 수행 결과의 참, 거짓에 따른 서버의 반응을 통해 DB정보를 유추하는 공격기법입니다. 일반적인 SQL Injection의 경우 입력문 그 자체로 공격이 성공되는 경우가 많지만, 블라인드 SQL 인젝션의 경우 서버의 반응을 조합하여 DB정보를 유추한다는 점에서 여러 번 시도되어야 한다는 차이점이 있습니다.
    • 주로 SUBSTR(), ASCII() 와 같은 SQL Function을 사용하여 이뤄집니다. 대응방법은 일반적인 SQL Injection과 동일합니다.
    • 분류
      • Boolean based injection: 조작된 SQL 실행 결과의 참/거짓 여부를 보고 다음 행동을 이어 나갑니다. 주로 공격 대상 탐색 과정에서 취약한 사이트 여부를 확인할 때 사용됩니다.
        • 아래 예문에서 1=2라는 구문 때문에 SQL 실행결과 변한다면 조작된 SQL 쿼리가 작동한다는 의미입니다. 즉 취약한 사이트로 SQL Injection 공격이 가능함을 알 수 있습니다.
        • SELECT title, description, body FROM items WHERE ID = 2 and 1=2
      • Time based injection: 조작된 input을 전송했을 때 응답값이 전달되는 시간 차이를 통해 공격의 성공 유무를 유추하는 기법입니다. 일반적으로 시간이 더 소모된다면 서버가 무언가를 처리한다는 의미가 되고, 거의 즉시 응답이 리턴된다면 처리하는 것이 없다는 의미가 됩니다. 이런 유추를 통해서 Boolean based blind SQL injection과 마찬가지로 공격 성공의 참/거짓을 판단하고 다음 행동을 이어가게 됩니다.
        • 의도적으로 sleep 구문을 주입해 응답이 의도한만큼 늦어진다면 공격이 성공했음을 알 수 있습니다.
        • 1 or sleep(5)

 

CRLF Injection

공격자는 예상치 못한 CRLF(줄바꿈 문자)를 삽입하여 응답 값을 변조시킵니다. 주로 XSS(Cross-Site Scripting) 공격과 함께 수행됩니다. CRLF 공격은 HTTP를 이용하는 웹 애플리케이션에 특히 치명적일 수 있습니다. HTTP는 CRLF를 통해서 헤더와 바디 부분을 구분하기 때문에 원치 않는 부분에 CRLF가 삽입되게 되면 응답 값 자체가 제대로 동작하지 않도록 할 수 있고 이것은 DOS(Denial Of Service) 공격으로 이어질 수 있습니다.

  • HTTP 헤더에 CRLF를 한번 삽입하게 되면 공격자는 헤더 값을 추가할 수 있습니다. CRLF를 두 번 삽입하게 되면 헤더를 종료하고 콘텐츠로 넘어가게 됩니다.
  • XSS와 함께 응답 HTTP 헤더의 Content-Length 필드를 조작합니다. CRLF를 한번 삽입하고 이후에 Content-Length값을 전달해 조작된 콘텐츠를 보여주는 것이 가능해집니다.
  • http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3

 

Email Header Injection

웹 애플리케이션과 연동된 이메일 프로토콜(IMAP/SMTP 등)을 대상으로 한 인젝션 공격입니다. 아래 예시처럼 이메일 전송을 위한 파라미터를 조작하는 형태로 쓰일 수도 있고, 이메일 서버 자체를 대상으로 한다면 SMTP 구문 등이 직접 삽입될 수도 있습니다.

  • 취약한 코드: 웹에서 입력된 값을 아래 예시처럼 검증 없이 사용하게 되면 인젝션 공격에 취약합니다.
  • <?php if(isset($_POST['name'])) { $name = $_POST['name']; $replyto = $_POST['replyTo']; $message = $_POST['message']; $to = 'root@localhost'; $subject = 'My Subject'; // Set SMTP headers $headers = "From: $name \n" . "Reply-To: $replyto"; mail($to, $subject, $message, $headers); } ?>
  • 정상적인 패킷
  • POST /contact.php HTTP/1.1 Host: www.example2.com name=Anna Smith&replyTo=anna@example.com&message=Hello
  • 조작된 패킷
  • POST /contact.php HTTP/1.1 Host: www.example2.com name=Best Product\nbcc: everyone@example3.com&replyTo=blame_anna@example.com&message=Buy my product!

LDAP Injection

LDAP(Lightweight Directory Access Protocol) 명령문을 조작하여 의도하지 않은 LDAP 명령을 수행하도록 하는 공격 기법입니다. LDAP이 주로 인증을 위한 데이터를 핸들링하기 때문에 권한상승 목적으로 악용되는 경우가 많습니다. 웹어플리케이션에서 LDAP 명령어를 수행할 때는 반드시 입력값 체크를 통해서 명령문이 조작되는 것을 방지해야 합니다.

 

OS Command Injection

웹어플리케이션에서 OS레벨의 명령문을 수행할 때 발생할 수 있는 취약점입니다.

 

  • 아래 php명령문은 입력값을 체크하지 않고 그대로 쉘 명령문을 수행하는데 사용하고 있습니다.
  • <?php $address = $_GET["address"]; $output = shell_exec("ping -n 3 $address"); echo "<pre>$output</pre>"; ?>
  • 공격자가 아래와 같이 입력문을 조작한다면 부가적인 명령문을 실행할 수 있게 됩니다. 아래 예시에서는 dir 명령을 실행하고 있습니다.
  • http://example.com/ping.php?address=8.8.8.8%26dir

Injection 공격 대응 방안

 

시큐어 코딩

대부분의 인젝션 공격을 방어하기 위해서는 시큐어 코딩을 준수하여야 합니다. 입력값 체크, 바인딩매개변수방식(PreparedStatement, Stored Procedure) 사용 등으로 대부분의 SQL인젝션은 쉽게 방어가 가능합니다. 또한 Java의 경우 Servlet Filter 사용으로 입력문의 비정상 문자열이 Persistance 계층에서 사용되기 전 체크할 수 있는 방법이 있습니다.

인젝션 공격 탐지

DB테이블에 조작된 흔적이나 Web서비스 로그를 통해 공격 흔적을 찾아볼 수도 있습니다. DB테이블의 레코드 중 주석 문자열이나 function을 포함한 데이터가 있는지 검색하는 것으로 SQL Injection 공격의 유무를 파악할 수 있습니다. 웹서비스 로그도 같은 방식으로 검색해 각종 인젝션 공격의 유무를 파악할 수 있습니다.

 

참고자료
acunetix, What Are Injection Attacks
위키피디아, SQL삽입
위키피디아, 코드 인젝션
ismailtasdelen.medium.com, SQL Injection Payload List

 

 

다른 글 더 보기

접근통제 3요소(Access Control)
통합위협관리시스템, UTMS
침입탐지 시스템(Intrusion Detection System)

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기