간단한 SQL Injection 문제다.
source)
<?php
ini_set('display_errors', 'on');
ini_set('error_reporting', E_ALL);
function sanitize($id, $table) {
/* Rock-solid: https://secure.php.net/manual/en/function.is-numeric.php */
if (! is_numeric ($id) or $id < 2) {
exit("The id must be numeric, and superior to one.");
}
/* Rock-solid too! */
$special1 = ["!", "\"", "#", "$", "%", "&", "'", "*", "+", "-"];
$special2 = [".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]"];
$special3 = ["^", "_", "`", "{", "|", "}"];
$sql = ["union", "0", "join", "as"];
$blacklist = array_merge ($special1, $special2, $special3, $sql);
foreach ($blacklist as $value) {
if (stripos($table, $value) !== false)
exit("Presence of '" . $value . "' detected: abort, abort, abort!\n");
}
}
if (isset ($_POST['submit']) && isset ($_POST['user_id']) && isset ($_POST['table'])) {
$id = $_POST['user_id'];
$table = $_POST['table'];
sanitize($id, $table);
$pdo = new SQLite3('database.db', SQLITE3_OPEN_READONLY);
$query = 'SELECT id,username FROM ' . $table . ' WHERE id = ' . $id;
//$query = 'SELECT id,username,enemy FROM ' . $table . ' WHERE id = ' . $id;
$getUsers = $pdo->query($query);
$users = $getUsers->fetchArray(SQLITE3_ASSOC);
$userDetails = false;
if ($users) {
$userDetails = $users;
$userDetails['table'] = htmlentities($table);
}
}
?>
코드를 보면 user_id값과 table에 값을 넣을 수 있는데 user_id는 정규식으로 숫자밖에 못쓰게 해놔서 써먹을 수가 없다. 그럼 table벡터에서 쿼리를 뽑아내야하는데 주석이랑 union,join을 쓸수가 없어서 뒤에있는 where절을 어떻게 처리할 수가 없다. 즉 테이블자체를 내가원하는 데이터값이 담긴놈으로 만들어놓아야 된단 거다. 여기서 이를 가능하게 하려면 결국 전체쿼리에서 select로 값을 가져오는 컬럼이 id,username이다. 그럼 내가 세팅해논 테이블의 컬럼을 이놈들로 맞춰주기만 하면 된다. as를 필터링하고 있지만 as가 없어서 alias가 가능하니 크게 상관은 없었다.
id가 2이상의 숫자밖에 안되니 id부분에는 3이라는 값을 맞춰주고 username부분에 플래그가 담긴 값을 뽑아냈다. 플래그값은 친절하게 enemy라는 컬럼에 있다고 밑에 주석으로 나타내고있어서 따로 테이블, 컬럼 찾을거 없이 바로 뽑았다.
'Wargame > websec.fr' 카테고리의 다른 글
Websec.fr babysteps level 25 (0) | 2018.12.12 |
---|---|
Websec.kr easy level 15 (0) | 2018.03.08 |
Websec.fr easy level10 (0) | 2018.03.08 |
Websec.fr easy level 08 (0) | 2018.03.08 |
Websec.fr easy level 02 (0) | 2018.03.08 |