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 DB는 information_shema라는 DB에서 데이터베이스 이름, 테이블, 칼럼 정보 등을 관리, 따라서 information_ schema의 schemata 테이블로부터 shema_name을 가져오는 SQL 쿼리문을 이용하면 DB이름을 알아낼 수 있음
- ‘ 앞에 상수를 써도 되지만 안 써도 됨
- first name 뒤에 데이터 베이스의 이름이 출력되고 있고, DVWA에서 사용하는 DB의 이름이 dvwa 임을 추측할 수 있음
' UNION SELECT table_name,2 from information_schema.tables where table_schema='dvwa'# |
- table_schema가 dvwa인지를 확인하는 조건을 주어 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# |
- 사용자 이름과 패스워드 해시가 출력됨, admin의 surname 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 |
댓글