본문 바로가기
워게임/LOS

[los - SQL injection] wolfman ( 5단계 )

by B T Y 2017. 9. 23.
반응형

[los - SQL injection] wolfman ( 5단계 )







[ 풀이과정 ]



wolfman은 if($result['id'] == 'admin') 조건을 만족하게 되면 solve("wolfman"); 가 실행되면서 문제가 풀린다.

여기서는 pw에 prob  _  .  (  )  스페이스바 입력을 막아두었다.


whitespace 우회인데 우회가 가능한 문자들은 미리 파악 해둬야한다.

  - whitespace 우회

    -> %0d, %09, (), /**/, %0a, %0b, %0c, ...


스페이스바 입력이 되지 않기 때문에 SQL 쿼리를 입력할때 각각을 구분 주려면 다른 방법을 이용해야 한다.

처음에 '+' 기호를 이용해서 하려고 했더니 다른 화면으로 넘어가면서  'No whitespace ~_~'라는 문장이 떳다..


SQL에서는 입력을 할때 ;으로 문장의 마지막을 알려주기 때문에 그 전까지는 엔터키를 쳐도 계속해서 입력이 된다.

그래서 이번에는 엔터키를 이용해보기로 했다.

url 주소 창에서 그냥 엔터키를 칠수는 없고 LF 문자를 이용해서 엔터키의 역할을 했다.

그래서 LF의 헥사값인 %0A( 엔터키의 값은 0x0D0A )를 이용하고 참/거짓 식을 만들어보니 

우선 Hello guest라고 뜨는걸 확인하고 이러한 방식이 통한다는게 증명이 됬다.




이번엔 length() 함수를 이용해서 pw의 길이를 알아내려고 

select id from prob_wolfman where id='guest' and pw='' or length(pw)=22 #' 와 같이 쿼리를 추가시켜 알아냈고

비밀번호의 길이는 22였다.


그리고 문제가 풀렸다...?


코드를 다시한번 살펴보면서 생각을 정리해보니 

select id from prob_wolfman where id='guest' and pw='' or length(pw)=22 #'가 실행되면서

결국 select id from prob_wolfman where false or length(pw)=22와 같은 문장이 실행 되므로

뒤에 있는 where의 결과는 참이 되어서 select id from prob_wolfman 쿼리가 실행되는데

비밀번호를 입력하지않았는데도 바로 문제가 풀린걸 보니 해당 테이블안에 admin에 대한 

정보가 제일 첫행에 출력이 되어 mysql_fetch_array()가 한번만 실행이 됬는데도 문제가 풀린 이유로 판단된다..





5단계 클리어~~~~~~~



반응형

댓글