Zenit closed the gap on leaders CSKA to four points with five games remaining after they were held to a 2-2 draw by bitter city rivals Spartak in a heated Moscow derby, watched by almost 70,000 passionate fans at the Luzhniki stadium.
CSKA came back from two goals down to snatch a point with the help of a disputed last-minute penalty.
Ireland winger Aiden McGeady put Spartak ahead late in the first half, then assisted on the second by Brazilian Ari seconds after the re-start.
McGeady's goal was the first conceded by CSKA keeper Igor Akinfeyev after keeping a clean in five previous league matches.
CSKA's chances looked all but over after Spartak keeper Andriy Dykan saved a Vagner Love penalty midway through the second half, but Nigerian striker Ahmed Musa pulled one back 17 minutes from time, setting the stage for a dramatic finale.
With time running out, Russia international Alan Dzagoyev converted CSKA's second spot-kick after Spartak defender Marek Suchy was harshly adjudged to have fouled Vagner in the box.
Spartak playmaker Rafael Carioca was sent off for misconduct just before the final whistle and referee Sergei Karasev also booked nine other players during the heated encounter.
"For us this draw worth more than many of our victories," CSKA coach Leonid Slutsky told Russian television NTV Plus.
"The way it was achieved, fighting to the very end. I have nothing but praise for my players."
Spartak had a different view. "We were robbed. I almost cried in the end," an emotional Dykan told reporters.
Spartak coach Valery Karpin, who confronted Karasev after the match, said: "I just wanted to get some answers from him but he didn't give me any explanation."
Elsewhere, big-spending Anzhi Makhachkala also squandered a two-goal lead and had to settle for a 3-3 home draw with Dynamo Moscow to stay 10 points off the pace.
Dynamo's Ecuador international Christian Noboa opened the scoring in the 35th minute but Anzhi equalised minutes later thanks to Morocco midfielder Mbark Boussoufa, who was sent off for a second yellow early in the second half.
Despite being reduced to 10 men Guus Hiddink's team went 3-1 ahead through Cameroon striker Samuel Eto'o and Russia winger Yuri Zhirkov before Alan Gatagov and Kevin Kuranyi scored in the last 15 minutes to salvage a point for the visitors.
In St Petersburg, Zenit, missing injured Brazil striker Hulk, had trouble breaking Krasnodar's tight defence before Portugal winger Danny struck deep in stoppage time to secure the points for the home team, who also lost leading scorer Alexander Kerzhakov with a muscle strain late in the first half.