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 해시값으로 암호화가 되어있어 복호화를 진행하여서 각각 확인해 보았다.
결과는 다음과 같다.