일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- THM
- access control
- Authentication
- sql injection
- ssrf
- BANDiT
- php 파일 업로드하기
- War Game
- Cookie
- Recon
- Server Side Request Forgery
- php 로그인 페이지 만들기
- Cryptography
- privilege escalation
- OS Command Injection
- Reconnaissance
- tryhackme
- active reconnaissance
- Leviathan
- php To Do List
- FTZ
- overthewire
- php
- SQLi
- php login page
- php file upload
- 파일 업로드 취약점
- over the wire
- file upload
- active recon
- Today
- Total
R's Hacking Daily Log
SQLi (6) 본문
How to detect SQL injection vulnerabilities
공격자의 입장에서 SQL injection 공격을 한다고 할 때,
1. ' 를 입력해서 에러가 발생하는지 확인
2. or '1' = '1와 같은 boolean 조건문 활용
3. case then 문 사용
4. time delay
와 같은 기술을 Lab을 통해 접해보았다.
sql injection에서는 web page에 결과를 포함하느냐 안 하느냐의 여부가 중요한 정보가 될 수 있으며
web page에서의 차이를 찾을 수 없다면 time delay와 같이 부가적인 기술을 사용할 수 있다는 것도 배울 수 있었다!
또한 mysql의 information_scheme같이 meta data를 저장하는 table을 활용하여 어떤 테이블이 존재하는지,
어떤 컬럼이 존재하는지 알아낼 수 있는 방법에 더불어
column의 데이터 유형, 개수를 알아내기 위해 order by, union을 다루는 것까지 전반적인 내용을 훑어보았다!!
sql injection attack을 위해 알아내야 하는 정보와 그 정보를 수집하기 위해 어떤 sql을 활용할 수 있는지
따로 복습해 보는 것도 좋을 듯하다.
마지막으로 sql injection attack을 방어하기 위한 방법을 무엇이 있을지 알아보자.
How to prevent SQL injection
대부분의 SQL 인스턴스는 쿼리에 문자열을 그대로 연결하는 것 대신에
미리 준비해 둔 SQL에 매개변수 형태로 대입(바인딩)함으로써 방지할 수 있다.
이를 prepared statement or paramiterized query라고 한다.
"SELECT * FROM products WHERE category = '"+ input + "'";
문자열을 그대로 연결하는 방식의 sql을 보면 사용자가 선택한 옵션이나 입력한 값이 input 자리에 들어간다고 했을 때,
그 값이 그대로 input 자리에 들어가서
1. "SELECT * FROM products WHERE category = ' 에 input을 이어 붙여
2. "SELECT * FROM products WHERE category = ' INPUT 이 되고 마지막에 따옴표로 마무리되면서
3. "SELECT * FROM products WHERE category = ' INPUT '이라는 SQL이 만들어지게 된다.
반면 prepared statement는
"SELECT * FROM products WHERE category = ?"
사용자의 값이 들어갈 부분을 " ? " 처리하고 물음표 자리에 사용자의 입력값을 대입하게 되는 것이다.
만약 공격자가 임의 데이터를 삭제하고 싶어서 다음과 같은 sql을 주입한다고 하면
'; DELETE * FROM product--
이전 sql query에서는 위의 query가 문자열 그대로 연결되면서
"SELECT * FROM products WHERE category=''; DELETE * FROM products--'"
select문을 실행한 다음 delete문이 실행되어 products 테이블에 있는 모든 데이터가 삭제될 것이다.
이와 달리 prepared statement 방식으로 처리하게 되면
"SELECT * FROM products WHERE category = 'DELETE * FROM products--'"
카테고리 이름이 'DELETE * FROM products--'인 상품을 products 테이블에서 조회해!
라는 의미가 되어버리기 때문에 공격자가 의도한 대로 sql이 실행되지 않게 된다.
** prepared statement에서 statement는 사용하는 sql query 자체를 가리키는 말이라고 생각하면 된다.
** sql에서 " ; " 세미콜론 문자는 앞의 query와 뒤에 오는 query를 병렬적으로 연결해 주는 접속사 느낌이라고 보면 된다.
예시에서 본 것처럼 Prepared Statement를 구현하면 공격자가 주입한 sql이
실질적인 sql 문법으로 동작하지 못하기 때문에 SQLi attack에 대해 방어할 수 있다!! (OoO)
'Port Swigger > SQL Injection' 카테고리의 다른 글
SQLi (5) - Lab (0) | 2023.05.01 |
---|---|
SQLi (5) (0) | 2023.04.30 |
SQLi (4) (0) | 2023.04.28 |
SQLi (3) - Lab (0) | 2023.04.28 |
SQLi (3) (0) | 2023.04.27 |