이제 18번입니다.

앞에서는 주구장창 js만 했는데 이제 sql injection이네요. 데이터베이스로 넘어왔습니다.

https://webhacking.kr/

 

Webhacking.kr

Index Welcome Stranger! Notice(en) [2019-08-18] In the process of receiving service, some loss of data has been observed. For example, in very few accounts there may be a truncation of the last one letter of an userid. If userid contains multibyte characte

webhacking.kr

 


페이지와 소스 코드입니다.

후반부에 php 코드가 있고 거기에서 무언가를 다뤄야 하나봅니다.

 

<?php
if($_GET['no']){ //받아온 값이 있을 때
  $db = dbconnect(); //DB 연결
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack"); //SQL Injection을 약간이라도 방지하려는 시도
  $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!";
  }
}
?>

https://flash-ctf.tistory.com/43

 

[php] preg_match 함수

안녕하세요! 오늘은 php 함수중에 preg_match 함수에 대해서 설명할게요! 웹해킹 문제들을 풀다보면 php 코드에서 자주 등장하는 함수입니다! 먼저 어떻게 쓰이는지 알아보겠습니다 <예시>

flash-ctf.tistory.com

preg_match 함수에 대한 설명입니다. 여기가 제일 쉽게 설명한 것 같네요.

 

 

한번 1이라는 값을 입력해서 넣어줬더니 hi guest가 뜹니다.

이 말은 no값이 1이면 guest라는 것이죠.

select id from chall18 where id='guest' and no=$_GET[no]
select id from chall18 where id='guest' and no=1 //hi guest
select id from chall18 where id='guest' and no=0 //해당하는 값 없음

이렇게 인식하게 됩니다. 우리가 원하는 값은 admin이기 때문에 일단 0을 넣어서 해당하는 값이 없게 만들어줘야 합니다.

0 or no=2

라고 입력하면 admin 값이 나올 것 같습니다. 

라고 생각했지만 preg_match에 의해 스페이스바가 걸려서 no hack이 뜨게 됩니다.

이를 우회할 수 있는 방법을 찾아야합니다.

퍼센트인코딩 값으로 문자를 표현하면 문자인 것으로 인식하기 때문에 이 방식을 사용하면 될 것 같습니다.

공백은 %09로 할 수 있겠네요.(tab이나 공백이나...)

0%09or%09no=2

이렇게 입력해보겠습니다.

 

문제를 해결할 수 있었네요.

 

참고로 링크에 입력해야 합니다.

텍스트창에 입력하면 인코딩되어서 링크로 들어가기 때문에 이상하게 인코딩됩니다.

'Hacking-기초 > [WEB] Webhacking.kr' 카테고리의 다른 글

드디어...사이트에 댓글을...  (0) 2020.05.21
Webhacking.kr 19번 [150]  (0) 2020.05.21
Webhacking.kr 6번 [100]  (0) 2020.04.29
Webhacking.kr 26번 [100]  (0) 2020.04.29
Webhacking.kr 24번 [100]  (0) 2020.04.28

+ Recent posts