脆弱性を逆手に取れ!PayloadsAllTheThings で学ぶセキュアコーディングの極意
swisskyrepo/PayloadsAllTheThings
お前、「PayloadsAllTheThings」っていう代物を見たことがあるか? これはただのコードの集まりじゃねえ。俺たちの界隈じゃ、「デジタルな武器庫」であり、同時に「最高級の攻略本」だ。
ソフトウェアエンジニアとして、こいつをどう使いこなし、ファミリー(開発チーム)を守るべきか。俺が直々に教えてやる。
一言で言えば、Webアプリケーションの弱点を突くための「あらゆる手法とコード」が詰め込まれた宝物庫だ。
開発者が「まさかこんな入力はしないだろう」と高を括っている隙間を縫って、システムを支配下に置く。そのための呪文(ペイロード)が、脆弱性の種類ごとに整理されている。
XSS(クロスサイトスクリプティング)
SQLインジェクション
SSRF(サーバーサイドリクエストフォージェリ)
ファイルアップロードの制限回避
これらが体系的にまとまっているんだ。
「俺はハッカーじゃない、作る側だ」だと? 甘いな。 敵の狙いを知らねえ奴に、本当の守りは固められねえ。
堅牢なコードのデバッグ
自分が書いたバリデーションが、本物の「悪意」に耐えられるかテストできる。
CTFやペンテストの学習
セキュリティの感覚を研ぎ澄ませ、コードの「匂い」に敏感になれる。
セキュリティ対策の自動化
CI/CDパイプラインに、ここのペイロードを流し込んで自動検査する仕組みを作れる。
導入もクソもねえ。これはライブラリじゃなく、「知識の集積体」だ。Gitで手元に置いておくのが、この街の作法だ。
# 武器庫を丸ごとクローンする
git clone https://github.com/swisskyrepo/PayloadsAllTheThings.git
あとは、各ディレクトリにある README.md を読み耽るんだ。そこには宝の地図が書いてある。
例えば、お前が「ユーザーがプロフィール画像を選べる機能」を作ったとする。
お前は「拡張子が .jpg かどうか」だけをチェックして安心している。だが、俺たちならこう攻める。
PayloadsAllTheThings の File Upload セクションを見れば、こんな手法が載っている。
ダブル拡張子
image.jpg.php
ヌルバイトインジェクション
image.php%00.jpg
マジックバイトの偽装
ファイルの中身の先頭だけ画像に見せかける
【お前が書くべき防御コードのイメージ】
# 悪い例: 拡張子だけで判断する(素人の仕事だ)
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ['jpg', 'png']
# 良い例: 中身を検証し、名前をランダム化する(ファミリーのやり方だ)
import magic # ファイル形式を判別するライブラリ
import uuid
def save_secure_image(file_stream):
# 1. ファイルの中身(バイナリ)から本当の型を判定する
file_type = magic.from_buffer(file_stream.read(1024), mime=True)
if file_type not in ['image/jpeg', 'image/png']:
raise Exception("ふざけるな。これは画像じゃねえ。")
# 2. ユーザーが付けた名前は信用せず、UUIDでリネームする
filename = f"{uuid.uuid4()}.jpg"
# 3. 実行権限のないディレクトリに保存する
# ...
このリポジトリにあるツールを、許可なく他人のサイトにぶち込むんじゃねえぞ。それは「宣戦布告」だ。 警察に突き出されるか、それ以上に恐ろしい報いを受けることになる。
あくまで、自分の城を強固にするため、あるいは許可を得た戦場(CTF)で使うんだ。いいな?