sonotri
  • Lord of Injection: germiln
    2024년 10월 01일 16시 39분 55초에 업로드 된 글입니다.
    작성자: sonootri

    1. 문제 설명

    query : select id from prob_gremlin where id='' and pw=''
    <?php
      include "./config.php";
      login_chk();
      $db = dbconnect();
      if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
      if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
      $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
      echo "<hr>query : <strong>{$query}</strong><hr><br>";
      $result = @mysqli_fetch_array(mysqli_query($db,$query));
      if($result['id']) solve("gremlin");
      highlight_file(__FILE__);
    ?>


    2. 문제 풀이

    ?로 쿼리의 시작을 알리고 id값으로 germmmmm을 넣어봤다. 그랬더니 아래의 query 부분이 내가 입력한 문자를 그대로 출력하는 것을 볼 수 있었다. 웹 페이지가 어떻게 동작하는지 알게되었다. 쿼리를 조작할 수 있다는 것을 알아냈으니, 인젝션 공격이 가능하다.

     

    query : select id from prob_gremlin where id='' and pw='' 그리고 코드를 보니, 알맞은 id과 pw를 입력해야 flag를 얻을 수 있는 것 같았다. id는 admin인 것 같고, pw는 모르니 id 이후를 주석처리해서 우회해보자.

     

    select id from prob_gremlin where id='' and pw=''를 속이기 위해서  admin'#를 입력해봤다.  그런데 '는 %27로 바뀌었지만 #은 바뀌지 않았다. 그래서 수동으로 # -> %23으로 바꾸어주었다.

    +) #은 URL로 인코딩했을때의 값이 %23이다. #은 --처럼 뒤에 공백이 없어도 정상적으로 주석처리된다. 한 줄만 주석 처리하는 특징이 있다.

    https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=admin%27#

     

    와 클리어다. flag 값이 나오는건 아니었다.

     


    <참고 자료>

    SQL Injection 필터링 우회 방법 - 주석편 (tistory.com)

    'Dreamhack > 워게임' 카테고리의 다른 글

    webhacking.kr: old-27  (0) 2024.10.01
    Dreamhack: simple_sqli_chatgpt  (1) 2024.10.01
    Web Hacking_command-injection-1🚩  (3) 2024.09.28
    Web Hacking_simple_spqi🚩  (0) 2024.09.27
    root_me: CSRF-0  (0) 2024.09.25
    댓글