CYBER INSIGHT 2019の2つ目のセッションはハッキングデモを行いました。ウェブサイトにSQLインジェクションの脆弱性があり、その脆弱性からデータベースの情報を搾取し、ハッシュ化されているパスワード情報を最終的には平文化させて、ID・パスワードも搾取する内容でした。

後半ではサーバレスで構築されたアプリケーションに潜む脆弱性を紹介し、その具体的な問題点をデモを交えて解説いたしました。
今回、ダイジェストではサーバレスの脆弱性についてご紹介いたします。


OWASP TOP10に代表される脆弱性を絡めながら、今回は「インジェクション」、「認証の不備」、「機微な情報の露出」、「アクセス制御の不備」、「不適切なセキュリティ設定」、「安全でないデシリアリゼーション」の脆弱性を突いた攻撃について解説しました。


最初の例は安全でないデシリアリゼーションとインジェクションの脆弱性を絡めた攻撃手法になります。


Lambda とAPI Gatewayでサーバレスアプリケーションが構築された環境があり、APIに送信するリクエストデータにコードインジェクションし、別のLambdaを起動させ、そのLambdaの結果をGETリスクエストを介してリバースプロキシの様に動作しているngrokのサービスに送信させることで起動したLambdaのレスポンスペイロードを攻撃者に送信することができます。


今回通常のリクエストで送信される値を改ざんしてコードをインジェクトしたリクエストを送信します。
_$$ND_FUNC$$_function(){}を活用することでシリアライズしたデータとして送信することができfunctionの後にIIFE (Immediately-Invoked Function Expressions )の括弧をつけることでデシリアリゼーションするタイミングでコードを実行させることができるようになります。
上記の例では{}内にLambdaをinvokeするコードで別のLambdaを実行することができます。



またLambdaをInvokeした後に<ATTACKER_REMOTE_ADDRESS>の箇所にURIを設定しレスポンスデータをJSON形式にして送信しています。


 

今回、正常なリクエストを発生させて、OWASP ZAPでリクエストを記録させ、リクエストをコードインジェクションしたものに改ざんして送信します。


 

これは送信したリクエストに対して返されたレスポンスですが、同時に別のLambdaが起動され、そのレスポンスがngrokに送信され、最終的に攻撃者の端末に送られています。今回はOWASP ZAPを利用しているため、callbackするパスを指定いてそこにGETリクエストが送信され、GETリクエストと共に送られたデータが参照できます。


 

OWASP ZAPのアウトプットに上記のように送信されたデータを参照することができます。URLデコードをすることで、JSON形式のデータを確認することができます。


今回のケースではリクエストが意図せぬコードが挿入されたリクエストに書き換えられ、送信された結果、コードを実行することができました。_$$ND_FUNC$$_function(){}でシリアリゼーションしたデータを挿入することができるため、このような特殊タグが含まれたデータを入力チェックする必要があります。またWAFを導入していてもこのような特殊タグを認識できるようなルールがなければそのまま通過してしまいます。

今回のブログは安全でないデシリアリゼーションを使ってコードインジェクションを行いました。
次回は「認証の不備」 x 「アクセス制御の不備」を組み合わせた攻撃手法をご紹介いたします。