Отказ от ответственности: Содержание этой статьи предназначено только для обучения и общения.Все неблагоприятные последствия, вызванные распространением и использованием связанных технологий в статье, являются ответственностью пользователя и не имеют никакого отношения к этому официальному аккаунту и автору. статья. При необходимости перепечатки просьба указывать источник, а содержание данной статьи не может быть удалено без разрешения автора.
Информация об уязвимости
-
Тип уязвимости: обход каталога
-
Уязвимая версия: gitea до 0.2.0
-
Знакомство с уязвимостью: нефильтрованные сетевые запросы
Введение в репо
doctron - это сервер, который предоставляет функцию преобразования html в pdf и в настоящее время имеет 266 звезд.
Анализ уязвимостей
Вызов doctron инициирует запрос URL-адреса без фильтрации протокола, что приводит к чтению любого локального файла.chromedp.Navigate
file://
func (ins *html2pdf) Convert() ([]byte, error) {
start := time.Now()
defer func() {
ins.convertElapsed = time.Since(start)
}()
var params PDFParams
params, ok := ins.cc.Params.(PDFParams)
if !ok {
return nil, errors.New("wrong pdf params given")
}
ctx, cancel := chromedp.NewContext(ins.ctx)
defer cancel()
if err := chromedp.Run(ctx,
chromedp.Navigate(ins.cc.Url),
chromedp.Sleep(time.Duration(params.WaitingTime)*time.Millisecond),
chromedp.ActionFunc(func(ctx context.Context) error {
var err error
ins.buf, _, err = params.Do(ctx)
return err
}),
); err != nil {
return nil, err
}
return ins.buf, nil
}
Метод ремонта
Добавлен метод проверки URLCheckParams
Содержание метода заключается в следующем, чтобы оценить и отфильтровать тип протокола URL-адреса.
func CheckParams(ctx iris.Context) {
webUrl := ctx.URLParam("url")
...
u, err := url.Parse(webUrl)
...
if u.Scheme != "http" && u.Scheme != "https" {
outputDTO := common.NewDefaultOutputDTO(nil)
outputDTO.Code = common.InvalidUrlScheme
_, _ = common.NewJsonOutput(ctx, outputDTO)
return
}
ctx.Next()
}
Справочная ссылка
-
https://huntr.dev/bounties/c1952c59-c196-440d-b41f-ce137fb183a1/