Stephan Lichtsteiner gave the visitors the lead after the break when he tapped home a low cross from Alex Sandro.
However, Mauro Icardi equalised for the hosts just two minutes later with a header from a corner.
Substitute Ivan Perisic headed Inter in front after fine work from Icardi, and Juve – with Gonzalo Higuain on from the bench – could not find an equaliser, despite Ever Banega’s late red card.
The result was only Juve’s second Serie A defeat since they lost 1-0 to Sassuolo on 28 October, 2015.
The loss means the champions slip to second, behind Napoli, while Inter move up to sixth.
Inter buy De Boer time
Frank de Boer only replaced Roberto Mancini in the summer but there were rumours that defeat on Sunday could have seen the Dutchman removed from his position as Inter boss.
The Nerazzurri were embarrassed 2-0 at home by Hapoel Be’er Sheva in the Europa League on Thursday, a result that prompted the former Ajax boss to apologise to fans and claim his side “lost their heads”.
His position looked even more precarious when Switzerland international Lichtsteiner gave Juve an undeserved lead with 65 minutes on the clock.
However, Icardi powered home a fine header for his fourth league goal of the season and then showed great composure to pick out Perisic with a cross with the outside of his foot after rounding goalkeeper Gianluigi Buffon.
Champions below par
It was a generally disappointing performance by the Turin side, champions in each of the past five seasons.
They had a great chance to take the lead in the first half when Sami Khedira headed straight at Samir Handanovic from six yards.
Higuain, the £75.3m summer signing from Napoli, was brought on with the scores at 1-1 but the Argentine’s only chance saw him glance a header narrowly off target from a Sandro cross.
Inter forward Banega was sent off in the final minute for picking up a second booking but despite piling men forward Juve could not find a leveller in injury time.