제목 : API 보안 학습 노트

必要性​

프론트 엔드 분리는 웹에서 주요 트렌드가되었습니다. tomcat+ngnix를 통해 효과적으로 분리 될 수 있습니다 (중간에는 node.js도있을 수도 있음). 또한, 전면 및 후면의 분리는 미래의 대규모 분산 아키텍처, 탄성 컴퓨팅 아키텍처, 마이크로 서비스 아키텍처 및 다중 터미널 서비스 (브라우저, 차량 내 터미널, 안드로이드, iOS 등과 같은 여러 클라이언트)를위한 견고한 기초를 마련 할 것입니다. API는 프론트 엔드 커뮤니케이션의 책임을 가정합니다. 따라서 API 보안을 배워야합니다.
이 기사의 아이디어는 API의 일반적인 공격 표면을 요약하는 것입니다. 저자는 여전히이 영역을 배우고 있습니다. 실수가 있으면 수정할 수 있기를 바랍니다.

常见的api技术​

GraphQL​

GraphQL은 API의 쿼리 언어입니다
일반적으로 다음과 같은 특성이 있습니다.
(1) 데이터 패킷은 /GraphQL 인터페이스
1049983-20230129135917968-89120057.png
으로 전송됩니다.
(2) 많은 Newline 문자 \ n이 포함되어 있습니다
{ 'query':'\ n query introspection super {\ r \ n __schema {\ r \ n QueryType {name} \ r \ n mutationtype {name} \ n subscriptionType {name} \ r \ n tymes {\ r \ n fullType \ n . __type {\ r \ n 종류 \ r \ n name \ r \ n description \ r \ n fields (포함 된 3: true) {\ r \ n name \ r \ n description \ r \ n args {\ r \ n . inputvalue \ n \ n \ n type {r \ n type {\ n type \ n type \ n . typEREF \ r \ n} \ r \ n isdeprecated \ r \ n ambrecationReason \ r \ n} \ r \ n inputfields {\ r \ n . inputValue \ n \ n} \ r \ n interfaces {\ r \ n . typeref \ n \ n} \ n} EnumValues (포함 된 3: true) {\ r \ n name \ r \ n description \ r \ n isdeprecated \ r \ n ambrecationReason \ r \ n} \ r \ n possibletypes {\ r \ n . typeref \ n} \ n \ n}} \ n}} __inputValue {\ r \ n name \ r \ n description \ r \ n type {. typeref} \ r \ n defaultValue \ r \ n} \ r \ n Fragment InputValue {\ r \ n type {. typeref} \ r \ n \ n name \ n name \ n \ n nam 종류 \ r \ n Name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n namepe {\ n \ n \ n \ n \ n \ n \ n \ n \ n \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ n \ n} \ r \ n} \ r \ n \ n \ n} \ r \ n}} \ n}} . 웹 서비스 설명을 클라이언트가 문서 정보 또는 프로세스 통화를 포함하는 서비스에 액세스 할 수있는 일련의 서비스 액세스 포인트로 정의합니다. SOAP 프로토콜이 사용되며 일반적으로 XML 형식 데이터를 보내면 WSDL 파일
1049983-20230129135918652-993812695.png
이 있습니다.
.NET의 공통 .AMSX 파일에는 WSDL 형식 xxx.asmx? WSDL
1049983-20230129135919449-1509316087.png
가 있습니다.
우리는 SOAPUI를 사용하여 이러한 유형의 API를 테스트 할 수 있습니다.

SOAP-WSDL​

파일에 매우 명백한 wadl 로고가 있습니다.
1049983-20230129135920363-2085092611.png

테스트를 위해 SOAPUI의 나머지 기능을 사용할 수도 있습니다.
1049983-20230129135921297-1009304781.png

WADL​

REST API는 이전의 것만 큼 분명하지 않으며 요즘 가장 일반적으로 사용되는 API 기술입니다.
REST는 프로토콜이나 표준이 아닌 일련의 건축 사양입니다. API 개발자는 다양한 방식으로 휴식을 구현할 수 있습니다.
클라이언트가 RESTFUL API를 통해 요청하면 리소스 상태 명세서를 요청자 또는 터미널에 전달합니다. 이 정보 또는 표현식은 json (javaScript 객체 표기법), HTML, XLT, Python, PHP 또는 일반 텍스트 형식 중 하나로 HTTP를 통해 전송됩니다. JSON은 가장 일반적으로 사용되는 프로그래밍 언어입니다. 원래 영어 이름은 "JavaScript 객체 표기법"을 의미하지만 다양한 언어에 적합하며 인간과 기계 모두에서 읽을 수 있습니다.
주목할만한 사항이 있습니다. HTTP 방법에서 RESTFUL API HTTP 요청의 HTTP 방법에서도 중요한 식별 정보가 포함되어 있기 때문에 중요한 식별 정보가 포함되어 있기 때문입니다. 자체 HTTP 연결 정보 및 상태 코드가있는 요청 헤더 및 응답 헤더가 있습니다.

REST​

API의 일부 보안 테스트의 경우 일반적으로 API의 허가 문제, API 엔드 포인트 및 인프라의 보안 문제에 중점을 둡니다.
API 엔드 포인트의 보안 문제를 테스트하려면 가능한 많은 API 엔드 포인트를 얻으려고 노력해야합니다.

获取端点的方式​

Swagger
일반적인 지문 :
# Swagger 2
/swagger-ui.html
/API-DOC
/V2/API-DOC
# Swagger 3
/swagger-ui/index.html
1049983-20230129135922103-1944238266.png

/API-DOC
/V2/API-DOC
/V3/API-DOC
.
API-DOC는 모든 엔드 포인트 정보
1049983-20230129135922819-1063074218.png
을 공개 할 수 있습니다
테스트를위한 두 가지 도구는 다음과 같습니다
첫 번째는 Swagger-editor입니다
다운로드 후 Index.html을 열어 사용할 수 있습니다. URL을 가져 오거나 원격으로로드하도록 선택할 수 있습니다. JSON 및 YAML 형식의 API-DOC를 지원합니다.
두 번째는 apikithttps://github.com/api-security/apikit입니다
버프 플러그인
1049983-20230129135924555-102219345.png

swagger api-docs泄露​

모든 엔드 포인트 정보를 얻습니다
{ 'query':'\ n query introspection super {\ r \ n __schema {\ r \ n QueryType {name} \ r \ n mutationtype {name} \ n subscriptionType {name} \ r \ n tymes {\ r \ n fullType \ n . __type {\ r \ n 종류 \ r \ n name \ r \ n description \ r \ n fields (포함 된 3: true) {\ r \ n name \ r \ n description \ r \ n args {\ r \ n . inputvalue \ n \ n \ n type {r \ n type {\ n type \ n type \ n . typEREF \ r \ n} \ r \ n isdeprecated \ r \ n ambrecationReason \ r \ n} \ r \ n inputfields {\ r \ n . inputValue \ n \ n} \ r \ n interfaces {\ r \ n . typeref \ n \ n} \ n} EnumValues (포함 된 3: true) {\ r \ n name \ r \ n description \ r \ n isdeprecated \ r \ n ambrecationReason \ r \ n} \ r \ n possibletypes {\ r \ n . typeref \ n} \ n \ n}} \ n}} __inputValue {\ r \ n name \ r \ n description \ r \ n type {. typeref} \ r \ n defaultValue \ r \ n} \ r \ n Fragment InputValue {\ r \ n type {. typeref} \ r \ n \ n name \ n name \ n \ n nam 종류 \ r \ n Name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n namepe {\ n \ n \ n \ n \ n \ n \ n \ n \ n \ n oftype {\ r \ n 종류 \ r \ n name \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ n \ n} \ r \ n} \ r \ n \ n \ n} \ r \ n}} \ n}} }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ','variables':null}
1049983-20230129135925462-2091935808.png

이를 사용하여 인터페이스 문서를 생성 할 수 있습니다.
nodejs test.json yead는 내성 쿼리에서 반환 된 JSON 형식 데이터입니다.
npm install -g @2fd/graphdoc
GraphDoc -s ./test.json -o ./doc/schema
그런 다음 생성 된 /doc/index.html
1049983-20230129135926397-616747756.png
을 엽니 다
그의 형식
1049983-20230129135927015-1949031907.png
1049983-20230129135927700-609525478.png
에 따라 데이터 패킷을 구성하십시오.

graphql内省查询​

블랙 박스 테스트에서 큰 문제는 API 엔드 포인트가 완전히 발견되지 않았다는 것입니다. 우리는 해당 응용 프로그램이나 다른 측면에서 그것들을 찾아야합니다.
(1) 웹
JS HTML과 같은 정적 리소스는 API 엔드 포인트를 가질 수 있습니다.
BURP 플러그인 JS Linkfinder는 수동적으로 수집 할 수 있습니다
(2) 앱 및 기타 클라이언트 응용 프로그램
(3) Github
(4) 규칙에 따르면 퍼지

其他​

鉴权方式​

API가 요청 될 때마다 사용자의 사용자 이름과 비밀번호 제공
일반적으로 HTTP 패킷에 인증 헤더가 있습니다.
Authorization: Basic Base64 (username:password)
이것은 안전이 상대적으로 낮으며 현재 거의 사용되지 않습니다.

Basic Auth​

JWT (JSON Web Token)는 토큰 기반 인증 및 승인 메커니즘입니다.
세 부분으로 나뉩니다
Header: JWT의 메타 데이터를 설명하여 서명을 생성하기위한 알고리즘과 토큰 유형을 정의합니다.Payload: 통과 해야하는 데이터를 저장하는 데 사용되는Signature(签名): 서버는 헤더에 지정된 서명 알고리즘을 사용하여 HMAC SHA256)를 사용하여 JWT가 계산 방법 암호화 알고리즘 (Base64 (Header) + ' + Base), 비밀로 변조되는 것을 방지하지 못하게합니다.
온라인 테스트 https://jwt.io/
1049983-20230129135929184-1826635181.png

일반 토큰은 백엔드 스토리지와 사용자 간의 해당 관계가 필요하고 JWT는 해당 관계 자체를 제공합니다.

JWT​

Apikey 또는 무작위로 생성 된 다른 형태의 토큰

其他自定义头、cookie​

常见安全问题及测试方法​

API 게이트웨이는 클라이언트와 마이크로 서비스간에 구축 된 서비스입니다. 권한 검증, 모니터링, 캐싱, 요청 라우팅 등과 같은 API 게이트웨이의 비 사업 기능 논리를 처리 할 수 있습니다.
API 게이트웨이는 전체 마이크로 서비스 시스템의 외관과 같으며 시스템의 유일한 입구입니다. 이를 통해 클라이언트는 먼저 API 게이트웨이로 요청을 보내고 API 게이트웨이는 요청 된 식별 정보를 기반으로 요청을 Microservice 인스턴스로 전달합니다.
1049983-20230129135929803-1056153117.png

api网关​

Apache Apisix는 Apache Software Foundation의 클라우드 네이티브 API 게이트웨이입니다. 동적, 실시간 및 고성능 기능을 결합하여로드 밸런싱, 동적 업스트림, 그레이 스케일 릴리스 (카나리아 릴리스), 서비스 회로 차단기, ID 인증, 관찰 가능성 등과 같은 풍부한 트래픽 관리 기능을 제공합니다. APACHE APISIX를 사용하여 기존의 북쪽 트래픽 또는 서비스 간 트래픽을 처리 할 수 있습니다. 동시에 K8S Ingress 컨트롤러로도 지원됩니다. APISIX 이전에 명령 실행 취약점 CVE-2022-24112를 노출했습니다 (현재 최신 버전은 3.0입니다)
영향 범위 :
Apache Apisix 1.3 ~ 2.12.1 간의 모든 버전 (2.12.1 제외)
Apache Apisix 2.10.0 ~ 2.10.4 LTS 간의 모든 버전 (2.10.4 제외) 취약성 환경 구축
git 클론 https://github.com/twseptian/cve-2022-24112 ## dockerfile을 얻으십시오
CD CVE-2022-24112/APISIX-DOCKER/example/## 해당 디렉토리를 입력하십시오
Docker -Compose -P Docker -Apisix UP -D ## Docker를 기반으로 모든 APISIX 서비스 활용 조건 시작 시작
배치 요청 플러그인은 기본적으로 활성화됩니다.
사용자는 Apache APISIX 기본 구성을 사용합니다 (관리자 API를 활성화하고 기본 관리자 키를 사용하며 추가 관리 포트가 할당되지 않음), 공격자는 Batch-Requests 플러그인을 통해 Admin API를 호출 할 수 있습니다. 아이디어를 공격하십시오
1. 배치 요청 플러그인 취약점을 사용하여 요청 헤더 감지를 우회합니다.
2. 요청 헤더를 만들어 관리자 API로 경로를 등록하십시오.
3. 경로를 등록 할 때 매개 변수 Filter_Func은 LUA 코드를 통과하여 원격 코드 실행 취약점 EXP :
 
뒤로
상단