The Bianconeri had suffered consecutive domestic defeats but Dybala's first-half finish edged them ahead before Leonardo Bonucci's own goal.
Dybala restored the hosts' lead in contentious fashion after the break. The Argentina international dragged a first penalty wide but converted after a retake was ordered, with goalkeeper Stanislav Kritsyuk adjudged to be off his line.
Federico Chiesa then scored for a fourth consecutive home game in the competition and Alvaro Morata got in on the act as Massimiliano Allegri's men maintained their perfect record in Group H and claimed their spot in the knockout stages.
Sardar Azmoun's late strike was too little, too late for third-placed Zenit at Allianz Stadium.
Dybala drilled against the post from outside the area in the opening stages but the forward was on target after 11 minutes, capitalising on a loose clearance to steer a left-footed strike into the top-right corner.
The lively Dybala then set up a chance for Morata, who blasted over, and that miss proved costly when Bonucci looped a header into his own net following Vyacheslav Karavaev's cross.
Juve had a goal from Morata ruled out for offside on the stroke of half-time and the lively Dybala whipped narrowly wide after the interval, but Juve did not have to wait much longer to regain the lead.
Claudinho's foul on Chiesa gave them a penalty, which Dybala skewed wide before rolling into the bottom-right corner with a retake after Kristyuk had moved too early.
Wojciech Szczesny pushed away from Malcom as Zenit attempted to respond, while Weston McKennie fired against the crossbar at the other end.
Chiesa added a third when he latched onto Federico Bernardeschi's throughball and drilled into the right-hand corner before Morata sealed the victory with a low finish following Dybala's pass.
Azmoun poked home a late second for Zenit, but that could not stop Allegri's side from coasting through.