"SQL"을 "Injection"한다.
SQL은 데이터를 관리하는 프로그래밍 언어이다.
Inject는 주사, 주입하다라는 뜻을 갖고 있다.
말 그대로 프로그래밍 언어를 주입해서 DB에 접근하고 변조할 수 있는 기법이다.
SQL 인젝션을 시작하기 전 문법에 대해서 조금 알아야 하는데,
SELECT ~ FROM ~ (WHERE) 구문이 많이 쓰인다.
이름 | 나이 | 학번 |
김** | 20 | 20191234 |
이** | 21 | 20185678 |
학생이라는 이름을 갖는 테이블이 있다고 가정하면,
SELECT 이름, 나이 FROM 학생인 경우는 이런 테이블을,
이름 | 나이 |
김** | 20 |
이** | 21 |
SELECT * FROM 학생 WHERE 학번='20191234'인 경우
이름 | 나이 | 학번 |
김** | 20 | 20191234 |
이렇게 데이터를 다룰 수 있다.
SQL 인젝션 기법은
WHERE 뒤 내용을 우회하거나
UNION을 사용한다.
- WHERE
SELECT * FROM 학생 WHERE 학번='20191234'일 때 김**의 정보만 확인할 수 있었지만,
학번을 검색하는 창에다가
1' or 1='1 이라고 적어주면
SELECT * FROM 학생 WHERE 학번='1' or 1='1' 로 이해하고 WHERE뒤 내용은 TRUE가 돼서
모든 학생의 이름 나이 학번을 출력하게 될 것이다.
- UNION
UNION은 합집합의 개념으로
SELECT 이름, 나이 FROM 학생 WHERE 학번='1' UNION SELECT 학번, 비밀번호 FROM 학생#'
UNION을 사용할 때는 앞의 칼럼의 개수와 추가한 SELECT 구문의 칼럼의 개수를 맞춰줘야 한다.
#은 주석처리를 위해 사용하고 맨 뒤에 '의 짝이 맞지 않아 오류가 날 수 있으므로 추가한다.
비밀번호라는 칼럼이 앞 예제에는 없어서 에러가 날 수 있지만, 만약 있는 테이블이라면 비밀번호까지 보이게 될 것이다.(물론 비밀번호는 암호화를 하긴 한다.)
Blind SQL Injection이라는 기법이 있는데 SQL Injection과의 차이를 간단하게 정리한 PPT가 있다.
https://www.slideshare.net/PrashantPhatak/difference-between-sql-injection-and-blind-sql-injection
큰 차이는 결과를 볼 수 있는지, 데이터 구조를 바꿀 수 있는지라고 나와있다.
Blind SQL Injection은 데이터를 직접적으로 볼 수 없어서 결과의 변화를 보고 데이터를 찾아낸다.
Error를 발생시켜서 찾아내는 Error Blind SQL Injection,
응답 시간을 조작시켜서 찾아내는 Time Blind SQL Injection이 있다.
Blind SQL Injection을 공부할만한 좋은 책이 있다.(부팀장님 보고 계시죠?)
https://ridibooks.com/v2/Detail?id=2773000024
PHP, SQL을 하나도 모른 상태로 시작하다 보니 문제를 푸는 시간이 좀 걸렸지만,
Blind SQL Injection이 뭔지, 어떤 기법이 있고, 어떻게 사용하는지 공부할 수 있었다.
책에서 다루는 16번 문제까지 해결하니 어느 정도 자신이 생겼다.
※책을 보면 11번 문제부터 직접 코딩하라는 어려운 과제(?)를 내주시는데 처음 하시는 분들을 위해 소스를 준비했다.
12번은 이렇게 푸는 문제가 아니지만 서버 IP, 포트를 모를 경우 이렇게 requests를 받으면 된다.
쿠키는 크롬 기준 F12-Application 메뉴 - Stroage - Cookies에서 확인할 수 있다.
Value 밑에 값을 복사 붙여 넣기 하면 된다.
WordPress Plugin 취약점 분석 (0) | 2019.09.19 |
---|---|
컴퓨터구조 - 해저드 (0) | 2019.08.23 |
컴퓨터구조 - 파이프라이닝 (0) | 2019.08.17 |
웹 보안 - 브루트 포스 (0) | 2019.08.16 |
OP.GG 크롤링하기 (0) | 2019.08.08 |