War_Game

Lord of Injection: germiln

Sono Hacking Study 2024. 10. 1. 16:39

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)

'War_Game' 카테고리의 다른 글

Dreamhack: simple_sqli_chatgpt  (1) 2024.10.01
root_me: CSRF-0  (0) 2024.09.25