본문 바로가기

Computer Security/Web

SQL Blind Injection

제가 여기저기서 조금조금씩 주워듣고 해본것들을 정리하는것이기 때문에, 일반적인 용어가 아닐수도 있습니다.

그리고, 문법은 MySQL을 기준으로 설명하겠습니다. (물론, 다른 SQL에서도 문법만 조금 달리하여 사용 가능합니다.)


Blind Injection이란 True or False의 결과값을 이용하여 DB의 내용을 알아내는 기술을 말합니다.


예를 들어서 설명을 해보겠습니다.


어떤 테이블이 있고, search 기능을 통해 특정한 num을 불러오는 기능이 있다고 할때


그 search의 쿼리문은 

select * from table where num=[원하는 번호] 

대충 이런형태 일것입니다.


그러면, 만약 원하는번호에


"1 and 1=1 #" 를 넣는다면,

select * from table where num=1 and 1=1 #

이 되어, 1=1의 부분은 항상 True이기 떄문에, 그냥 무시하고 원래 결과가 나올것입니다.


그럼 만약, "1 and 1=2 #"

을 넣는다면

select * from table where num=1 and 1=2 # 

이 되어, 항상 False가 됩니다.

그렇다면 아무 테이블도 출력하지 않겠죠.


바로 이 현상을 이용하는게 blind injection 입니다.


저 1=1,1=2 부분에 length(`pw`)=1, length(`pw`)=2, length(`pw`)=3, ... 이런식으로 하나씩 넣어본다면, num=1인 레코드의 pw컬럼의 값의 길이를 알수 있게됩니다.


그리고, substr(`pw`,1,1)='a', substr(`pw`,1,1)='b' ... 이런식으로 브루트포스 식으로 한글자 한글자씩 알아내는 작업을 할수 있습니다.


substr 함수는 어떤 스트링의 일부분만 잘라내는 함수입니다.

substr(스트링,어디서부터,몇개) 의 형식입니다.

그래서, substr('abc',1,1)='a' , substr('abc',2,1)='b' , substr('abc',3,1)='c' 이런식으로 사용되는 함수입니다.


저 스트링 자리에 컬럼의 이름을 써넣게 된다면, 해당 줄에 있는 그 컬럼에 해당하는 내용이 나오게 됩니다.


 num

id 

pw 

 1

hello 

what 

 2

hi 

who 

이런 테이블이 있을때,



search * from table where num=1 and substr(`pw`,1,1)='w' #

이런식의 쿼리를 보내면, True가 된다는거죠.

결국, True일때는 리스트에 첫번째줄만 나타날것이고,

False 일때는 리스트에 아무것도 나타나지 않을것입니다.


그래서 만약 true가 됐을때와 False가 됐을때 화면에 표시되는 내용이 다르다면.

이런 이런 방법을 이용해서 숨겨진 필드의 내용을 알아낼수 있습니다.


그리고 보통, 이런 작업을 수작업으로 하면 힘들기 때문에, 보통 파이썬등의 스크립트를 이용합니다.