Сюжет фильма условно делится на параллельные действия в реальной Испании времен гражданской войны и на происходящее в мире грез. Сценарий построен таким образом, что зрителю остается предполагать самому, происходят ли фантастические события на самом деле или только в воображении персонажей.
Фильм открывается пересказом легенды о принцессе волшебной страны, которая сбежала в реальный мир и забыла о том, кто она такая. Но её отец-король по-прежнему ждёт, когда она вспомнит о нём и вернётся.
1944 год, Испания. Гражданская война фактически завершена, власть Франко утвердилась, немногие уцелевшие коммунисты мелкими партизанскими группами укрываются в горах. Для уничтожения партизан правительство отправляет небольшие карательные отряды, которые зачищают заросшие лесом горы или просто становятся на постой на фермах, не давая партизанам возможности получать помощь от сочувствующих крестьян.
Капитан Видаль и его отряд обосновались на старой мельнице и занимаются как охотой за местным партизанским отрядом, так и распределением продовольственных пайков и лекарств среди местных жителей. Капитан Видаль становится главным средоточием местной власти, он считает себя вправе убивать людей по малейшему подозрению в нелояльности.
По требованию Видаля в расположение его части приезжает его беременная жена Кармен и её дочь от первого брака Офелия. Отец Офелии, первый муж Кармен, умер во время войны. Девочка и отчим не выносят друг друга, но Видаль хочет сына и ради этого готов терпеть рядом с собой чужого ребёнка.
Гуляя в одиночестве, Офелия находит в лесу древний лабиринт, в центре которого её ждёт Фавн — древнее магическое существо. Фавн говорит Офелии, что на самом деле она принцесса волшебной страны, которая забыла о своем происхождении, но должна до полнолуния пройти через три испытания, чтобы вернуться к королю-отцу. Фавн даёт Офелии волшебную книгу, которая должна сообщить девочке о трёх испытаниях. Первое из этих испытаний — спасти древнее дерево, в корнях которого поселилась гигантская жаба. Офелия должна накормить жабу волшебными камешками и достать у неё из желудка золотой ключ. Волшебная книга также должна отвечать на любые её вопросы.
На следующий день на мельнице планируется вечеринка, во время которой капитан Видаль хочет представить свою жену местным влиятельным лицам. Офелию тоже готовят к этой вечеринке — Кармен даёт ей новое платье и новые башмаки. В них Офелия и отправляется к древней смоковнице, которую нужно спасти от жабы. Чтобы не испачкать платье, Офелия снимает его и оставляет на ветке, и пролезает в нору между корней дерева. Она справляется с заданием и выбирается наружу с ключом, но вся в грязи. Оказывается, ветер сбросил в грязь и её новое платье, и она не сможет в нём появиться на вечеринке. Кармен расстроена и наказывает девочку.
Капитан Видаль представляет гостям жену и даёт им понять, что придаёт очень большое значение скорому рождению своего сына. После вечеринки Офелия открывает волшебную книгу и спрашивает её о том, что происходит прямо сейчас. Страницы книги окрашиваются кровью, а в соседней комнате вскрикивает Кармен, у которой начинается сильное кровотечение. Видаль вызывает доктора Феррейро, тот даёт Кармен успокоительное и рекомендует переселить Офелию в другую спальню, чтобы она не тревожила мать.
Ночью к Офелии приходит Фавн и спрашивает, почему она не выполнила второе задание, ведь полнолуние уже близко. Девочка говорит о болезни матери. Тогда Фавн даёт ей волшебный корень мандрагоры, который нужно положить под кровать Кармен, и тогда она выздоровеет.
Второе задание заключается в том, что Офелия должна проникнуть в таинственное подземелье, где спит Бледный, открыть золотым ключом тайник и вернуться, пока не кончился песок в песочных часах. Фавн предупреждает Офелию, что Бледный — не совсем человек, и чтобы она ни в коем случае не брала со стола ничего из еды. Он также даёт ей в провожатые трёх фей. Офелия проникает в подземелье, открывает тайник и вынимает из него золотой кинжал. Возвращаясь, она всё-таки берёт со стола Бледного две виноградины. Бледный просыпается и нападает на Офелию. Феи пытаются её защитить, две из них погибают. Офелии едва удаётся убежать от Бледного.
Когда к Офелии приходит Фавн, она пытается оправдаться, но Фавн говорит, что она не справилась с заданием. Видимо, он всё-таки ошибся, и принцесса не она. Фавн исчезает, а Офелия остаётся лицом к лицу со страшной реальностью.
Капитан Видаль преследует партизан и едва не настигает их. В брошенном лагере он находит пакет с ампулами антибиотиков. Во время следующего рейда ему удаётся захватить одного из партизан живым. Капитан пытает его — не столько ради того, чтобы что-то выведать, сколько из чистого садизма. Через несколько часов он вызывает к пленному доктора Феррейро. Партизан просит доктора убить его. Пока Феррейро делает пленному смертельную инъекцию, капитан обнаруживает в аптечке доктора точно такие же антибиотики, какие нашёл в лесу. Доктор даже не пытается отпираться, и капитан убивает его.
Кармен становится значительно лучше. Офелия забирается к ней под кровать, чтобы проверить корень мандрагоры, но там её застаёт капитан. Кармен сжигает корень в очаге, и ей немедленно становится плохо. У неё начинаются роды. Местные женщины и фельдшер помогают ей рожать, но Кармен, родив мальчика, умирает.
После нападения партизан на склад с припасами капитан Видаль обнаруживает, что замок склада был не сломан, а открыт, хотя единственный ключ находится у него. Он начинает подозревать служанку Мерседес в связях с партизанами и намерен пытками добиться у неё признания. Однако, женщина серьёзно ранит капитана ножом, который хранила в складке своего фартука, и сбегает. За ней отправляется погоня, которая попадает в засаду, большая часть солдат убиты.
Когда Офелия, потерявшая мать, остаётся одна, снова появляется Фавн и даёт ей третье задание — она должна выкрасть у капитана Видаля своего новорожденного брата и принести его в лабиринт. Офелии удаётся подсыпать капитану снотворное и вынести младенца из дома, но Видаль преследует её. В лабиринте Фавн говорит Офелии, что задание выполнено и осталось только пролить кровь невинного, чтобы отворить врата в волшебную страну. Офелия отказывается отдать ему брата и Фавн исчезает. Появляется Видаль, отбирает у Офелии ребенка и стреляет ей в живот. На выходе из лабиринта его уже ждут Мерседес и партизаны, которые убивают Видаля, отняв у него сына.
Умирающей Офелии является Фавн, который говорит, что именно таково было последнее испытание — она должна была отказаться пожертвовать собственным братом. И теперь, когда Офелия свободна от смертного тела, врата волшебной страны открыты для неё, и она может встретиться с королём-отцом и королевой-матерью.