김승현

[part 5]누구나 쉽게 따라 하며 배우는 웹 해킹 첫걸음 - 공격기술1 : 데이터베이스를 공격하는 sql injection 본문

book_summary/web

[part 5]누구나 쉽게 따라 하며 배우는 웹 해킹 첫걸음 - 공격기술1 : 데이터베이스를 공격하는 sql injection

kshind 2023. 4. 30. 14:15

sql injection이란? 해석하게 되면 sql 삽입이며 sql에 악의적인 쿼리를 삽입하여 실행하게 만드는 것.

이때 악의적인 쿼리를 payload라고 함

데이터베이스를 대상으로 하는 공격이기 때문에 정보에 대한 조회, 수정, 삭제를 할 수 있기 때문에 크리티컬함

 

sqli가 가능한 이유: 아이디 또는 비밀번호를 ''(작은 따옴표)를 기준으로 범위를 지정해서 문자열을 받는 방식인데,

아이디에 admin' or 1=1 --과 같은 방식으로 싱글쿼터를 사용해서 강제적으로 범위를 닫아서 질의문의 내용을 바꿈

여기서 --는 sql에서 주석을 의미함.

-> 따라서 1=1 뒷 부분은 모두 주석처리가 되기 때문에 admin이라는 아이디를 가진 계정에 접근하게 됨

 

우리가 접속해야 할 아이디가 admin인 것을 아는 것이 당연하진 않음.

-> 이렇게 접근해야할 대상을 모를 경우 사용할 수 있는 방법이 blind sqli이다.

 

a' or length(pw) < 10 -- : a라는 id의 pw의 길이를 알 수 있는 paylaod (length는 길이를 반환함)

-> 만약 pw가 10 미만이라면 참이기 때문에 정상적으로 로그인이 되고 이상이면 login failed!가 출력됨

 

a' or substring(pw,1,1)='a' and id = 'admin'-- : admin id의 pw의 첫 자리가 a인지 확인하는 쿼리문

-> admin이라는 id에서 pw의 첫 자리가 a인지 확인하는 payload 

 

sqli 우회방법

1. 특수문자 필터링

- addslashes, +++ mysql_real_escape_string()이라는 함수도 있음(특수문자들 앞에 \를 붙임)

더보기

두 가지의 차이점

1. 범위

- addslashes의 경우 ', ", \만 필터링하지만 mysql_real_escape_string함수의 경우 null문자나 0x00문자도 필터링함

2. 인코딩

addslashes의 경우 인코딩을 진행하지 않고 처리를 하기 때문에 인코딩된 문자열의 경우 제대로 처리되지 않을 수 있음

 

2. prepared statement

- 사용할 쿼리를 미리 준비해두고 필요한 부분만 받는 방식 

사용자로부터 입력받은 데이터의 형식을 정확하게 파악하고 의도로부터 벗어나는 것을 방지함

 

3. orm사용