Wayne Parnell's 3-16 set up the victory on Saturday after the Proteas had started the tournament sluggishly in losing to the host and Bangladesh.
Opener Richard Levi bashed 54 off 30 balls with four fours and four sixes to lead South Africa to 130-4, past Zimbabwe's 124-6 with 14 balls to spare.
Parnell bowled with outstanding control and Zimbabwe needed Graeme Cremer's 36 not out from the lower order to move past 100 after being 60-5.
Levi opened South Africa's response with typical aggression and Farhaan Behardien finished with an unbeaten 19 as South Africa edged out Bangladesh for a spot in the final.