8주차
1강
SQL Injection : Data 추출
Union
: SQL 질의 결과가 화면에 출력되는 경우
Error Based
; SQL 에러가 발생하는 경우
Blind
: 위 경울 말고도 다 됨
우리가 원하는 select 문을 실행하는 것!
SQL Injection Point 찾기
DB에게 SQL 질의문을 사용하는 곳에서 할 수 있음
파라미터
문장으로는 where user_id like ‘%nor%’ and ‘1%’=’1%’ 이 된다.
where user_id like ‘% %’ and’1’ 이것이 되는지 확인
nor를 검색했을 때와
이것을 바꾸면 nor%’ and ‘1%’=’1 로 됨 ->이 것으로 검색했을 때 결과가 같다면
SQL 질의문을 삽입했다고 판단 할 수 있음
http://ctf/segfaulthub/com:7777/findSQLi_1/ 이사이트로 접속해서 SQL Injection (Point찾기) 취약점 찾기
찾았다면 주소와 어디 파라미터, 데이터 찾기
>>참 / 거짓 조건 삽입 가능
sfUser
sfUser’ and ‘1’=’1
그냥 ‘ 사용해서 하지 말고 지금 들어가는 데이터가 서버에서 어떻게 완성되어 이결과가 나오고 있구나 생각해복 페이로드 그리기
2강
option_val=title
board_result=test 안됨
select where username like ‘%sfUser%’ 나
select where test like ‘%test%’
title’ and ‘1’=’1
‘1’=’1’ and title
select where ‘1’=’1’ and title like ‘%sfUser%’ -> 참 결과
select where ‘1’=’2’ and title like ‘%sfUser%’ -> 거짓 결과
test
test%’ and ‘1%’=’1 이것을 결과가 같은지 다른지 비교해본다
------------------------------------------------------------
정리
첫 번째 사례는 쿠키(cookie)에서도 SQL Injection이 가능하다.
column이름에 SQL Injection이 될 수도 있다.
3.
option_val=username board_result=sfUser sort=title sort는 정렬이다.
wher username like ‘%sfUser%’ order by title order by title는 어떻게 할 것인가?
wher username like ‘%sfUser%’ order by sort=1 -> 나옴
wher username like ‘%sfUser%’ order by sort=2 -> 나옴
wher username like ‘%sfUser%’ order by sort=999999999999 -> 안나옴 why? -> 컬럼 개수 초과했기 때문임
order by title 에 참/ 거짓 조건을 어떻게 넣을까?
csase when
사용법
csae when (조건) then (참일 때) else (거짓일 때 ) end
ex)
csae when (1=1) then 1 else 2 end
(참이면 결과가) 1
(거짓이면 결과가) 2
order by 절에서 SQL Injection을 하려면 case when이 필요하다
문제에 적용하면
sort= case when (1=1) than username else title end
title가 참이면 username로 정렬이 돼서 test부터 나오고 title가 거짓이면 2 test부터 정렬되서 나옴
이렇게 되면 이것만 가지고 SQL Injection이 가능하다고 판단이 가능하다.
/Blind SQL Injection때 말했듯이 참과 거짓조건이 when (1=1) 이 괄호 안에 잘 활용되면 데이터를 한 글자씩 뽑아낼 수 있다.
일부로 error 유발 해야 하는 경우가 나올 수 있다.
참 거짓 결과가 구별이 안되거나, 에러를 유발해야 할 경우(에러를 발생해야 할 경우)
ex )
(select 1 union select 2)
ex )
Cookie: user=sfUser’ and (select 1 union select 2 where (1=2)) and ‘1’=’1
--------------------------------------------------------------------------------------------------
가장 많이 사용하는 것
Cookie에서도 일어날 수 있다. http 요청해더에 있는 것도 SQL Injection이 가능하다.
column(컬럼)에서도 SQL Injection 가능하다
Order by 절에서도 SQL Injection이 가능하다. (실제로는 이것이 제일 많이 SQL Injection이 가장 많이 사용됨 이어남
---------------------------------------------------------------------------------------------------
*SQL Injection 대응방법
Prepared Statement(프리페얼드 스테이츠먼트)
: SQL Injection을 미리 컴파일 한다.
우리가 서버에 select where id=‘’여기에 파라미터가 그대로 들어가게 된다음에 이것이 실행되고 난 다음에 문제가 된 것임 ex) select where id=’qwefdgg’여기에 파라미터 그러나 Prepared Statememt를 사용하면
ex) select ~~~ where id=’wdsfsd‘ (이 SQL 질의문을 준비해놓는다.)
컴파일 해둠 단, id=’‘부분은 채워지지 않고 미피 컴파일 해둔다. select ~~~~ where id=’?‘ 이렇게 함 ?로약속함
select ~~~ where id=’ewfwe’ and ‘1’1=
Prepared Statement를 사용하면 처리 속도를 빠르게 하기 위해 나왔다. 처리 속도를 위해서 Prepared Statement를 사용 안합니다. 못합니다는 변명이 안된다.
왜 배운 걸까?
1) Prepared Statement를 잘 못 사용한 경우
Prepared Statement 사용하는데 이 ?를 사용해서 미리 컴파일을 해둬야 돤다. 근데 옛날 개발자분들이 그냥 개발하는 방식 그대로 select where id=’___‘ ?문법을 사용하지 않고 Prepared Statement를 그냥 사용한 경우가 있다.
Prepared Statement를 못 사용하는 경우가 있다.
- order by 절에는 Prepared Statement를 사용 할 수 없다. order by절에는 ?를 사용하지 못 한다. where ___like에?사용못함 파라미터에 sort, ord가 있다면 무조건 확인해봐야 한다.
- table 이름, column 이름에는 사용 못한다.
2.WHite List Filering 사용하기
필터링 : 단어를 기반으로 해서 글자를 제한하는 것이다.
제한을 할 때는 화이트리스트와 블랙리스트가 있다
화이트리스트 : 특정 단어만 사용할 수 있게 하는 것이다.
블랙리스트 : 특정 단어를 못 사용하게 하는 것이다.
ex)
if(sort == ‘title’) {
} elif(sort == ‘author’)
else{
sort == ‘title’
}
저런 곳에서는 위에 화이트리스트 기반으로 저헐게 하면 막을 수 있다.
order by________
8주차 과제
1.오늘 수업 정리
2.SQL Injection 공격기법 정리(배운 것 총정리 (공격기법이 어떤 것이 있고, 대응 방법은 어떤 것이 있는지 등 찾아보면서 공부 및 정리하기)
3. 심화 문제 풀기 (SQL Injection Advanced) 4개( 할 수 있는 데 까지 풀기)
+ 휴식 과제
1.웹개발
-게시판(검색기능까지구현) 시큐어코딩까지 해보기 그냥해보기