본문 바로가기
about Security/웹보안과 해킹

[웹해킹문제풀이] # webhacking.kr 워게임 18번

by saniii 2020. 10. 4.

<워게임 18번_SQL 인젝션>

 

처음에 들어가면 

 

 

이렇게 나와 있어서 일단 임의의 값으로 흔히 쓰는 1을 입력해보았다.

그랬더니 hi guest라고만 출력되고 아무말이 없다.

그래서 다른 임의의 값 9를 입력해보았다.

아무런 변화가 없다. 

 

이때 알았어야 했는데!!!

보다시피 캡처도 URL을 빼고 캡처한 걸 보면 알겠지만

URL이 중요하다고는 생각도 못했다ㅋㅋ

 

아무튼 계속 해보자.

앞서 배운 가장 기본이 되는 SQL쿼리 조작 문장인

1' or '1'='1 을 입력해보았다.

좀 배운건 뭐든 써봐야 직성이 풀리는 성격

우왕 뭔가 색다른 문장이 나온다. no hack 

 


 

뭔가를 더 알아내기 힘들다고 판단 source코드를 보러갔다. 

소스 코드를 볼수 있는 버튼은 하단에 연두색으로 있다

내가 중심적으로 볼 건 페이지 디자인이 아니므로

php문만 캡처해왔다. (단어 선택이 적절한지 모르겠음 php)

if($_GET['no']){
 $db = dbconnect();
 if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
 $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' 
                                                                        and no=$_GET[no]")); 
  // admin's no = 2
 if($result['id']=="guest") echo "hi guest";
 if($result['id']=="admin"){
   solve(18);
   echo "hi admin!";
 }
} 

 

preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'

이 문장을 통해 ' ' , '/' , '(' , ')' , '|' , '&' , 'select' , 'from' , '0x' 가 필터링 되어 

만일 입력에 이 문자가 들어가면 no hack이 출력됨을 알 수 있다. 

ex)

 

$result mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]"));

이 문장에서 입력값은 $_GET[no]의 no에 대입되는데 즉 만약 내가 2라고 대입하면 mysql에 

select id from chall18 where id='guest' and no=2

(id가 guest의 no=2가 참이면 2의 id를 불러와라) 라는 구문이 전달되는 것이다.

 

그리고 다음으로   // admin's no = 2  라고 써져 있어서 이 문제를 풀고 싶으면

mysql에 no=2가 들어가도록하면 된다는 힌트를 얻을 수 있다.

 


그럼 내가 입력창에 뭐라고 넣어야 mysql문에 no=2를 전달할 수 있을까

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

 

생각 1) 요 빨간색에 들어갈 문장이다.

 

생각 2) id가 guest로 고정되어있으므로 OR을 이용,

                  앞의 연산은 거짓이고 뒷 연산은 참이 되도록 한다.

 

생각 3) 연산자의 우선순위에 의해 AND가 OR보다 먼저 연산됨

 

생각 4) 필터링 되는 문자가 필요하면 우회해야 한다.

 

 

이렇게 고려하여 입력할 문장은

99%09or%09no=2

 

%09는 tab의 우회문자!

 

이렇게 입력하면 쿼리문에 

select id from chall18 where id='guest' and no=99 or no=2

이렇게 전달되어 

 id='guest' and no=99 이건 거짓이므로 패스

no=2는 참이므로 no=2의 id를 출력하도록 할 것이다.

 

그래서 입력했는데.......읭...?

 

아무것도 안뜬다...왜지?

왜 그런거지? 

 

무심결에 URL을 봤는데 

뭐야...나 뒤쪽에 입력할 때 저렇게 안 썼는데...?

어떡해야 하지???

의식의 흐름에 맡긴 진행

 

옛날에 다른 워게임 풀이에서 URL에 입력하는 걸  본 기억이 나서

URL에 직접 입력해보았다.

됬다!!!!!!!!!!!!!!!!!!!

 

일단 입력 구문은 맞았던걸로....

 

하지만 오늘도 나머지 공부가 남은 걸로...........

 


왜 URL에 입력해야 했을까? 

소스코드에 뭐 암호화 이런 말은 없던데

왜 바뀌어서 들어간거지..?

 

알아올거다

약속

 

아ㅏㅏㅏㅏㅏㅏㅏㅏ 너무 어려웡

 

 

 

 

댓글