web-dev-qa-db-ja.com

OWASP ZAPはXSSでREST APIを確認できますか?

Webアプリケーションがあり、OWSSP ZAPを使用してXSSをチェックしました。以下の例として2つのケースを試しました。

URL:localhost:8888/test/login

ÖoginページHTML:

<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Login Page</title>
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>

</head>
<body>
<h3>Login with email and password</h3>
<form id="testForm" action="login" method="post">
<strong>User Email</strong>:<input type="text" name="email" id="email"><br>
<strong>Password</strong>:<input type="pass" name="pass" id="pass"><br>
<input type="submit" value="Login" id="subForm">
<div id="result"><%=request.getAttribute("email")%></div>
</form>
<br>
If you are new user, please <a href="register.html">register</a>.
</body>
</html>

ケース1:アプリケーションがHTML(HTML応答)を返す

  • ZAPを起動

  • ログインフォームを送信

  • このURLのアクティブスキャンXSSを選択します:localhost:8888/test/login

    結果:ZAPで1つのXSSアラートスクリプトが見つかりました

ケース2:アプリケーションがJSONを返す(REST API)

URL:localhost:8888/api/login

JSONデータ形式のリクエスト:{"email":"abc", "pass": "123456"}

応答JSONデータ形式:{"email":"abc", "pass": "123456"}

  • Ajaxを使用してJSONリクエストでAPIを呼び出す

    <script>
    
    function sendAjax() {
    
        var user = new Object();
    
        var email = $('#email').val();
    
        var pass = $('#pass').val();
    
        $.ajax({
            url: "localhost:8888/api/login",
            type: 'POST',
            dataType: 'json',
            data: JSON.stringify({"email":email,"pass":pass}),
            contentType: 'application/json',
            mimeType: 'application/json',
    
            success: function (data) {
                $("#result").html("email: "+data.email+" pass: "+data.pass)
            },
            error:function(data,status,er) {
                alert("error: "+data+" status: "+status+" er:"+er);
            }
        });
    }
    </script>
    
  • ZAPを起動

  • ボタンサミットをクリック(sendAjax関数を呼び出してリクエストデータを送信)

  • このURLのアクティブスキャンXSSを選択してください:localhost:8888/api/login

    結果:何も見つかりませんでした

私が正確に知りたいのは、ZAPがREST APIでXSSをチェックできるかどうかです。それができない場合、このAPIでXSSを確認するにはどうすればよいですか(ケース2)?

2
nhatnguyen

Purefanは既にコメントであなたの質問に答えましたが、これは少し拡大されました。

Webサイトが_Content-type: application/json_ヘッダーを使用してJSONを返す場合、XSS攻撃は不可能です。どうして? JSONは単なる文字列なので、サイトがreturn{123 : alert('blablabla')}であるかどうかは関係ありません。これは単なる文字列だからです。

一方、XSSはクライアントが応答HTMLを解釈するため機能します。そのため、JSONではなくHTMLを返すときにZAPがXSSを検出します。

1
eez0

APIがJSONを返す場合、アプリケーションがUI(クライアント)でJSONを適切に解析しない場合に限り、UI(クライアント)でXSSが発生する可能性があります。

CSRFにつながる可能性があるため、サーバーがコンテンツタイプを検証しているかどうかを確認します。

StackOverflowでこの関連する回答を確認してください: XSSが適切なJavaScript文字列エスケープを使用してJSON応答を悪用することは可能ですか?

0
ammy