본문 바로가기
Study/web

sql injection에 대한 정리

by Melpin 2015. 12. 7.

los를 풀면서 sql injection 에 대해서 간단히 정리해보았다.


sql injection은 데이터베이스에서 정보를 가져올때 사용자의 입력을 포함해서 쿼리를 보내기때문에 

이로인해서 개발자가 원하지않는 방식으로 정보를 가져오는것을 말한다.


sql에서 어떤 데이터를 불러오기 위해서는 select 문을 사용하게된다.

기본적인 인 모형은 다음과 같다



입력한 아이디에 맞는 비밀번호를 입력했을 때 해당 계정에 일치하는 정보를 보여주게 된다.


이때 id와 pw는 각각 사용자들마다 입력이 다를것으로 입력의 여지를 남겨두었을때 문제가 발생하게 된다.


만약 id에 guest'# " 을 입력하게 된다면


다음과 같은상황이 일어난다.


select * from tablea where id='guest'#' and pw'';

주석


select * from tablea where id='guest';


과 같이 변조되어 비밀번호를 몰라도 guest에 로그인할 수 있게된다.




이러한 방식으로 본래 쿼리문을 임의로 일그러뜨려서 다른 방식으로 데이터베이스의 정보를 가져오게되는것이다.


특정 입력에서 싱글쿼터가 들어가게 된다면 해당 문자열이 닫히게되고 그때부턴 명령어로 인식하게 된다.


위의 쿼리문도 싱글쿼터가 입력되었기때문에 #이 id의 일부로 들어가지않고 sql의 기능으로 주석으로 인식되었기 때문에 뒤의 패스워드에 대해서는 묻지 않았다.


위와 같은 간단한 경우에는 주석만을 이용해서도 인증을 우회하고 정보를 얻어올 수 있었지만


필터링을 거치게될 경우 다양한 방법을 통해서 최종적으로 원하는 정보를 가져와야 한다.


논리연산을 이용해서 원하는 정보를 가져올 수 있게된다.

and 혹은 && 을 입력하여서 두가지 조건에 모두 일치하는 식을 가져오거나

혹은 and 0을 하여서 앞에있는 조건을 제거하는 식으로도 사용할 수 있다.


or 이나 || 을 입력하면 둘중 하나만 참이면 정보를 가져오도록 할 수 있는대

앞의 식이 거짓일때 강제로 or 1 연산을 통해 참으로 만들고 정보를 가져올 수 있게된다.


주석에도 다양한 종류가 있다.


--+

;%00

#


(일단은 los에서 사용한 주석들.)

등을 이용해서 이 뒤의 입력을 모두 주석처리해서 무시할 수 있다.


어떤 계정에 대한 비밀번호 정보를 확인할 경우, 바로 모든 비밀번호 자리수에 대해서는 볼 수 없으므로 if 문을 이용해 참거짓판단으로 한글자씩 확인하게 된다.


db에 들어있는 암호의 컬럼이름이 pw 라면 다음과 같은 방식으로 암호의 길이를 확인할 수 있다.

select * from tablea where id='admin' and if(length(pw)=12,1,1)# pw=''





위와 같이 참 거짓에 대해서 나오는 변동사항을 확인 하면 이를 통해서 비밀번호를 차근차근알 수 있게된다.


첫번째글자가 무엇인지 확인하려면 문자열 관련 함수중 substr 을 통해서 한글자씩 잘라낼 수 있다.




substr 함수가 필터링 되었을경우 substring, mid, left right를 이용해서도 글자를 한글자씩 뽑아낼 수 있다.

substring 과 mid 는 substr과 사용법이 똑같다

right(left(pw,1),1)를 이용한다면 substr을 이용한것처럼 똑같이 한글자씩 뽑아낼 수 있다.


문자열을 입력할 때 싱글쿼터(') 가 필터링되어있다면

char([아스키값])

unhex([아스키값])

0x([아스키값])

을 통해서 글자를 입력할수도 있다.



'Study > web' 카테고리의 다른 글

Tistory 단축키 추가방법  (0) 2020.11.11
los sql injection script  (0) 2015.12.07

댓글