Zenit miss chance to clinch Russian title
Big-spending Zenit, backed by Russian energy giant Gazprom, had been heavy favourites to secure their third league crown and the second in the last three years, needing only a draw at their home fortress, the Petrovsky stadium in St Petersburg.
But the visitors failed to read the script as they went two up after 34 minutes, Brazilian forward Vagner Love scoring the first with a long-range strike into the top corner before creating the second for Chile winger Mark Gonzalez.
CSKA's Ivory Coast striker Seydou Doumbia added a third midway through the second half before Zenit's Italian midfielder Alessandro Rosina scored a consolation goal in added time.
CSKA moved ahead of champions Rubin Kazan into second place, six points adrift of Zenit with three games remaining in the season.
It was only the second league defeat for Zenit and their Italian coach Luciano Spalletti, two weeks after they went down 1-0 to Spartak Moscow.
Wednesday's match had been postponed from August to ease a congested fixture schedule for Zenit, who were involved in the Champions League qualifiers.
"The whole team is very disappointed because we wanted our fans to really enjoy this occasion," Spalletti told reporters.
"But CSKA are a very strong team and they took full advantage of our weaknesses. But we must quickly forget today's defeat and move on. We'll soon get another chance to take the title."
Spalletti, who guided his club to the Russian Cup in May, could seal a league and cup double in his first season in St Petersburg on Sunday when Zenit host mid-table Rostov.