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)?
Purefanは既にコメントであなたの質問に答えましたが、これは少し拡大されました。
Webサイトが_Content-type: application/json
_ヘッダーを使用してJSONを返す場合、XSS攻撃は不可能です。どうして? JSONは単なる文字列なので、サイトがreturn{123 : alert('blablabla')}
であるかどうかは関係ありません。これは単なる文字列だからです。
一方、XSSはクライアントが応答HTMLを解釈するため機能します。そのため、JSONではなくHTMLを返すときにZAPがXSSを検出します。
APIがJSONを返す場合、アプリケーションがUI(クライアント)でJSONを適切に解析しない場合に限り、UI(クライアント)でXSSが発生する可能性があります。
CSRFにつながる可能性があるため、サーバーがコンテンツタイプを検証しているかどうかを確認します。
StackOverflowでこの関連する回答を確認してください: XSSが適切なJavaScript文字列エスケープを使用してJSON応答を悪用することは可能ですか?