Mattia de Sciglio medgav straffet i 95: e minuten med en handboll, bara några minuter efter lagkamrat Jose Sosa skickades iväg för ett andra gult kort.
Medhi Benatia hade gett Juventus ledningen på 30 minuter, innan Carlos Bacca utjämnade två minuter före halvtid.
Andraplats Roma, som har ett spel i handen, spela Palermo på söndag.
Juventus, som är på rätt spår för sin sjätte på varandra följande Scudetto, har vunnit 31 på varandra följande Serie A hemmamatcher.
Värdarna, som förlorade till Milano i både ligan och den italienska Super Cup finalen tidigare under säsongen, hade dominerat de tidiga utbytena, med Marko Pjaca och Dybala hålla Gianluigi Donnarumma upptagen i Rossoneri mål.
Juve tog välförtjänt ledningen när Dani Alves flisade bollen till den äventyrliga center-back Benatia som kontrollerade den på bröstet och slog hans skott förbi Donnarumma från nära håll.
Milan slog tillbaka mot loppet av spelet, som Gerard Deulofeu kontra-attack upp den vänstra vingen och spelade i Bacca som puffade bollen bortom Gianluigi Buffon för att utjämna på 43 minuter.
Rossoneri växte in i spelet i den andra halvan men det var Juventus som hade bättre chanser med Sami Khedira, Miralem Pjanic och Pjaca kommer nära.
De sista stunderna visade sig vara de mest spännande när första Sosa såg rött på 93:e minuten för en dålig tackling på Kwadwo Asamoah.
Två minuter senare Gonzalo Higuains cykelspark var inches bred och han såg sedan en annan skott tipsade bort av Donnarumma.
Sedan kom De Sciglio handboll och Dybala höll modet att sätta hans straff förbi 18-åriga Donnarumma att starta vilda fester.
Matchändar, Juventus 2, Milano 1.
Andra halvlek, Juventus 2, Milano 1.
Mål!  Juventus 2, Milano 1. Paulo Dybala (Juventus) konverterar straffet med en vänster fotad skott till övre vänstra hörnet.
Straff medgavs av Mattia De Sciglio (Milan) med en handboll i straffområdet.
Försöket räddades. Gonzalo Higuaín (Juventus) höger fotad skott från mitten av lådan sparas i mitten av målet. Hjälpt av Dani Alves.
Försök missade. Gonzalo Higuaín (Juventus) höger fotade skott från mitten av lådan är nära, men missar till vänster. Hjälpt av Leonardo Bonucci med ett kors.
Andra gula kortet till José Sosa (Milan) för en dålig foul.
Kwadwo Asamoah (Juventus) vinner en frispark på vänsterflygeln.
Foul av José Sosa (Milan).
Substitution, Milano. Leonel Vangioni ersätter Lucas Ocampos.
Försök missade. Miralem Pjanic (Juventus) höger fotade skott från utsidan boxen är för hög från en direkt frispark.
Ersättning, Juventus. Moise Kean ersätter Marko Pjaca.
José Sosa (Milan) visas det gula kortet för en dålig foul.
Paulo Dybala (Juventus) vinner en frispark i anfallshalvan.
Foul av José Sosa (Milan).
Sami Khedira (Juventus) visas det gula kortet för en dålig foul.
Foul av Sami Khedira (Juventus).
Andrea Bertoacci (Milan) vinner en frispark i anfallshalvan.
Paulo Dybala (Juventus) vinner en frispark i anfallshalvan.
Foul av Andrea Bertoacci (Milan).
Försök blockerat. José Sosa (Milan) höger fotade skott från utsidan boxen är blockerad.
Foul av Leonardo Bonucci (Juventus).
Lucas Ocampos (Milan) vinner en frispark i anfallshalvan.
Stephan Lichtsteiner (Juventus) vinner en frispark på högerkanten.
Foul av Gerard Deulofeu (Milan).
Hörnet, Milano. Sammankallad av Leonardo Bonucci.
Ersättning, Juventus. Daniele Rugani ersätter Medhi Benatia.
Miralem Pjanic (Juventus) visas det gula kortet.
Foul av Gonzalo Higuaín (Juventus).
José Sosa (Milan) vinner en frispark i den defensiva halvan.
Försök missade. Andrea Poli (Milan) höger fotade skott från höger sida av lådan är för hög. Hjälpt av José Sosa.
Försöket räddades. José Sosa (Milan) höger fotade skott från utsidan boxen sparas i nedre högra hörnet.
Försök missade. Leonardo Bonucci (Juventus) huvud från mitten av lådan är för högt. Hjälpt av Paulo Dybala med ett kors som följer ett hörn.
Hörnet, Juventus. Förföljd av Gianluigi Donnarumma.
Försöket räddades. Gonzalo Higuaín (Juventus) höger fotad skott från mitten av lådan sparas i nedre högra hörnet.
Försöket räddades. Sami Khedira (Juventus) höger fotade skott från höger sida av lådan sparas i mitten av målet. Hjälpt av Paulo Dybala.
Stephan Lichtsteiner (Juventus) vinner en frispark på högerkanten.
Foul av Andrea Bertoacci (Milan).
Substitution, Milano. Andrea Poli ersätter Mario Pasalic.
Försök missade. Lucas Ocampos (Milan) vänster fotade skott utanför lådan missar till vänster. Hjälpt av Andrea Bertoacci.
Paulo Dybala gjorde en 97-minuters straff för att ge Juventus en dramatisk seger över AC Milan och utöka sin ledning på toppen av Serie A till 11 poäng.