Про заброшенный с советских времен лагерь «Лучики» давно ходят мрачные слухи, будто там живет ведьма. Любые попытки превратить это место в турбазу или дом отдыха заканчиваются бедами, то пожары, то разрушения, то гибель людей. Родители Тима уверены, что в детстве сами столкнулись с этим злом, тогда их отряд почти полностью погиб, утонув во время прогулки, и им чудом удалось выжить. С тех пор мать Тима каждый год видит один и тот же кошмар, где ведьма угрожает забрать ее сына. Чтобы доказать, что всему есть разумное объяснение, Тим решается поехать в «Лучики». Он уверен, что за трагедиями стоит человек, но сохранить холодный разум оказывается куда сложнее, когда сталкиваешься с чем то необъяснимым лицом к лицу
# Пролог и введение в историю Луковой ведьмы
Пионерлагерь «Лучики» на Луковом острове закрыли в 1987 году после трагедии, двадцать семь человек (двадцать пять детей, пионервожатая и моторист) утонули во время речной прогулки, когда лодка перевернулась. Спаслись только двое - мальчик Коля и девочка Лиза. Они утверждали, что панику вызвала уродливая старуха, швырявшаяся гнилым луком с берега. Ее прозвали Луковой ведьмой.
После этого случая погибли еще двое, кладовщица Егоровна (умерла от инфаркта после встречи с ведьмой в овощехранилище, во рту нашли луковицу) и сторож Степаныч (задохнулся, съев несколько килограммов лука). Ведьму так и не нашли, ее следы вели только к сторожке и обрывались. Лагерь закрыли, но слухи о ведьме не утихали, а трагические случаи на острове продолжались и в последующие годы.
# Детство родителей Тима и трагедия 1987 года
Тим просыпается от крика матери, у нее сердечный приступ. Она бредит о Луковой ведьме, которая якобы преследует ее всю жизнь. Тим находит в комоде черный альбом с фотографиями погибших детей и газетными вырезками о трагедии 1987 года.
Отец Тима рассказывает ему, что именно он и Лиза (мать Тима) были теми самыми спасшимися детьми. В пионерлагере «Лучики» в 1987 году они репетировали спектакль. Лиза первой заметила ведьму на берегу и закричала, началась паника, лодка перевернулась. Все утонули, кроме Коли и Лизы. С тех пор мать Тима страдает от кошмаров и сердечных приступов, считая, что ведьма ее преследует.
Тим решает отправиться в Чернолучье, устроиться смотрителем в «Лучики» и раскрыть тайну Луковой ведьмы, чтобы помочь матери.
# Приезд Тима и знакомство с местными
Тим приезжает в поселок Чернолучье. По дороге он замечает девушку Нюру на велосипеде с пакетом продуктов, среди которых виднеется лук. В «Лукоречье» он видит деревянную фигуру - тотемный столб с изображением старухи с луком, который охранник Митрич называет Луковой ведьмой. Митрич рассказывает туристам историю о проклятом острове.
Тим находит пионерлагерь «Лучики». Ночью он видит тень старухи, пугается и убегает, находя на себе луковую шелуху. Он ночует на берегу реки, где его находит участковый в отставке Виктор Степанович (бывший милиционер) и Митрич, нашедший на берегу несколько свежих луковиц.
Тим знакомится с Виктором Степановичем и его женой Тамарой Андреевной, которые сдают ему комнату. Тим также знакомится с соседкой Нюрой, помогает ей снять кошку с дерева, и в результате Виктор Степанович падает с яблони и вывихивает ногу. Тамара Андреевна рассказывает, что бабка Нюры считалась ведьмой, а сама Нюра - внучка той самой Двузубовой, из-за которой сгорело село Кудыкино.
# Первое дежурство в «Лучиках» и обнаружение старухи
Тим заступает на дежурство. Предыдущий смотритель Геннадий запирает сторожку и оставляет Тима одного, наказав ему не высовываться после заката и не реагировать на странные звуки. Тим находит в лесу трубу, из которой доносится плач. Он спускается в подземное овощехранилище, где сталкивается со сгорбленной старухой. Испугавшись, Тим убегает.
Наутро он замечает старуху, которая выламывает доски из окна сторожки. Появляется мужчина, представляющийся хозяином лагеря Карлом Романовичем Бенедиктовым. Тим рассказывает ему о старухе. Они вместе спускаются в овощехранилище, но на лестнице Тим оступается и оба падают. Бенедиктов теряет сознание. Тим вызывает «скорую», но когда медики приезжают, Бенедиктова нет на месте. Врачи выясняют, что настоящий Карл Романович все это время был в своем кабинете в другом месте. Тим понимает, что его разыграли, и это была не галлюцинация.
Тим находит в одном из корпусов стенд с фотографиями театрального кружка и обнаруживает, что старуха на снимке - это просто маска Кикиморы из спектакля. Он понимает, что Луковая ведьма - это человек в маске. Он находит в овощехранилище маску, балахон и стопку писем от детей, которые жаловались родителям на повариху Федору, заставлявшую их чистить и есть лук.
# Разоблачение и финальная конфронтация
Тим выясняет, что Федора была пациенткой психиатрической больницы, но медсестра Зоя Митрофановна рассказывает ему, что Федора не умерла в 1995 году, а была тайно вывезена. На кладбище Тим встречает пациентку Люсю, которая признается, что видела, как некий мужчина (в котором Тим узнает Артура Бенедиктова) забрал Федору, и что могила пуста.
Нюра и шестеро детдомовских мальчиков пропадают. Тим находит Нюру в ивовых зарослях на берегу с луковицей во рту, без сознания. Она приходит в себя и предупреждает об опасности. Появляется старуха (Федора) с молотком. Тим убегает за ней, но на острове видит, как две одинаковые «ведьмы» гоняются друг за другом. Одна из них оказывается Артуром Бенедиктовым, который пытался убить Федору. Федора рассказывает, что Артур много лет под видом Луковой ведьмы запугивал людей, убивал строителей и туристов, чтобы брат продал ему остров за бесценок. Федора признается, что ее сын Геннадий (смотритель) был убит Артуром, так как знал правду.
Тим бежит к реке и спасает шестерых мальчишек из тонущей лодки, которую испортил Артур. На остров прибывают полиция, родители Тима и жители поселка. Мать Тима признается Федоре, что именно она когда-то подговорила детей напугать ее в костюмах чертей, что и спровоцировало помешательство Федоры. Федора готова прыгнуть с вышки, но мать Тима просит прощения, и Федора спускается, забирая с собой «проклятие».
# Эпилог
Артура Бенедиктова арестовывают, он симулирует безумие. Федору задерживают, но вину ее доказать невозможно из-за давности сроков. Митрич делает предложение Алле Павловне, и она соглашается, поставив условие - усыновить шестерых мальчиков. Карл Романович решает подарить лагерь «Лучики» детскому дому.
Тим приезжает в больницу к Нюре. Она признается, что навещала Федору и привозила ей лук. Нюра утверждает, что в Федоре сидел бес, которого она (Нюра) перетянула в себя по просьбе матери Тима. Тим приглашает Нюру в город, и она соглашается.
Позже Тим узнает от Виктора Степановича, что Люся, пациентка интерната, которая рассказала ему о вывозе Федоры, исчезла в том же году и до сих пор не найдена. Тим с Нюрой гуляют по городу, и когда Тим встречает свою бывшую подругу Киру, Нюра «выпускает» беса, что едва не приводит к трагедии на дороге. Тим останавливает Нюру, заявляя о своей любви, и бес отступает.