[webhacking.kr]old-18 write up

zzsla·2023년 6월 13일
0
post-custom-banner

문제 정보

없다.

문제

문제에 들어가면 "SQL INJECTION"이라고 적혀 있고, 아래 입력창과 소스코드를 볼 수 있는 링크가 주어진다.

소스코드는 이렇게 되어 있다.

분석

php 부분만 따로 보면 get으로 no가 요청된 값이 있을 때 dbconnect가 이루어진다.

if($_GET['no']){
  $db = dbconnect();

그리고 get으로 요청된 no값에 , /, (, ), |, &, select, from, 0x가 들어갈 경우 "no hack"이라고 나온 뒤에 프로그램이 죽는다. 즉 이 부분이 필터링부분이다.

  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");

sql문을 보면 id를 찾는데 chall18이라는 테이블에 있고, idguest이고, noget으로 요청된 값이다.
그리고 주석으로 adminno2라고 한다.

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

만약 찾은 id가 guest이면 hi guest를 출력하고, 찾은 idadmin이면 문제가 풀리고, hi admin!을 출력한다.

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";

취약점

filter bypass를 잘 이용해서 sql injection을 사용하면 된다.
idguest로 고정되어 있기 때문에 or를 이용해야 할 거 같다.

익스플로잇

guestno을 넣어서 false으로 만들어야 되기 때문에 숫자를 하나씩 넣어보면 guestno1인 것을 알 수 있다.

필터링 중에 스페이스( )도 필터링이 되어 있기 때문에 스페이스( ) 대신에 %09를 사용한다. %09은 tab의 아스키코드값인데 sql에서는 스페이스로 인식을 한다.
이것을 가지고 익스플로잇을 짠 뒤에 url에 뒤에 넣으면 문제가 풀린다.
?no=0%09or%09no=2

profile
[README]newbi security hacker :p
post-custom-banner

0개의 댓글