다음과 같은 창이 나와 index.phps 들어가 보았다.

   

나온 코드 php 부분만 가져왔다.

   

먼저 코드에서 eregi 함수를 통해

" ,/,\(,\),\t,\|,&,union,select,from,0x"

같은 문자열이 있으면 종료되게 하였다.

   

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

   

if($q[0]=="guest") echo ("hi guest"); 

if($q[0]=="admin"

@solve(); 

echo ("hi admin!"); 

   

코드에서는, no 받아온 것을 통해 쿼리문을 완성하여 받아온 값이 guest이면 'hi guest' 출력하고 admin이면 문제가 풀리게 되어 있다.

   

select id from challenge18_table where id='guest' and no=$_GET[no]

   

no 받아올 인젝션 시켜서 다음 id admin으로 인식되도록 만들어야 한다.

   

일단 입력 창에 여러가지 값들을 넣어 보았다.

1 넣자 hi guest 나왔다.

no 2이면 admin 것이라고 유추하고 문제를 풀어 보자.

   

만약 쿼리문이

select id from challenge18_table where id='guest' and no=123 or no=2

같이 되어 있다면 게스트 로그인에 실패하고 admin 계정으로 로그인 것이다. 하지만 여기엔 공백이 들어가 있으므로 공백 우회가 필요하다.

   

공백 우회의 방법은 여러 가지가 있다.

   

1. tab - %09

2. line feed(\n) - %0a

3. carrage return(wr) - %0d

4. 주석 - /**/

5. 괄호 - ()

6. 더하기 - +

   

공백 우회를 이용하여 값을 입력해 보자.

   

   

결과 문제가 풀린 것을 확인할 있다.

   

다른 방법으로 풀어 보자.

쿼리문을

select id from challenge18_table where id='guest' and no=1 or no=2 limit 1,1

다음과 같이 전달해 주어도 문제가 풀릴 것이다.

guest 계정이 no=1 인해 참이 되고, admin계정이 no=2 인해 참이 되어서 guest admin 결과값이 배열에 차례로 들어가게 된다.

   

이런 경우 admin 값만 선택하기 위해서 limit구문을 사용한다.

   

여기에 공백 우회를 적용하여 값을 입력해 보자.

   

   

역시 문제가 풀린 것을 있다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10

+ Recent posts