The four-time world champion jumped a furious Leclerc in the only round of pit stops to take to the top step of the podium for the first time since last year's Belgian Grand Prix in August.
Max Verstappen finished third for Red Bull with Lewis Hamilton only fourth.
Hamilton had been in contention for victory at the Marina Bay Street Circuit, but a poor strategy by his Mercedes team ensured the championship leader dropped two places.
Hamilton, however, extends his title lead over team-mate Valtteri Bottas to 65 points with just six rounds remaining. Bottas finished fifth ahead of Red Bull's Alex Albon.
Leclerc, 21, had looked on course to win for a third time in as many appearances after controlling the opening third of the 61-lap race from pole position.
But the race turned on its head when Ferrari stopped Vettel for tyres first. Leclerc came in a lap later, but Vettel had taken advantage of his new rubber to leapfrog his team-mate.
Naturally, the move by Ferrari angered Leclerc. "To be completely honest with you I don't understand the undercut," he moaned over the radio. "We will discuss after the race," Leclerc added.
Over at Mercedes, the world champions decided to keep Hamilton on track as their rivals changed tyres, but the 34-year-old was rapidly losing time on worn rubber.
Hamilton was soon in no-man's land, and when he did eventually stop, six laps later than Leclerc and seven laps later than Vettel, the Briton re-joined the race behind both Ferrari cars and Verstappen, too. Indeed, Hamilton only stayed ahead of Bottas for fourth position after Mercedes ordered the Finn to slow down.
The spectacular night race is notorious for safety cars, and there were three here, the first of which entered the action following George Russell's coming together with Romain Grosjean on lap 35.
Four laps after the action resumed, the safety car was back on track when Sergio Perez's broken-down Racing Point had to be cleared from danger.
Leclerc was also back on the radio to protest Ferrari's decision to stop Vettel first. "I won't do anything stupid," he said. "But I just think it is unfair."
A third safety car period ensued when Kimi Raikkonen and Daniil Kvyat collided at the first corner in the closing stages.
But despite the drama around him Vettel kept his cool to bounce back from his horror show in Monza to end his barren run and claim the 53rd win of his career.
His Ferrari team celebrated three consecutive victories for the first time in 11 years. British teenager Lando Norris finished seventh for McLaren.