Shirokov double spells trouble for Benfica
The central midfielder, who netted a double against Porto in the group stage in September, scored in the 27th minute shortly after Maxi Pereira had put the visitors ahead following a free-kick, then snatched victory two minutes from time.
Substitute Sergei Semak had fired the hosts in front midway through the second half with a neat back-heel before Oscar Cardozo levelled for 2-2, setting the stage for Shirokov's late winner.
With next month's second leg still to play, Shirokov hoped to wreak further damage on the Portuguese.
"I hope I'm not finished yet," the outspoken Russia international said when asked if he had become something of a bogeyman for Portuguese teams.
"I think I have a few more [goals] left in me."
With temperatures falling well below freezing, both teams struggled to adapt to difficult conditions and the hard pitch.
The visitors struck first, Uruguayan defender Pereira slotting home from close range in the 20th minute when Zenit keeper Yuri Zhevnov, playing in his first Champions League game, could not hold on to the ball following a free-kick by Cardozo.
Despite missing several key players, including first-choice goalkeeper Vyacheslav Malafeyev and Portugal midfielder Danny, Zenit pressed forward and seven minutes later Shirokov struck a low volley into the far corner to make it 1-1.
With 19 minutes left to play, home fans were celebrating when the hosts got themselves ahead.
The 35-year-old Semak, with his back to the goal, flicked the ball into the net for his first goal in European competition since scoring in a Europa League match against Swiss side Young Boys Berne last February.
An opportunistic strike by Cardozo on 87 minutes had given Benfica hope of the match ending in a draw before the return leg in Lisbon but Shirokov had the last word a minute later.
The winner was Shirokov's fifth goal in the competition and came after he had also scored twice in a 3-1 home victory over Portuguese champions Porto in a Group G match in September.
"It was a very difficult game for both teams and also very emotional," Zenit coach Luciano Spalletti told reporters.
"We showed great heart, snatching victory at the very end," added the Italian, who last week committed his long-term future to Zenit by extending his contract with the wealthy club which is backed by Russian energy giant Gazprom, until 2015.
His Benfica counterpart Jorge Jesus blamed cold weather and a shabby pitch for his team's problems.
"It was tough, the pitch had no grass and we had to play on a patch of dirt. Also our defence didn't do well, that's why we gave up three goals tonight," he said.
"Still, the tie is not over yet. I believe everything will be decided in Lisbon."