본문 바로가기
computer/web hacking

[LOS] prob_gremlin

by Paranyo 2018. 4. 27.

Lord of SQLI

시작 2018-04-27 ~


간단해보인다.

첫글이니 이것저것 설명해보자면





 2. config파일을 가져온다. 
 3. 로그인 상태를 체크하는 것 같다. 아마 쿠키 값 유무를 체크하는 것 같다. 
 4. 데이터베이스에 연결한다. 
 5~6. prob, PROB, _(언더바), ()(소괄호), .(컴마)를 필터링 하는 것 같다. 디비 공격에 쓰이나 싶다. 
 7. 쿼리다. 디비에 전송할 쿼리. 여덟번째 라인은 내가 입력한 쿼리를 보여준다. 
 8. 내 쿼리를 그냥 echo로 띄워준다.
 9. 보낸 쿼리의 DB에서의 응답 값이다.
 10. 문제다.  비교를 한다. 
 11. highlight_file 이거는 아마 소스코드를 보여주는 것.


자 그러면 문제를 풀어보자. 정답은 DB에서 id값을 반환하면 되는 것이다. 


select id from prob_gremlin where id='' and pw='' 


이 부분을 어떻게 하면 id를 반환할 수 있을까. 생각해보면 무지 간단하다.


select id from prob_gremlin where 1 


이렇게 만들어면 된다! where 1은 TRUE에 해당하고 모든 id 값을 반환한다.

당연한 소리지만 아래의 문장은 안된다.

query : select id from prob_gremlin where id='1' and pw='1'


id가 '1'이고 pw가 '1'인 id는 디비에 없기 때문이다.

query : select id from prob_gremlin where id='' or 1=1' and pw=''


이렇게 해주면 어떻게 될까?

query : select id from prob_gremlin where id='' or 1=1' and pw=''


빨간색 부분에 해당하는 값은 or 연산을 통해 TRUE가 된다. 그러면 where 1을 만족해준다.

하지만 뒤의 ' and pw='' 문장을 없애주거나 저것도 TRUE 값을 만들어 주어야 한다.

다른 방법도 있겠지만 가장 간단히 주석 처리를 통해 해결할 수 있겠다.


query : select id from prob_gremlin where id='' or 1=1#' and pw=''


이렇게 하면 문제가 해결된다.
파라미터에 전달할 때는 #이 아닌 #의 URL ENCODE 값인 %23을 넣어야 한다. 



'computer > web hacking' 카테고리의 다른 글

[LOS] prob_darkelf  (0) 2018.04.28
[LOS] prob_wolfman  (0) 2018.04.28
[LOS] prob_orc  (0) 2018.04.28
[LOS] prob_goblin  (0) 2018.04.27
[LOS] prob_cobolt  (0) 2018.04.27