Gift Motupa netted in the first half and Mario Booysen added a second after the break before Martin Phiri cut the lead in half.
Tercious Malepe was sent off late on and Zambia capitalised by scoring through Justin Shonga.
The hosts lived dangerously in the opening stages and were relieved to clear after a goalmouth scramble almost resulted in a goal for Zambia.
On the quarter-hour mark Motupa saw his low drive well held whilst at the other end Justin Shonga headed straight at Bruce Bvuma.
Motupa was in the thick of things again later in the half, stinging the palms of the goalkeeper from a cleverly worked free-kick.
Moments later the 22-year-old finally had his goal as he stabbed home from close range following a 32nd minute corner.
In first-half stoppage time Motupa got in behind the defence and cut back for Ryan Moon to have a shot but the striker had his effort blocked at his feet.
Five minutes out of the break Wiseman Meyiwa played a beautiful pass over the top and Motupa arrowed his shot towards goal only to see it saved.
It wasn't long before the home side extended their lead as Booysen slammed home a Dumisani Zuma corner after seeing an initial effort blocked.
Chipolopolo cut South Africa's advantage in half in the 59th minute as substitute Phiri put the ball in the net via a header.
Malepe was sent off late into proceedings after picking up a second yellow card for a body check and it cost the hosts dearly.
Short at the back they allowed Shonga to score in the dying minutes of extra time with a neat strike.
South Africa: Bvuma, Mbekile, Malepe, Booysen, Mthethwa, Kumalo (Meyiwa 24'), Shongwe, Webber, Moon, Zuma, Motupa
Zambia: Nsabata, Chama, Kapumbu, Siamujompa, Tembo, Malama, Mbewe, Jack, Shonga, Chingandu, Mulenga.