LJ

Lord of SQLinjection ( 9번 ) vampire 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 9번 ) vampire

짱준재 2024. 5. 23. 11:00

 

 

 

vampire 문제이다 

 

이 문제도 코드만 보면 너무 쉽게 풀 수 있다.

 

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  $_GET[id] = strtolower($_GET[id]);
  //$_GET['id'] 값을 소문자로 변환
  $_GET[id] = str_replace("admin","",$_GET[id]); 
  //$_GET['id'] 값에서 "admin" 문자열을 제거
  $query = "select id from prob_vampire where id='{$_GET[id]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("vampire"); 
  highlight_file(__FILE__); 
?>

 

 

위의 주석처리 한 부분을 봤을 때  소문자로 변환 후 admin을 한번 제거 하는 것을 알 수 있는데

 

간단하게 생각해서

 

admin 사이에 admin을 넣어주면 사이에 들어간 admin이 사라지면서 

 

문제가 해결된다.

 

 

안전한 코드 예시이다.

 

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();

  if (!isset($_GET['id'])) {
      exit("Invalid input");
  }

  $id = $_GET['id'];

  if (preg_match('/\'/i', $id)) {
      exit("No Hack ~_~");
  }

  $id = strtolower($id);
  $id = str_replace("admin", "", $id);

  // Prepare statement to prevent SQL injection
  $stmt = $db->prepare("SELECT id FROM prob_vampire WHERE id = ?");
  if ($stmt === false) {
      die("Prepare failed: " . $db->error);
  }
  //prepare 메서드가 실패한 경우, 오류 메시지를 출력하고 종료

  $stmt->bind_param("s", $id);
  $stmt->execute();
  //SQL 쿼리가 데이터베이스에서 실행되어 결과가 생성
  $result = $stmt->get_result()->fetch_assoc();
  
  if ($result && $result['id'] == 'admin') {
      solve("vampire");
  }

  highlight_file(__FILE__);
?>

 

 

 

 

'IT 보안 > 보안첼린지' 카테고리의 다른 글

Lord of SQLinjection ( 12번 ) darkknight  (1) 2024.06.06
Lord of SQLinjection ( 11번 ) golem  (0) 2024.05.28
Lord of SQLinjection ( 8번 ) troll  (0) 2024.05.23
XSS game level 6  (0) 2024.05.20
XSS game level 5  (0) 2024.05.20
Comments