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 호출을 참조해 주십시오.