Atletico had already qualified from Group G but Zenit failed to take advantage and second place is still up for grabs between the Russians and FC Porto.
While Zenit enjoyed the lion's share of possession, Atletico were clinical, Adrian pouncing to put them ahead in the 53rd minute.
However, a fluke goal when highly-rated goalkeeper Thibaut Courtois completely miscalculated a straightforward tip-over from Toby Alderweireld's defensive header saved Zenit in the 74th minute.
Atletico kept the ball well in the early stages and had the first on-target effort of the game, Fernandez Gabi unleashing a shot from the edge of the area which was always rising.
Zenit, though, began to enjoy more possession and almost went ahead in the 14th minute when Hulk unleashed a sledgehammer of a shot which forced Courtois to parry the ball, which the defence lashed away.
The Brazilian then sent in an inswinging ball from the right which evaded everyone before Igor Smolnikov was played in on the right of the box but he squandered being well-placed when he failed to find any of his team-mates.
However, the hosts breathed a sigh of relief after half an hour when Cristian Rodriguez went through two defenders into the area to be met by the onrushing Yuri Lodigin, the ball rebounding off the keeper into the midfielder and out for a goal kick.
Zenit were having a steady stream of attacks but their final ball left something to be desired and they were met by a wave of Atletico defenders.
Atletico almost went ahead in the final minute of the first half when Lodigin had to go down to his left to deny Jorge Koke's volley.
Both teams had a good chance at the start of the second half. Hulk fired a fierce shot straight at the keeper which was parried away when a yard either side and a goal would have been the most likely outcome.
However, directly from that attack Atletico broke and Rodriguez found himself one-on-one with the goalkeeper only to be dispossessed by a retreating defender at the last minute.
The hosts appeared to be panicking when they got into the area, Alexander Kerzhakov denied by the keeper, and Atletico took full advantage.
Zenit were caught too far up the field and Adrian ran on to the ball on the left near the halfway line, drove into the area and slotted the ball between the keeper's legs.
Raul Garcia then attempted to chip the keeper only for the ball to hit the top of the bar and bounce over.
Hulk was at the centre of all of Zenit's attacks but the team were tentative on the ball, requiring one too many passes rather than attempt a shot on goal.
Good fortune smiled on the Russian side with a little over quarter of an hour remaining.
Smolnikov's cross from the right came off the head of Atletico defender Alderweireld but when keeper Courtois went to tip the ball over, he miscalculated, missing the ball as it dropped into the net.