정보보안/화이트 해커를 위한 웹해킹의 기술

SQL Injection

b1ackhand 2022. 1. 25. 18:40

SQL Injeciton

- WHERE 구문 우회

#ID = 1
#PASSWORD = 1234

#query 
SELECT name, email FROM users WHERE ID = '1' and PASSWORD = '1234'

#ID = 1' or '1' = '1'--
#PASSWORD = 1234

#query
SELECT name, email FROM users WHERE ID = '1' or '1' = '1'--' and PASSWORD = '1234'

SELECT name, email FROM users WHERE ID = '1' or '1' = '1'

or True 형태를 만들어서 필요한 정보를 가져오는 방식

 

- UNION 공격

SELECT name, email FROM users WHERE ID = '1' UNION SELECT name, pw FROM users#'

합집합 UNION 을 이용한 방식

하지만 원래 조회하는 SELECT 문의 칼럼개수와 뒤의 요청 칼럼개수가 같아야 함으로 

ORDER BY 를 통해 먼저 몇 개의 칼럼을 반환하는지를 알아내고 

SELECT를 이용하여 검색

 

이러한 지식을 가지고 DVWA에서 실습을 해보았다.

 

코드의 내용은 다음과 같았다. query 부분을 보니 공부한 내용과 비슷하게 취약점이 있을법한 모습을 볼 수 있었다.

 

User ID에 각각 1, 2를 넣어봤을때

ID가 1인 admin, ID가 2인 Gordon을 출력했다.

 

 

책에서 준 팁에 의하면 

' 를 넣었을 때 위와 같이 sql 오류가 뜬다면 SQL Injection에 취약할 확률이 높다.

 

User ID에

1' or '1' = '1

을 넣었을 때 모든 정보가 출력되는 모습을 볼 수 있었다.

 

다음으로 UNION을 이용한 sql injection 역시 실습 해 보았다.

UNION은 앞의 SELECT의 요청 COLUMN개수가 같아야 되기 때문에 

1' ORDER BY 1#

1' ORDER BY 2#

넣어가며 칼럼의 개수를 찾는다.

 

칼럼의 개수이상이 됬을때 다음과 같은 오류가 발생하였다. (칼럼개수 2개)

 

위의 사진과 같이 오류없이 작동하는것을 알 수있고

SELECT 뒤에 상수가 나올시 상수 그대로 결과에 들어가는 모습을 알 수 있다.

이를 통해 어떤 칼럼의 정보가 어느 위치에 있는지를 알 수 있다.

 

Mysql 데이터베이스 에서는 information_schema 데이터베이스 schemata 테이블에서 데이터를 관리한다

이를 이용하여 schema_name을 가져온다.

 

의문) Mysql 데이터베이스를 쓰는지 어떻게 알 수 있을까?

 

 

데이터베이스 이름이 dvwa 라고 추측하고 dvwa 데이터베이스의 테이블만 출력시킨다.

 

user 테이블의 칼럼을 출력한 후

user password를 출력하면서 실습을 마친다.

 

password의 내용은 해싱 되어 있지만

다음과 같은 방식으로 복호화 해서 비밀번호를 알아낼 수도 있다.

'정보보안 > 화이트 해커를 위한 웹해킹의 기술' 카테고리의 다른 글

Command Injection  (0) 2022.01.29
Blind SQL Injection  (0) 2022.01.29
취약한 인증 공격  (0) 2022.01.25
정보 수집  (0) 2022.01.22
Burp Suite 기능  (0) 2022.01.22