상세 컨텐츠

본문 제목

9-1.SQL Injection(DVWA - Low)

Hacking/Web Hacking

by it thief 2020. 1. 31. 19:01

본문

SQL Injection

SQL Injection은 데이터베이스 쿼리를 위조하여 허가 되지 않은 데이터베이스 정보에 접근할수 있다. 

 

WHERE 구문(조건절)

WHERE 구문은 조건을 의미한다. SELECT name,password FROM users WHERE name='hacker'구문은 users테이블에 name이 'hacker'인 password를 조회하는 구문이다.

 

UNION 구문(합집합)

UNION 구문은 앞선 구문의 결과와 UNION뒤에 오는 구문의 결과를 합해 결과를 출력해주는 구문이다. UNION구문은 앞선 칼럼 갯수와 뒤에오는 구문의 칼럼 갯수가 같아야한다.

SELECT name,password FROM users UNION SELECT address,phone_number FROM users구문은 users테이블에 name,password,address,phone_number을 함께 조회해주는 구문이다.

 

SQL Injection(DVWA - Low) WHERE 구문

1. SQL Injection을 하기전에 공격할 Form이 공격에 통할지 알아보기 위한 기본적인 방법은 작은 따움표를 대입해 보는 것이다. 조건절이 WHERE id=''처럼 되어 있을때 작은 따움표를 대입하게 되면 WHERE id='''처럼 되어 구문 오류가 발생하게 되는데 구문 오류가 발생하게되면 Form의 위조로 인해 데이터베이스 쿼리를 위조할수 있는 가능성이 있다는 것이다.

 

2. 소스 코드를 보면 WHERE user_id='$id'구문에 $id는 Form에 입력값이 들어간다는 것을 알수 있는데 작은 따움표를 쓰게 되면 WHERE user_id = '''가 되어 구문 오류가 발생 되는 것을 볼 수 있다. 

 

3. 구문 오류가 발생하는 것을 보았으니 OR을 이용하여 WHERE구문을 무조건 True로 만들어 users의 테이블의 first_name, last_name을 조회하겠다. 1' or '1' = '1을 이용하면 WHERE구문을 True로 만들수 있는데 그 이유는 OR은 하나가 True이면 결과는 True이다. 이걸 이용하여 '1'='1은 무조건 True이므로 users테이블의 first_name과 last_name을 모두 조회 할수 있다. 우리가 위조한 쿼리의 형태를 보면 SELECT first_name , last_name FROM users WHERE user_id = '1' or '1'='1'이다.

 

SQL Injection(DVWA - Low) UNION구문

1. UNION구문은 합집합으로 다양한 정보를 알아 낼수 있는데 칼럼 갯수가 같아야하기 때문에 칼럼을 갯수를 알아바야한다. 칼럼 갯수를 알기위해선 ORDER BY 상수#구문과 UNION SELECT 상수#구문으로 알 수 있다.

 

UNION SELECT 상수#(상수는 어떠한 숫자가 와도 상관없다.) 

SELECT 상수는 상수를 그대로 출력해주는 형태의 구문으로 사용된다. UNION은 칼럼 갯수가 같지 않으면 Error를 발생하는데 이러한 현상을 통해 여러차례 대입해보면서 칼럼 갯수를 알아보는 형식이다. 1' UNION SELECT 1,2#을 해보면 정상 조회되는 것을 보아 앞선 구문의 칼럼이 두 개인것을 알수 있다.

 

ORDER BY 상수#(상수는 정렬할 기준을 정하는 수이다. 1은 첫번째 칼럼 2는 두번째 칼럼기준)

ORDER BY는 칼럼을 기준으로 정렬하는 구문이다. 상수에 칼럼 갯수보다 높은 숫자가 들어오면 Error를 발생하게 되는데 이를 이용하여 칼럼 갯수를 알아 볼수 있다. 1' ORDER BY 2#을 해보면 정상 출력이 되지만 3을 넣게 되면 Error가 발생하므로 칼럼 갯수는 2개이다.

 

2. 이제 칼럼 갯수가 2개인것을 알았으니 데이터베이스 이름을 조회하여 모든 데이터베이스 이름을 알아 보겠다. My SQL은 information_schema에 데이터베이스 정보들이 들어 있다. 데이터베이스 이름은 information_schema데이터베이스에 schemata테이블에 들어있다. 앞선 쿼리문에 칼럼갯수가 두개인것을 감안하여 칼럼을 2개로 설정하고 조회하여야 한다. 1' UNION SELECT schema_name,1 FROM information_schema.schemata#구문을 이용하여 조회해 보겠다.

 

3. 데이터베이스 이름에 dvwa가 있는 것을 알았으니 dvwa데이터베이스의 테이블을 알아보겠다. 1' UNION SELECT table_name,table_schema FROM information_schema.tables WHERE table_schema='dvwa'#구문을 이용하여 information_schema데이터베이스에 tables테이블에서 table_name과 table_schema를 가져오겠다.

 

4. 테이블에 dvwa -> users를 확인했다. users에 사용자의 정보가 들어 있을 것이다. users테이블의 칼럼을 알아내 보겠다. 1' UNION SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='dvwa' and table_name='users'#구문을 이용하여 table_schema 와 table_name이 'dvwa' , 'users'인 column_name을 조회해 보겠다.

 

5. 칼럼이름을 보면 password가 있는데 패스워드를 나타내는 칼럼인것 같으니 password를 조회해 보겠다. 1' UNION SELECT user,password FROM users#구문을 이용하면 password를 조회해 볼수 있는 것을 알수 있다. 하지만 password가 해쉬값으로 변경되어 있는데 이는 데이터베이스가 공격당해도 패스워드를 보호하기위한 암호 방법중 하나이다. 하지만 취약점이 많은 해쉬들은 구글에 검색만 해보아도 금방 복원할수 있다.

'Hacking > Web Hacking' 카테고리의 다른 글

9-3. SQL Injection(DVWA - Medium,High)  (0) 2020.02.02
9-2.SQL Blind Injection(DVWA - Low)  (0) 2020.02.01
8-2.CAPTCHA ATTACK(DVWA - High)  (0) 2020.01.27
8-1.CAPTHCA ATTACK(DVWA - Low,Medium)  (0) 2020.01.27
7-3.File Upload(DVWA - High)  (0) 2020.01.25

관련글 더보기

댓글 영역