SQL Injection
목적
DB에서 데이터 추출
Main Point
1. SQL Injection Point 찾기
- 현재 어떤 SQL문을 사용하는가 생각!!
- 생각을 열고 DB에게 SQL 질의문을 사용하는 곳 -> 출력되는 곳이 단순 출력인지 DB에서 나오는 화면인지 파악
- 로그인 or 입력 가능한 곳 or SQL 구문에 연결된 사용자 입력만 되는 것이 아니다!! ->
sort 이나 where (컬럼) 자리도 사용가능
- SQL문이 입력되는지 TEST
and 1=1을 사용
2. Burp Suite 사용
- 단순 화면보단 주고 받는 데이터에 집중
- 입력창 뿐만 아니라 Burp Suite안에 파라미터(data) 및 헤더 확인
3. SQL문 입력되는 TEST
- SQL Injection Point를 찾는 것
- SQL문이 입력되는지 TEST
and 1=1을 사용
- 복붙보다는 생각하고 순서지키기
- 주석금지
종류 & 조건
- Union SQLInjection
+) 조건
-- sql 쿼리문의 결과가 화면에 출력되는 경우 사용할 수 있다.
-- 필수조건은 컬럼 갯수를 파악하는 것이 필수적이다.
+) 방법
-- union select를 활용
+) 예시
--결과가 도출되는 대표적인 예는 게시판이다. 특히 검색창
- Errorbased SQLInjection
+) 조건
-- Error 메시지가 화면에 출력되야 함
-- 로직에러or sql에러여야함 ->서버에러x, 문법에러x
+) 방법
-- error메시지를 출력할 수 있는 함수사용 ex)extractvalue
+) 예시
-- 로그인 페이지 및 게시판 error메시지가 출력되는 곳
- Blind Sql injection
+) 조건
-- SQLInjection 가능한 모든 곳
+) 방법
-- 참거짓 응답차이로 알아냄
+) 예시
-- 게시판 정렬과 아이디 중복체크화면이 있다.
-- where '컬럼'= '데이터' 이곳에 컬럼자리에 '1'='1'and 컬럼으로 사용가능
추가
1. SQLInject - cookie에도 가능(htttp 요청헤더)
- Cookie: user=sfuser PHPSESSID=....
-> Cookie: user=sfuser' and '1' = '1 PHPSESSID=....
2. Column이름에서도 가능
- where (column 이름) like '%%'(데이터)
-> column이름 자리에 넣어야할때
-> 1 = 1 and 'column이름 대입 -> like때문에 컬럼이름이 마지막에 있어야함
-> where (1 = 1 and 'column이름) like '(데이터)'
-> Blind SQLi 가능
3. case when 사용
- ex) where (column이름) like (데이터) order by ___
- sql문에서 order by 뒷자리 같은 데이터나 column이름 모를 때 사용가능
- case when (조건) then (True일때 값) else (False일때 값) end
- 조건을 바꿔가여 Blind SQLI 가능
- Fasle 일때 값에 True일때랑 차이를 두기위해 무조건 false나오는 값을 입력 ex) select 1 union select 2
4. select 1 union select 2
- 예시 -> case when (조건) then (True일때 값) else (False일때 값) end
- 행이 1개만 와야 하는 order by 뒤에 행이 2개오면서 에러 도출
- select 1 union select 2 where 1 = 2 데이터 도출
-> where 뒤에가 거짓이 됨으로 union select 부분부터 삭제됨
-> 행이 1개 도출 -> select 1 == 1이라서 데이터 도출
- select 1 union select 2 where 1 = 1 DBerror나옴
-> where 뒤가 참이기 때문에 union select가 적용되어
-> 행이 2개옴 error발생
SQLInjection 방지법
1. Prepare Statement
- 미리 컴파일 한다는 뜻
- 원래는 값을 받고 컴파일 하지만 미리 컴파일해서 구조변화가 불가능
- 구조변화가 안되어 SQL문이 안바뀜 -> SQLi 실패
2.White List Filltering
if(sort == 'title'){
~~~~
}
elif(sort == 'content'){
~~~~
-- Normaltic Study 8주차 --