본문 바로가기

CAT-Security/미분류

blind sql injection 기초 및 실습



게시판에서 이뤄지는 정상적인 요청 입니다.


정상적인 주소값 뒤에 and substring(database(), 1,1) = char(99)# 라는
비정상적인  요청이 들어갔지만
정상적으로 페이지가 뜹니다!!
char(99)의 값을 바꿔보도록 하겠습니다.

 

note_number=42 의 자리와 subject=@#$@# 의 변수값 자리를 변경해주었습니다.
제대로 요청이 안들어가드라구요^^;
자리 변경 해준뒤에 char(98)을 바꿔 주면은
아무것도 뜨지않은 상태가 되어 버립니다.

이때의 상태가 blind sql injection의 기본입니다.

정상적인 요청은 뒤에 sql 쿼리가 붙는다고 하더라도 '참'값이 되어서  페이지를 '정상'적으로 출력 합니다.
하지만 '거짓'값으로 sql쿼리가 붙는다면은 페이지에 아무것도 뜨지 않게 됩니다.

즉 페이지가 뜬다면 쿼리값이 참이라는것이고
페이지가 뜨질 않는다면 쿼리값이 거짓이라는 것 입니다.

이 참 or 거짓의 페이지로 db의 내용을 추측 할수있고, 나아가 알아낼수 있습니다. 




정상적인 요청 뒤에 붙은 sql 쿼리를 파헤쳐 봅시다.
 and substring(database(), 1,1) = char(99)#
or
and substring(db_name(), 1,1) = char(99)#
둘다 같은 의미의 쿼리 입니다.

 mysql에서 substring은
substring('db 혹은 문자열', 몇번째부터 , 몇개) 라는식으로 사용 할수 있습니다.
예를 들어
substring('playground' , 5, 4) 일때의 값은 
'grou' 가 되게 됩니다. 5번째 문자인 g부터 4개의 값을 가져올수 있습니다.

즉 substring(database(), 1,1) 의 의미는 db의 첫번째 글자부터 첫번째 글자까지 문자열을 리턴한다가 될수 있습니다.
그리고 데이터베이스의 첫글자가 char(99) = 'c' 값 이기때문에 참이되어서 페이지가 뜨고 그 이의외 값을 넣는다면은
거짓이 되어서 페이지가 제대로 뜨질 않게 되는것 입니다.

 그렇다면 substring(database() ,1,1) = c라면
substring(database() ,2,1 =  의 값을 참으로 리턴받을수 있다면은 그 문자열이 무엇인지 알수있을 것 입니다.
이 순으로 계속되어서 substring으로 리턴 받는다면은 db의 이름을 알수 있게 될것입니다.


 '정상'적으로 페이지가 뜨는것과 '비정상'적으로 페이지가 안뜨는것의 차이점은
바로 페이지의 리턴되는 소스크기가 대표적일것으로 생각 됩니다. 
아무래도 뭔가 나오는 페이지와 아무것도 안뜨는 페이지의 차이는 크게 나겠지요.
그것을 응용한 소스 입니다.
이중 for문으로 리턴 받은 url의 길이값이 1500보다 크다면은 (정상적인 페이지의 url 길이값은 1800정도 였습니다.)
result라는 문자열에 if문으로 저장하도록 했습니다.

최종 결과 값은 crobi 였습니다. 데이터베이스의 이름을 알아냈습니다!!^^
 



information_schema!?

select table_name from information_schema.tables where table_schema

select column_name from information_schema.columns where table_name

select user_password from web_login where level


끝이 아닙니다.
업로드중입니다. 

'CAT-Security > 미분류' 카테고리의 다른 글

정리 잘 되어 있음!!  (0) 2012.04.06
PLT . GOT 정리  (3) 2012.03.22
blind sql injdection  (0) 2012.03.11
[Hack-Me] View Sourcecode 2(100)  (0) 2012.03.02
[Hack-Me] Easy Steganography(200)  (0) 2012.03.02