6번째 문제인 darkelf다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("darkelf");
highlight_file(__FILE__);
?>
이번 문제에서는 or, and 연산자를 필터링하고 있다. 쿼리의 where 절에서 복합 조건을 지정하기 위해 주로 사용되는 명령어인데 이를 통째로 필터링하고 있기 때문에 사용할 수 없다. 하지만 mysql에서는 or, and 연산자를 ||, && 연산자로도 사용할 수 있기 때문에 이같은 필터링은 거의 의미가 없다. 그래서 pw 파라미터에 "' || true%23"처럼 전달해주면 될까?
admin이 아닌 guest 계정으로 인식됐다. 코드를 자세히 살펴보니 result['id']가 'admin'이어야 문제를 해결할 수 있다. 그렇다면 pw 파라미터에 "' || id='admin"처럼 id가 'admin'인 조건으로 전달해보자.
어렵지 않게 풀 수 있었다.
이번 문제는 단순히 and, or 연산자를 필터링하는 것은 &&, || 연산자로 우회할 수 있다는 것을 알려주는 문제인 것 같다. 놓치기 쉬운 점은 '&' 문자는 '#'과 마찬가지로 URL에서 처리되기 때문에 URL encoding을 통해 직접 '%26'처럼 입력해주어야 한다.
'챌린지 > los.rubiya.kr' 카테고리의 다른 글
Lord of SQLInjection - troll (0) | 2020.12.28 |
---|---|
Lord of SQLInjection - orge (0) | 2020.12.27 |
Lord of SQLInjection - wolfman (0) | 2020.12.22 |
Lord of SQLInjection - orc (0) | 2020.12.19 |
Lord of SQLInjection - goblin (0) | 2020.12.17 |