Leclerc fought single-handedly for victory at Ferrari's home race after team-mate Sebastian Vettel had a spin early on while running fourth.
Hamilton gave chase for more than 20 laps in the middle of the grand prix before Bottas took over Mercedes' attack at the end, but Leclerc kept both at bay to win again just seven days after claiming his maiden grand prix victory.
Leclerc kept Hamilton at arm's length through the first stint but came under attack after stopping one lap later than his pursuer – and taking hard tyres to the Mercedes driver's mediums.
Hamilton's earlier stop brought him out within striking distance of Leclerc straight away and two engaged in an ultra-intense cat-and-mouse chase for more than 20 laps.
During that time, Hamilton got close enough to launch two serious attacks.
First, on lap 23, Hamilton used a minor delay as Leclerc passed Nico Hulkenberg's Renault at Parabolica to force the youngster to defend into the first chicane.
Leclerc defended again into the chicane chicane but moved back across to the right, made light contact with Hamilton and forced his rival onto the run-off.
Leclerc was given a black-and-white flag warning for that move, and was perhaps fortunate to get away with what Hamilton described as "dangerous" driving on lap 36.
A small lock-up from Leclerc sent him over the run-off at the first chicane and gave Hamilton a run out of the corner.
As Hamilton looked to the outside through Curva Grande, Leclerc jinked to the left to block his path – leaving Hamilton vexed.
Over the next few laps Hamilton remained in close proximity but failed to launch another attack before locking his front left into the first chicane at the start of lap 42.
Hamilton took to the escape road, allowing Bottas through into second after the Finn had crept up to the lead two with his long first stint giving him an eight-lap offset on fresh tyres.
Bottas picked up the chase, three seconds adrift of Leclerc, and almost got within DRS range with six laps to go before losing a bit of time in the final sector.
His best chance came three laps from the end when he got to just half a second behind Leclerc, but Bottas ran deep into the first corner and dropped back.
Bottas got within DRS range again on the final lap, but made a small mistake at the second chicane and Leclerc won by 0.8s.
Hamilton finished a distant third after pitting for fresh tyres to set the fastest lap and score a bonus point, meaning his championship advantage over Bottas stands at 63 points.
While Leclerc held on to win his first Italian GP as a Ferrari driver, Vettel had a miserable race and finished outside of the points in 13th.
He ran fourth early on but spun after striking the kerb on the entrance to the Ascari chicane on lap six.
Vettel then rejoined the track while cars were flash past and clipped the Racing Point of Lance Stroll, who was seventh, into a spin.
Stroll got going again but rejoined as Pierre Gasly was exiting Ascari, which forced the Toro Rosso driver through the gravel.
Vettel received a 10-second stop-go penalty for his unsafe return to the track, the harshest possible penalty short of disqualification, while Stroll's was deemed slightly less severe and he was hit with a drive-through.
In the absence of Vettel – and also Max Verstappen, who started at the back following an engine change and had his race compromised by a first lap clash – Daniel Ricciardo clinched Renault's best result of the season in fourth.
Ricciardo had fallen behind teammate Hulkenberg in the early laps but quickly repassed his teammate and assumed fourth when Vettel spun.
He held a commanding advantage over Hulkenberg until the end of the race, while Hulkenberg held onto fifth ahead of Red Bull's Alex Albon to give Renault a massive haul of points.
Behind Albon, Sergio Perez benefitted from a well-timed virtual safety car around his pitstop window to finish seventh, despite starting 18th.
Verstappen made it back to eighth after stopping on lap one for a new front wing, having broken his when the field bunched up at the first corner.
Antonio Giovinazzi scored points in his home race in ninth, while Lando Norris completed the top 10 having started 16th.
Three drivers retired from the grand prix, two shortly after making their pitstops.
Carlos Sainz lost a likely strong points finish when his McLaren's front right wheel was not attached properly at his pitstop.
Daniil Kvyat, also running well inside the top 10, pulled his smokey Toro Rosso to a halt exiting the first chicane after his own stop.
Kevin Magnussen was the final retiree. He had already dropped out of the points when he locked up at Turn 1 and took to the run-off.