[LOS] Gremlin writeup

2019. 5. 6. 16:28Web Hacking/Los.rubiya.kr

안녕하세요!

오늘은 

Lord of sqlinjection(LOS)


첫 번째 문제인

gremlin을 풀어보도록 하겠습니다!


일반적으로 

초반 문제들은 

쉬운 문제들이나,


쉬운 문제들의 

write-up을 보는 

사람들의 실력을 고려하였을 때


그들의 수준에서

최대한 이해 가기 쉽도록

상세하게 설명하도록 하겠습니다!


문제를 들어가 보시면 위에 query라고

적혀있습니다!

이  query를 조작해서 저희가 문제를 푸는 겁니다!


근데 쿼리를 이해 못하시는 분들이 계실까봐

제가 mysql에서

이 문제와 똑같은 prob_gremlin이라는 

table을 만들었습니다

(환경을 비슷하게 구축했습니다)


현재 두 명이 가입해 있습니다!

admin과 guest!


그리고

이해를 돕기 위해서!

쿼리를 살짝 바꿨습니다


select (id) from (prob_gremlin) where (id='admin' and pw='admin')

=

select (필드) from (테이블 이름) where (이러한 조건을 만족하는)


한마디로 

" 야! prob_gremlin이라는 테이블에 가서 id가 admin이고 비밀번호도 admin인 조건 만족하는 id 있나 찾아봐"


있으면 id를 가져오고 

없으면 못 가져오겠죠?


(1) 위에 쿼리와 완전 똑같죠?

그랬더니 바로 id만 가져오죠?

(일치하는 게 있으니까)


select id 라고해서 id 만 가져오는 거에요! 


만약에 다른 필드를 가져오라고 하면

그것만 가져와요!


(1) id랑 pw만 가져와라

(2) id,pw,sex를 가져와라

(3) no,sex를 가져와라



물론 조건이 틀리면

아무것도 안 가져오겠죠 ㅎ


자 그러면 다시 query를 볼까요?


id를 가져와라 prob_gremlin table에서!

어떤 id냐면

id='' and pw=''인 조건을 만족하는 놈!


그럼 저희가 과연 id와 pw 값을 

모두 정확하게 알아야만 가능할까요?


A: 아니죠


아래와 같이 쿼리를 바꿀 수 있죠

id='admin'인 조건을 만족하는

id를 가져와


"어 뒤에 있는 and pw='' 는요? "

뒤에 있는 놈들은 다 주석처리 했습니다

(=쿼리와 상관없는 아싸 취급을 해버렸다)


mysql에서는 주석 처리할 때 쓰이는

몇 가지의 기호들이 있습니다


대표적으로 #과 --+입니다!

물론 구글에 검색해 보시면 이 보다 많이 있습니다 

%00;도 있고 /* */등도 있습니다


결국 조건을

id='admin' and password ='???????'에서

id='admin' 으로 바꾼거죠!


그러면 저희가 비밀번호를 몰라도 문제가 풀리는 것이죠!


물론 아예 id와 pw 값과 전혀 다른 값을 입력하고도

풀 수 있습니다!


저희가 id의 값에서 나와서 

( ' 없이 그냥 적으면 id= 'or 1<2 --+' id안에 무조건 갇힘)

( ' 가 있고 값을 적으면 id ='' or 1<2 --+ 이렇게 됩니다! )


무조건 참인 값을 조건에 넣으면 

모든 값들을 다 불러 옵니다(데이터베이스의 특징)


그래서

 

(1) id=''(거짓이죠 이런 아이디를 가진 놈이 어디있어요 admin,guest밖에 없는데)

or

(2) 1<2 참(당연히 1<2이니 참이죠!)


(1) or (2)이기 때문에 둘 중에 하나만 참이여도

( (1) and (2) 가 아니니까)

문제가 풀리게 되는거죠!

preg_match와 나머지 부분들에 대해서는

다음 문제에서 설명하도록 할게요!