The Madrid club also went into the match having lost their only two previous European encounters at home to Russian opposition, and although they struggled to create chances, Miranda headed them into a first-half lead.
His fellow Brazilian, Hulk, equalised in the second half with a brilliant long-range strike, but Arda Turan and substitute Leo Baptistao ensured that the Spanish side began Group G with a win.
Atletico boss Diego Simeone made four changes from the weekend win over Almeria, but the absence of the suspended Diego Costa was a major blow.
Adrian Lopez replaced him while Arda, Miranda and Mario Suarez came in for Tiago, Jose Maria Gimenez and Raul Garcia.
Zenit also picked up a domestic win in their last fixture against Terek Grozny, and four of those involved missed out in Madrid. Alexander Anyukov, Roman Shirokov, Viktor Faizulin and Andrey Arshavin dropped out with Nicolas Lombaerts, Cristian Ansaldi, Konstantin Zyryanov and Hulk coming in.
After a cagey start, Atletico did eventually carve open the Zenit defence in the 27th minute when Koke poked wide from near the penalty spot after a determined run by Suarez.
Simeone’s men gradually took control of the match but genuine chances were at a premium as the Zenit defence held firm. The visitors did, however, switch off before half-time and Atletico made them pay.
Koke fired in a powerful 40th-minute corner from the right and Miranda met it at the near post, heading past the helpless Yuri Lodigin.
The visitors were vastly improved in the second half and after a quick passing move in the 58th minute, Hulk ran at the Atletico defence and fired a powerful shot into the roof of the net from outside the area.
Zenit went close again just after the hour mark as Aleksander Kerzhakov saw a free-kick come back off the crossbar and Atletico responded by retaking the lead almost immediately.
The Russians failed to clear an Atletico free-kick and after Miranda and Koke had seen shots blocked, Arda stroked the ball past Lodigin to restore their lead.
Despite Zenit’s improvement, they were powerless to resist Atletico and Simeone’s side scored their third of the night through substitute Baptistao with 10 minutes left.
Arda played a throughball into the area for Baptistao and the young Brazilian calmly placed a shot into the bottom corner.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.