2019. 5. 6. 16:28ㆍWeb 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와 나머지 부분들에 대해서는
다음 문제에서 설명하도록 할게요!