[LOS] cobolt

Yennytime·2023년 1월 12일
0

Lord of SQL Injection

목록 보기
2/20
post-thumbnail

<?php
  include "./config.php"; 
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 
  highlight_file(__FILE__); 
?>

🔺 코드분석

  1. if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
    if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
    GET방식으로 id,pw를 받으며, id와 pw에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.

  2. $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
    id와 pw 둘 중 하나를 참으로 만들어주면 해당 쿼리문을 우회 가능
    pw가 md5로 되어있기 때문에 id를 참으로 만들어주면 된다.

  3. if($result['id'] == 'admin') solve("cobolt");
    id 가 admin 인 경우, 성공적으로 출력

  4. elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
    그렇지 않으면, Hello, '입력한 id' You are not admin라고 출력 됨


🔺 풀이 과정

  1. id=admin&pw-1234

일단 쿼리가 어떻게 처리되는지 확인해보았다.
id를 참으로 만들어주어야 한다.

  1. id=admin'-- -

SQL에서 더블대시 --주석 처리를 한다.
-- -를 사용하여 -- 뒤에 바로 주석을 처리할 수 있게 -를 붙히면 바로 공백 처리할 수 있다.

쉽게 이해하기 위해 아래의 그림을 확인해보자.

또는 -- !, -- +-- 뒤에 아무거나 붙히면 --뒤에 문자열이 주석이 되버린다.

  1. id=admin' or '1'='1&pw=(아무거나)

admin 또는 1 = 1 을 만들어주고 pw에는 hello를 입력했더니 문제가 풀린 것을 알 수 있다!

profile
It's Yennytime💙

0개의 댓글