Kali Linux - DVWA실습 (SQL Injection)

Kim Dae Hyun·2021년 5월 22일
1

Security

목록 보기
6/7

SQL Injection ?

  • SQL Injection은 보안 취약점을 이용하여 악의적인 SQL문을 실행시켜 데이터베이스를 조작하는 Code Injection의 한 종류이다.
  • 보통 입력값을 이용하여 동적인 쿼리를 구성하는 경우 해당 취약점이 생긴다.

DVWA를 이용한 SQL Injection (Low Level Security)

  • Low Level 소스코드
    • 아래 코드의 취약점은 WHERE user_id = '$id;' 부분이다.
    • 입력받은 id값을 그대로 문자취급하여 쿼리문에 포함시키기 때문이다.
  • 우회 방법1 (or)
    • 공격에 성공하여 모든 회원 정보를 조회하였다.
    • 1' or '1' = '1 을 입력한 SQL문을 보자.
    • 언제나 참이기에 모든 회원정보를 조회 가능하다.
  • 우회 방법2 (칼럼 개수 알아내기 Union)
    • 두 번째 우회방법은 Union을 통해 칼럼의 개수를 알아내는 방법이다.
    • Union명령어는 보통 두 개 select문을 사용하는데, 두 select문의 칼럼수가 같아야만 오류 없이 정상적으로 실행된다.
    • 칼럼의 개수를 알아내는 것은 이후 Union이용하여 DB의 정보를 조회하는데 있어 선제 조건이다.
    • 칼럼수가 같아야 하는 특성을 이용하는 우회 방법이다.
    • union select 1# : 한 개 칼럼을 가진 select문과 Union
    • 한 개 칼럼을 Union시킨 결과 오류가 발생하였다. 즉, users의 칼럼은 한 개가 아니라는 것.
    • union select 1,1# : 두 개 칼럼을 가진 select문과 Union
    • 정상적으로 쿼리문이 수행되었으므로 users의 칼럼의 개수가 2개인 것을 알 수 있다.
  • 우회 방법3 (칼럼 개수 알아내기 OrderBy)
    • 세 번째 우회방법은 Orderby를 통해 칼럼의 개수를 알아내는 방법이다.
    • Orderby는 임의 칼럼을 기준으로 정렬을 수행하는 명령어이다.
    • 원본 테이블의 칼럼 개수보다 정렬의 기준이 되는 칼럼의 개수가 큰 경우 오류를 발생시키기는 특성을 이용하여 칼럼의 개수를 알아낸다.
  • 우회 방법4 (데이터베이스 명 알아내기)
    • 입력: 1' union select schema_name, 1 from information_schema.schemata#
    • select문의 1은 union의 정상실행을 위해 칼럼수를 맞춰준 것
    • information_schema는 MySQL에서 DB스키마에 대한 정보를 저장하는 테이블이다.
    • 여러 테이블이 조회되었다. 조회된 dvwa데이터베이스의 테이블까지만 조회해보자.
  • 우회 방법4 (테이블 알아내기)
    • 입력: 1' union select table_name, 1 from information_schema.tables where table_schema='dvwa'#
    • dvwa데이터베이스의 모든 테이블이 조회되었다.
    • 이와 동일한 방식으로 테이블 내 칼럼까지 조회 가능하다.

DVWA를 이용한 SQL Injection (Medium Level Security)

  • Medium 단계의 대응 방법
    • 사용자에게 입력값을 제한적으로 받음으로 대응하고 있다.
    • 하지만 우리는 요청을 가로챌 수 있기에 이렇게 UI적인 대응방법은 충분히 우회 가능하다.
  • Medium 단계 우회방법 1
    • 아무 값이나 submit 후에 burpsuite로 요청을 인터셉트 한다.
    • 1번 id를 조회하기 위해 1번을 요청한 것이지만 모든 회원 정보를 확인하기 위해 ' 1 or 1=1 ' 로 조작하여 요청해본다.
    • 모든 회원 정보 조회에 성공하였다.
  • Medium 단계 우회방법 2
    • Union을 통해 user와 password를 조회해보자.
    • 요청을 인터셉트하여 쿼리문을 조작한다.
    • ' 1 union select user, password from users# '
    • 우회에 성공한 모습이다.

DVWA를 이용한 SQL Injection (High Level Security)

  • High 단계의 대응 방법 1
    • 링크를 클릭하게 되면 입력값을 받기 위해 새로운 페이지가 나타난다.
    • 이런 UI구성은 SQL injection 대응에 아무런 도움이 되지 않는다. 여기까지는 Low단계와 다른 것을 잘 모르겠다..
  • High 단계의 대응 방법 2
    • 코드 수준의 대응 방법이다.
    • SQL의 LIMIT키워드를 사용하여 select의 결과로 최대 1개 만을 반환하도록 제한하고 있다.
    • 이 방법 또한 Low단계 우회 방법으로 우회 가능하다.
    • 입력값 뒤에 ' # '으로 주석처리를 한다면 LIMIT 키워드는 적용되지 않는다.
  • High 단계 우회방법
    • union을 통해 모든 user의 정보를 조회해보자.
    • Low 단계의 우회방법 정도로 우회에 성공하였다......

DVWA를 이용한 SQL Injection (Impossible Level Security)

  • Impossible Level 소스 코드
    • Impossible 단계의 UI는 Low단계와 동일하다. UI적인 대응은 SQL Injection의 대응책으는 부족하다.
    • 입력값에 대한 검증과 쿼리 파라미터를 적용시키는 코드 기술적인 요소가 반드시 필요하다.
    • 입력값을 철저히 제한 및 검증하고 구현하는 언어에 따른 파라미터 바인딩 기술을 사용해야만 한다.
profile
좀 더 천천히 까먹기 위해 기록합니다. 🧐

1개의 댓글

comment-user-thumbnail
2021년 5월 26일

크.. 대단하신데요?? 깜짝 놀라고 갑니다..

답글 달기