Details - TK-CTF/CTF GitHub Wiki
Cross-Site Scripting(XSS)
動的に生成するHTMLにJavaScriptなどを注入する
テクニック
- 属性値(URL)のJavaScriptスキーム
- イベントハンドラ
- script要素内の文字列リテラル
- Service Worker(?)
- アップロードしたファイルをHTMLとして認識させる
影響
- Cookie値の盗み出し(受動的攻撃)
- 画面の書き換え
- その他のJavaScriptによる攻撃
対策
- 要素内容なら
<と&をエスケープ - 属性値なら
"で囲って<と"と&をエスケープ - HTTPレスポンスに文字エンコーディングを明示
- 入力値の妥当性検証
- X-XSS-Protectionレスポンスヘッダ
- HttpOnly属性
SQL Injection
テクニック
- 常に真
' OR 0=0 -- - INFORMATION_SCHEMA
UNION SELECT table_name, column_name, data_type, NULL, NULL, NULL, NULL FROM information_schema.columns ORDER BY 1 -- - Blind SQL Injection
- 文字数
%dを取得
' OR (SELECT length(pass) FROM user WHERE id = 'admin') > %d -- %d番目の文字%cを取得
' OR substr((SELECT pass FROM user WHERE id = 'admin'), %d, 1) = %c --
- 文字数
影響
- エラーメッセージ経由の情報漏洩
- UNION SELECTを用いた情報漏洩
- 認証回避
- データ改竄
- OSコマンドの実行
- ファイルの読み書き
- HTTPリクエストにより他のサーバーを攻撃
対策
- 入力値の妥当性検証
- 静的プレースホルダ
- (PD0)
- 詳細なエラーメッセージの抑止
- データベースの権限設定
Cross-Site Request Forgery(CSRF)
テクニック
- パスワードの変更
- 複数のiframeで多段攻撃
手順
- ユーザが罠サイトを閲覧
- 仕掛けのあるHTMLが正規サイトに攻撃用リクエスト
- 正規サイトのサーバーを不正操作
対策
ユーザの意図したリクエストか確認
- 秘密情報の埋め込み
- パスワード再入力
- Refererのチェック
Directory Traversal
テクニック
- Directory Listing
- ファイル名が日付やユーザ名、連番など推測可能
- ありがちな名前
- Host/Split(ヌルバイト)
- プライベートIPアドレスの推測
影響
- Webサーバー内のファイルの閲覧
- Webサーバー内のファイルの改竄、削除
対策
- ファイル名を外部から指定できる仕様を避ける
- ファイル名にディレクトリ名が含まれないようにする
- ファイル名を英数字に限定する
- アプリケーションの設計時に、ファイルの安全な格納位置を決める
OS Command Injection
テクニック
find+* -exec cat {} +- 内部でシェルを呼び出す関数
- PHP
- system
- exec
- passthru
- proc_open
- popen
- shell_exec
- `...`
- Perl
- exec
- system
- `...`
- qx/.../
- open
- Ruby
- exec
- system
- `...`
- PHP
シナリオ
- 攻撃用ツールを外部からダウンロードする
- ダウンロードしたツールに実行権限を与える
- OSの脆弱性を内部から攻撃して管理者権限を得る
対策
- OSコマンドを使わない実装方法を選択する
- シェル呼び出し機能のある関数の利用を避ける
- 外部から入力された文字列をコマンドラインのパラメータに渡さない
- OSコマンドに渡すパラメータを安全な関数によりエスケープする
Denial of Service(DoS)
対策
アップロードできるファイルに制限を課す
Remote Code Execution(RCE)
テクニック
- 実行ファイルをサーバ内に作成またはアップロード
- php
- asp
- aspx
- jsp
- html(SSI:Server Side Include)
- 多重拡張子
eval()
影響
- OSコマンドの実行
- Webサーバー内のファイルの閲覧/改竄/削除
- 外部へのメール送信
- 別のサーバーへの攻撃(踏み台)
- サーバー上での暗号通貨の採掘(マイニング)
対策
- アップロードしたファイルを公開ディレクトリに保存しない
Server-Side Request Forgery
テクニック
- AWS CLIへのアクセス
- gopherプロトコル(MySQL)
- Docker/Kubernetesの呼び出し
Insecure Deserialization
- Serialize/アプリケーション内部の構造を持ったデータを保存転送する目的でバイト列に変換すること
- Deserialize/Serializeされたデータから元のデータに戻すこと
テクニック
- PHPGGC
- Pickle RCE
- PHP
- デストラクタ
- unserialize_callback_func
- __wakeup
- __toString(マジックメソッド)
- Java
- readObject
影響
- OSコマンドの実行
- 情報漏洩
- サイト改竄
- 不正な機能実行
- 他サイトへの攻撃(踏み台)
- 暗号通貨の採掘(マイニング)
対策
- Serialize形式ではなくJSON形式によりデータを受け渡す
- Cookieやhiddenパラメータではなくセッション変数など書き換えできない形でSerialize形式のデータを受け渡す
- HMACなどの改竄検知の仕組みを導入してデータが改竄されてないことを確認する
XML External Entity(XXE)
対策
- XMLの代わりにJSONを用いる
- libxml2のバージョン2.9以降を用いる
libxml_disable_entity_loader(true)を呼び出す
Local/Remote File Inclusion
テクニック
- PHP入力ストリーム
- data:ストリームラッパー
影響
- Webサーバー内のファイルの閲覧による情報漏洩
- 任意スクリプトの実行
- サイト改竄
- 不正な機能実行
- 他サイトへの攻撃(踏み台)
対策
- 外部からファイル名を指定する仕様を避ける
- ファイル名を英数字に限定する
URL上でOSコマンドを実行できる脆弱性
PHP
/test.php?a=testにおいてa=testがクエリー文字列
/test.cgi?hoge+-piyoというURLと
php test.cgi hoge -piyoは等価
Perl
/test.pl/|lsというURLと
perl test.pl |lsは等価