With temperatures hovering around the -10C mark, the encounter was a punishing one for both sets of players, but it was the Portuguese visitors who settled first as they took a 21st-minute lead through Maxi Pereira, after an error by Zenit goalkeeper Yuri Zhevnov.
Zenit, however, were not about to roll over in their first ever appearance in the knockout stage of the Champions League, and pulled level in the 27th minute through Shirokov’s well-executed volley before taking the lead after the break when Sergei Semak rounded off a brilliant team goal.
Benfica looked to have snatched a draw in the 87th minute when another Zhevnov howler allowed Oscar Cardozo to tap in from close range.
Just two minutes later, however, Benfica were caught dwelling on the ball at the back to allow Shirokov in for his fifth Champions League goal of the season and earn Zenit a lead to take to Lisbon.
ZENIT ST PETERSBURG: Zhevnov, Aniukov, Bruno Alves, Lombaerts, Hubocan, Denisov, Zyryanov, Shirokov (Semak 45), Kanunnikov (Bystrov 66), Kerzhakov, Faitzulin (Rosina 90).
BENFICA: Artur Moraes, Maxi Pereira, Luisao, Garay, Emerson, Matic, Witsel, Gaitan (Miguel Vitor 90), Cardozo, Bruno Cesar (Nolito 76), Rodrigo Moreno (Aimar 30).
Referee: Jonas Eriksson (Swe).