Classic/VPC環境で利用できます。
診断ジョブが完了した診断のレポートを出力します。
リクエスト
リクエスト形式を説明します。リクエスト形式は次の通りです。
メソッド | URI |
---|---|
GET | /{instanceId}/report |
リクエストヘッダ
Web Security Checkerで共通して使用されるヘッダの詳細は、Web Security Checkerのリクエストヘッダをご参照ください。
リクエストパスパラメータ
パラメータの説明は次の通りです。
フィールド | タイプ | 必須の有無 | 説明 |
---|---|---|---|
InstanceId | Integer | Required | 診断の識別番号
|
リクエスト例
リクエストのサンプルコードは次の通りです。
curl --location --request GET 'https://wsc.apigw.ntruss.com/api/v1/jobs/{instanceId}/report'
--header 'x-ncp-apigw-timestamp: {Timestamp}'
--header 'x-ncp-iam-access-key: {Access Key}'
--header 'x-ncp-apigw-signature-v2: {API Gateway Signature}'
--header 'Content-Type: application/json'
レスポンス
レスポンス形式を説明します。
レスポンスボディ
レスポンスボディの説明は次の通りです。
フィールド | タイプ | 必須の有無 | 説明 |
---|---|---|---|
report_date |
String | - | 診断完了時間 |
Target_Info |
String | - | 診断対象情報 |
Crawl_Time |
String | - | クローリング時間(YYYY/MM/DD hh:mm:ss~YYYY/MM/DD hh:mm:ss) |
Scan_Time |
String | - | 診断ジョブ時間(YYYY/MM/DD hh:mm:ss~YYYY/MM/DD hh:mm:ss) |
Excluded_Url |
String | - | 診断除外対象 URLリスト |
Login_Info |
String | - | 認証クッキー情報 |
Vulnerability_Category |
String | - | 診断項目を並べる(VulnTitle_1, VulnTitle_2, ...) |
User_Agent |
String | - | 診断/クローラブラウザの設定 |
Memo |
String | - | 診断ジョブ作成時に作成したメモ |
Scanned_Domain_List |
Array | - | 診断対象のドメインリスト |
Not_Scanned_Domain_List |
Array | - | 診断除外ドメインリスト |
Classify_byRisk_Level |
Object | - | 危険度ごとの脆弱性数 |
Classify_byRisk_Level.Total |
Integer | - | 脆弱性の総数 |
Classify_byRisk_Level.High |
Integer | - | 影響度「上」の脆弱性数 |
Classify_byRisk_Level.Medium |
Integer | - | 影響度「中」の脆弱性数 |
Classify_byRisk_Level.Low |
Integer | - | 影響度「下」の脆弱性数 |
Classify_byRisk_Domain |
Object | - | ドメイン、影響度ごとの脆弱性数 |
Classify_byRisk_Domain."http://your-domain" |
Object | - | http://your-domain のリスクごとの脆弱性数 |
Classify_byRisk_Domain."http://your-domain"."VulnTitle_1" |
Object | - | http://your-domain の「VulnTitle_1」診断項目のリスクごとの脆弱性数 |
Classify_byRisk_Domain."http://your-domain"."VulnTitle_1".High |
Integer | - | http://your-domain の「VulnTitle_1」診断項目の影響度「上」の脆弱性数 |
Classify_byRisk_Domain."http://your-domain"."VulnTitle_1".Medium |
Integer | - | http://your-domain の「VulnTitle_1」診断項目の影響度「中」の脆弱性数 |
Classify_byRisk_Domain."http://your-domain"."VulnTitle_1".Low |
Integer | - | http://your-domain の「VulnTitle_1」診断項目の影響度「下」の脆弱性数 |
Classify_byRisk_Vulnerability |
Object | - | 脆弱性ごとの脆弱性数 |
Classify_byRisk_Vulnerability."VulnTitle_1" |
Integer | - | 「VulnTitle_1」診断項目の脆弱性数 |
Classify_byRisk_Vulnerability."VulnTitle_2" |
Integer | - | 「VulnTitle_2」診断項目の脆弱性数 |
Details |
Object | - | 診断項目ごとの詳細情報 |
Details."VulnTitle_1" |
Object | - | 「VulnTitle_1」診断項目の脆弱性の詳細情報 |
Details."VulnTitle_1".RiskLevel |
Object | - | 「VulnTitle_1」の診断時に見つかった脆弱性の影響度
|
Details."VulnTitle_1".Vuln_Desc |
Object | - | 「VulnTitle_1」の診断時に見つかった脆弱性の説明
|
Details."VulnTitle_1".Vuln_Desc2 |
Object | - | 「VulnTitle_1」の診断時に見つかった脆弱性の説明
|
Details."VulnTitle_1"."0" |
Object | - | 「VulnTitle_1」診断項目の最初の脆弱性の詳細情報 |
Details."VulnTitle_1"."0".Title |
Object | - | 脆弱性名+番号 |
Details."VulnTitle_1"."0".vuln_key |
String | - | 脆弱性を識別する固有キー
|
Details."VulnTitle_1"."0".URL |
Object | - | 脆弱性が発生したパス(ウェブ URL)やメソッド |
Details."VulnTitle_1"."0".Request_Header |
Object | - | 脆弱性診断に使用したリクエストヘッダ(Request Header)情報 |
Details."VulnTitle_1"."0".Referer |
Object | - | リクエストヘッダ(Request Header)情報からの以前の参照パス(URL、リファラ) |
Details."VulnTitle_1"."0".Request_Body |
Object | - | FORMデータ、JSONデータなどリクエストボディ領域 |
Details."VulnTitle_1"."0".newline |
Boolean | - | レスポンスデータフィールドリストを改行するかどうかを表示
|
Details."VulnTitle_1"."0".VulnParam |
String | - | 脆弱な URLクエリストリングまたは POSTデータのパラメータ名 |
Details."VulnTitle_1"."0".VulnSTR |
String | - | 脆弱性診断モジュールが挿入したペイロード |
Details."VulnTitle_1"."0".Response_Data |
Array | - | レスポンスボディデータリスト |
Details."VulnTitle_1"."0".Description |
String | - | 脆弱性攻撃方法についての追加の説明 |
Details."VulnTitle_1"."0".Reference |
String | - | 対応策外部案内文書のリンク |
Recommendation |
Object | - | 脆弱性対策の詳細 |
Recommendation."VulnTitle_1" |
String | - | 「VulnTitle_1」診断項目の脆弱性対策の詳細 |
Recommendation."VulnTitle_2" |
String | - | 「VulnTitle_2」診断項目の脆弱性対策の詳細 |
レスポンスステータスコード
Web Security Checker APIで共通して使用されるエラーコードの詳細は、Web Security Checkerの共通エラーコードをご参照ください。
レスポンス例
レスポンスのサンプルコードは次の通りです。
-
診断レポート出力完了
{ "returnCode": "0", "returnDesc": "Request Success", "returnMessage": "Success", "resource": { "report_date": "2024-07-08 13:15:10", "Target_Info": "http://your-domain", "Crawl_Time": "2024/07/08 13:12:03~2024/07/08 13:12:08", "Scan_Time": "2024/07/08 13:12:27~2024/07/08 13:15:10", "Excluded_Url": [], "Login_Info": "", "Vulnerability_Category": "SQL Injection, XSS, .... (中略)", "User_Agent": "Mozilla/5.0 .... (中略)", "Memo": "サンプル", "Scanned_Domain_List": [ "http://your-domain" ], "Not_Scanned_Domain_List": [ "http://www.w3.org", "http://httpd.apache.org", "https://bugs.launchpad.net" ], "Classify_byRisk_Level": { "Total": 1, "High": 0, "Medium": 0, "Low": 1 }, "Classify_byRisk_Domain": { "http://your-domain": { "XSS": { "Low": 1 } } }, "Classify_byRisk_Vulnerability": { "XSS": 1 }, "Details": { "XSS": { "RiskLevel": "Low", "Vuln_Desc": "XSS(Cross-site Scripting)脆弱性は... (中略)", "Vuln_Desc2": "- ユーザーから入力された値が有効な範囲.... (中略)", "0": { "Title": "XSS #1", "vuln_key": "http://your-domain_XSS_0", "URL": "[GET] http://your-domain/...(中略)", "Request_Header": "", "Referer": "", "Request_Body": "", "newline": "true", "VulnParam": "", "VulnSTR": "", "Response_Data": [ "Allow: POST,OPTIONS,HEAD,GET" ], "Description": "", "Reference": "" } } }, "Recommendation": { "XSS": "ユーザーから入力された値が正確に予測可能な... (中略)" } } }
-
診断レポート出力エラー: 無効な
InstanceId
を入力した場合{ "error": { "errorCode": 901, "message": "API Call Fail" } }
サンプルコード
診断レポートを出力するには、診断検索 APIと診断レポート出力 APIが必要です。診断検索 APIを通じて診断レポートを出力する診断のinstanceNo
値を抽出し、この値を利用して診断レポート出力 APIを呼び出します。
診断の検索とinstanceNo
の確認方法、その APIのサンプルコードの詳細は、getJobsまたはsearchJobsをご参照ください。
診断検索 API(searchJobs)で検索したサンプルコードは次の通りです。
- 検索タイプ:
url
- キーワード:
target-domain.com
# リクエスト例
$ python jobSearch.py "url target-domain.com"
# レスポンス例
{
"returnCode": "0",
"returnDesc": "Request Success",
"returnMessage": "Success",
"resources": {
"total_cnt": 1,
"total_page_cnt": 1,
"current_start_page": 1,
"current_end_page": 1,
"record_data": [
{
"instanceNo": "1234567890",
"start_date": "2024-07-09 15:37:04",
"end_date": "2024-07-09 15:39:54",
"status": "診断完了",
"progress": null,
"start_url": "http://target-domain.com",
"crawl_cnt": "1",
"scan_cnt": "1",
"memo": "Wsc Sample",
"result_button": "report",
"result_desc": "",
"rescan_button": "possible",
"slave_data": null
}
]
}
}
make_signature関数でシグネチャーを作成してリクエストヘッドを作成し、入力したリクエストパラメータに応じて診断する前にキャンセルしてレスポンスコードが200の場合、結果を出力するサンプルコードは次の通りです。
import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json
from pprint import pprint
def make_signature(method, uri, timestamp):
access_key = "{accessKey}" # access key id (from portal or sub account)
secret_key = "{secretKey}" # secret key (from portal or sub account)
secret_key = bytes(secret_key, 'UTF-8')
method = method
uri = uri
message = method + " " + uri + "\n" + timestamp + "\n" + access_key
message = bytes(message, 'UTF-8')
signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
return signingKey
method = 'GET'
instanceId = "{instanceId}" # instance id (from api)
uri = f'/api/v1/jobs/{instanceId}/report'
timestamp = str(int(time.time() * 1000))
signature = make_signature(method, uri, timestamp)
headers = {
'x-ncp-apigw-signature-v2': signature.decode('utf-8'),
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': '{accessKey}', # access key id (from portal or sub account)
'Content-Type': 'application/json'
}
response = requests.request(
method,
f"https://wsc.apigw.ntruss.com{uri}",
headers=headers
)
if response.status_code == 200:
pprint(json.loads(response.text))
else:
pprint(json.loads(response.text))
サンプルコードは Python3を基に作成しました。Java、Node.jsなど他の言語で作成したサンプルコードは、API Gatewayご利用ガイドのAPIの呼び出しをご参照ください。