기존 SQL Injection 취약점과는 달리, 추출하려는 데이터가 눈에 보이지 않을 때 True인 쿼리문과 False인 쿼리문의 응답이 다른 점을 이용해 데이터를 추출해낸다
substr, left, right 등의 함수를 활용하여 분리하여 한 글자씩 추출해내는 것이 포인트
아래는 전체적인 동작 과정

if(substr(SELECT password FROM user WHERE username='admin'),1,1)='a',"admin","no-admin")
SELECT password FROM user WHERE username='admin'
substr( ... ,1,1)
... = 'a'
if({조건문},"admin,"no-admin")
위 과정을 통해 원하는 데이터를 추출해낼 수 있음.
원리는 Blind SQL Injection과 같음
하지만 쿼리문의 True, False를 눈에 보이는 데이터로 반환하지 않을 때, sleep()등의 시간으로 참/거짓을 판단하는 방식
if(substr(SELECT password FROM user WHERE username='admin'),1,1)='a',"sleep(1)","no-admin")
무차별 대입(brute force)은 로그를 많이 남길 수 밖에 없음.
이진 탐색(Binary Search)을 활용하면 시행을 log 수준으로 낮출 수 있음.
Sanitize / Filtering
함수 활용 or 정규 표현식 등
Prepared Statement SQL
입력에 대해 특정 Type(문자열 등)으로 바인딩하게 하는 방법
궁금하신 점이나, 잘못된 정보가 있다면 댓글로 알려주세요. 감사합니다!
좋은 글 보고 갑니다 ^_^~