![見出し画像](https://assets.st-note.com/production/uploads/images/98561035/rectangle_large_type_2_0aabb3a40a4bca87f3523f0cc6dbc20a.png?width=1200)
ハッキングについて
「ハッキングはどうやるのか?」と疑問に思ったことはないだろうか。
そこで今回は少しハッキング(クラッキング)について触れていきます。
まず、映画などで出てくるハッキングと現実のハッキングは結構違います。
よく映画などでは、数学が得意な人物がハッカーに選ばれています。ですが、現実ではこのようなステレオタイプなハッカーはあまり見かけません。
どちらかというと、何かを悪用するのが得意な人物がハッカーへの適正があるように感じます。
今まで観た映画やドラマの中で、特に現実のハッキングに近いと思ったのは「Mr.Robot」です。かなり現実的でストーリーも面白いです。
他の映画と違って実在しているOSを使っています。「Mr.Robot」では「Kali Linux」と呼ばれるLinuxを使っています。実際のペネトレーションテスト(侵入テスト)でも使われることで有名です。
ハッキングを行うのにLinux、Windows、MacだろうとどのOSでも可能です。
ですが、多くのツールがLinux用に作られていることが多いのでLinuxを使う方が多いと思います。
自分で全てのツールを自作して行うなら関係ない話ですが、既存の優れたツールを使う方が実際のハッキングでは多いです。
実際は自作ツールと既存のツールを併用する感じです。
「ハッカーとしての稼ぎ方」でも紹介した、ミリオンダラーハッカー達も既存のツールを使います。
ハッキングはプログラミングが得意じゃないと出来ないみたいなイメージがありますが、得意じゃなくても可能です。
ツールを自動化したり、脆弱性を見つけて検証したりする時には、ブログラミングを使います。その時にちょっとしたスクリプトやエクスプロイトを書いたりするぐらいです。
高度なマルウェアを作成するハッカーはゴリゴリにコードを書きますが笑
ただ、プログラミングが分かるとシステム開発者がミスをするコードをイメージすることが出来るので、脆弱性がある場所を特定しやすくなります。
また、攻撃を行う時は、ソースコードが見えないブラックボックスなシステムに行うことが多いため、どこに脆弱性があるかをイメージすることが、結構重要な鍵になります。
プログラミングが出来ると他にも出来る幅が増えます。自分のツールをチューニングして脆弱性を上手く検知したりなどです。
つよつよエンジニア程、プログラミングは必要ではないと思いますが、出来た方が有利だと個人的には思います。
この記事でのハッキングの対象は、WebアプリケーションやWebサイトなどです。個人のPCやスマホをハッキングすることではありません。
Webアプリケーションをハッキングする方法と個人をハッキングする方法は少し違います。個人にハッキングを仕掛ける方法はいろいろ考えられますが、被害者のメールに悪意のある添付ファイルを送りつけてPCやスマホを乗っ取るような人の脆弱性を突く攻撃が多いです。
Webアプリケーションをハッキングする方法は、システムの脆弱性を突く攻撃が多いです。
どちらも似ている部分が多いので、上記の両方の攻撃を試みる感じになります。
実際のハッキングについて
よくニュースとかに出てくる「データベースからデータ漏洩が発生しました。」というような記事がありますが、これはシステムの脆弱性を突かれることで起こります。
この脆弱性を突く攻撃をSQLインジェクションといいます。
SQLインジェクションとは、攻撃者が不正なSQLクエリを注入することで、データベースに対する不正なアクセスや悪意のある操作を行うことが出来る脆弱性です。
普段見かけるログイン画面にSQLインジェクションの脆弱性があると資格情報を知らなくてもログインが出来たり、データベースにある情報を取得することが出来ます。
例えば管理者のアカウントに侵入しようと考えた場合は下記のように入力すると、ログイン出来てしまう場合があります。
![](https://assets.st-note.com/img/1676961755642-CBh5Vg6wxo.png)
実際はこんなに単純にはいかないですし、脆弱性があればの話です。
「これがハッキング?」と感じた方もいると思います。実際のハッキングは映画などのように派手さはなく地味です笑
何故このようなことが可能になるのかと言うと、脆弱なログインフォームは、以下のようなSQLクエリを使ってユーザーを認証することがあります。
SELECT * FROM users WHERE username = '入力されたメールアドレス' AND password = '入力されたパスワード';
攻撃者が先程の攻撃コードを注入した場合は下記のようになります。
SELECT * FROM users WHERE username = 'admin@example.com'-- ' AND password = '入力されたパスワード';
SQLクエリは下記のように解釈されます。
SELECT * FROM users WHERE username = 'admin@example.com'
このようになり、usernameにadmin@example.comが存在していた場合は、パスワードを知らなくてもログインが出来るようになります。
--はSQLにおいてコメントを表す記号なため、下記の部分はコメントとして無視されます。
-- ' AND password = '入力されたパスワード';
SQLインジェクションに対する対策は、ユーザー入力を適切にエスケープするか、プリペアドステートメントやパラメータ化されたクエリを使用するなどして対策してください。
例えば、PHPなどを使用している場合のプリペアドステートメントを使った対策は以下になります。プリペアドステートメントとはSQLクエリをあらかじめ準備しておき、後から実際のデータを埋め込んで実行する仕組みです。
// 入力されたメールアドレスとパスワード
$input_username = $_POST['入力されたメールアドレス'];
$input_password = $_POST['入力されたパスワード'];
// プリペアードステートメントの作成
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
// パラメータをバインド //ssは文字列
$stmt->bind_param("ss", $input_username, $input_password);
// ステートメントを実行
$stmt->execute();
SQLクエリの?をプレースホルダーと呼び、そこに値がバインド(紐付け)される前に、データベースエンジンによって適切なエスケープや処理が行われます。バインドされる値がSQLクエリの一部として直接挿入されないため、悪意のあるコードが無効化されます。
たとえ$input_usernameにadmin@example.com'-- が入っていても、ただの文字列として扱われるため、SQLインジェクションが発生することはありません。SQLクエリが以下のようになります。
SELECT * FROM users WHERE username = 'admin@example.com\'-- ' AND password = '入力されたパスワード';
\'のようにシングルクォートを適切にエスケープしてくれます。この場合は、admin@example.com'--を文字列と見なすためユーザー名として admin@example.com'--が検索されます。admin@example.com'--のようなユーザー名がデータベースに存在していない場合は、ログイン出来ないため攻撃を無効化できます。
このように行うことで対策を行えますが、これは使用している言語や環境によります。
免責事項
この記事でとりあげた手法を許可なく外部のサイトで行うことは違法です。不正アクセスになるので行わないようにしてください。
以上で終わりです。