A double from Roman Shirokov stole the show for the hosts, who will not look kindly on keeper Yuri Zhevnov for two errors that cost them a pair of precious away goals
Maxi Pereira opened the scoring for the visitors 20 minutes in, but a pair of well-taken goals in either half from Roman Shirokov and Sergey Semak gave the hosts the advantage.
A late equaliser from Oscar Cardozo appeared to restore parity for the second leg, but Shirokov rounded off his double with two minutes to go to send the tie to Lisbon on a knife’s edge.
Conditions were well below freezing, and with the home side playing their first competitive match in two months, it was no surprise that the first half unfolded in fits and starts with both teams struggling to establish a rhythm.
Perhaps befitting the disjointed tone of the opening exchanges, it was a scrappy goal from Benfica that broke the deadlock after 20 minutes. A free kick by Cardozo was fumbled by Yuri Zhevnov, which gave Pereira an empty net to poke home the rebound.
Zenit were not fazed by the setback, and went on the offensive moments later through Aleksandr Kerzhakov, who forced Artur to block his effort from a corner at the near post.
However, the Benfica keeper could do nothing about the equaliser in the 28th minute, after an inviting cross by Tomas Hubocan was volleyed superbly by Shirokov into the bottom corner.
Neither side was able to maintain the momentum for long, the match slowly settling into a lull as the first half drew to a close. Things did not get much better after the interval, with both sides remaining content to err on the side of caution as the second period progressed.
Cardozo was belatedly able to spark things into life in the 69th minute after he managed to squeeze a shot towards goal, which forced Zhevnov into an awkward scrambling save.
However two minutes later, Zenit took the lead for the first time after another well-worked goal.
Kerzhakov raced down the right to hook the ball towards Vladimir Bystrov, and his low cross found fellow substitute Semak, who turned the ball home with a clever flick. It was a neat move, and the Russians were perhaps deserving of the advantage at that stage.
Kerzhakov was at it again a few minutes later after he was found in space inside the area, but the forward elected to blast the ball into the side netting instead of cutting back towards one of his better placed team-mates.
Then, with three minutes to go, Benfica grabbed an equaliser through Cardozo after another fumble by Zhevnov allowed the Paraguayan the simplest of finishes from barely a yard out.
The drama was not done, though. Zenit regained the lead a minute later after a failed clearance by Pereira and a spill by Artur allowed Shirokov an open goal to give the Russian outfit a slender advantage heading into the second leg, which takes place on March 6 in Lisbon.