Sergei Milinkovic-Savic and Felipe Caicedo's second half strikes subjected Juventus to their first defeat of the season and lift the Rome club to third place in Serie A.
Cristiano Ronaldo opened the scoring for Juventus in the 25th minute when he finished off a glorious one-two with Rodrigo Bentancur, before Luiz Felipe's header on the stroke of half time levelled things up.
Juan Cuadrado was sent off in the 69th minute for a professional foul, the referee originally ruled it to be a yellow card but it was overturned with the help of VAR.
More to follow.
LINEUPS, MATCH FACTS AND PLAYER RATINGS
Lazio (3-5-1-1): Strakosha, Acerbi, Luiz Felipe, Radu, Lazzari, Milinkovic-Savic, Lucas, Luis Alberto, Lulic (c), Correa, Immobile
Subs not used: Quissanga, Parolo, Caicedo, Menéndez, Guerrieri, Proto, André, Cataldi, Silva, Vavro
Goals: Luiz Felipe (45+1), Milinkovic-Savic (74), Caicedo (90+5)
Juventus (4-3-1-2): Szczesny, Cuadrado, Bonucci (c), de Ligt, Sandro, Bentancur, Pjanic, Matuidi, Bernarderschi, Dybala, Ronaldo
Subs not used: De Sciglio, Danilo, Higuaín, Can, Rugani, Rabiot, Demiral, Pinsoglio, Buffon, Pjaca, Muratore, Portanova
Goals: Ronaldo (25)
Booked: Dybala (36)
Sent off: Cuadrado (69)
Sergei Milinkovic-Savic scored a second half goal to secure a stunning victory for Lazio
Cristiano Ronaldo opened the scoring after converting Rodrigo Bentancur's low cross
Ronaldo does his trademark celebration after scoring for Juventus in the 25th minute
Luiz Felipe headed home to equalise for Lazio just before half time
Luiz Felipe celebrates after equalising for Lazio in the top-of-the-table clash with Juventus