getReport

Prev Next

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」の診断時に見つかった脆弱性の影響度
  • Low | Medium | High
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 - 脆弱性を識別する固有キー
  • 形式: キーの様式またはドメイン_脆弱性名_番号
  • <例> "http://example.com_LFI_0"
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 - レスポンスデータフィールドリストを改行するかどうかを表示
  • true | false
    • true: 改行
    • false: 改行しない
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]&nbsp;&nbsp;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の呼び出しをご参照ください。