Zambia put Bafana under pressure early in the first half, and they had the first sight of goal inside the opening 10 minutes when Makuka Mulenga stormed into the Bafana penalty box, but he shot wide.
Bafana responded well and used Lebogang Manyama’s pace down on the left, but the Zambians often dealt with him easily.
Bafana failed to deal with the cross just after the 20th minute, but Buhle Mkhwanazi recovered well in time to block Bornwell Mwape’s shot from inside the box.
South Africa relied on counter-attacking football as they had all 11 players in their own half, but the hosts couldn’t get past Bafana’s back four.
After a lively start, the game was developing into a cagey contest as we approached half time, and neither of the two sides looked like scoring.
Zambia though should have broken the deadlock on the stroke of half time, but they squandered two opportunities; one from the free-kick.
The Zambians picked up where they left off in the first half, and they won a free-kick outside the box in the 3rd minute of the second half, but Wayne Sandilands dived to his left to concede a corner.
The Bafana defence looked vulnerable at times and Tshepo Gumede was booked in the 56th minute for bringing Festus Mbewe down on the edge of the box, only for Mwape to blast the resultant free-kick over the bar.
Bafana came close on the hour mark, but Ruzaigh Gamildien failed to keep his effort down as his shot sailed over the bar after the ball had initially hit the upright.
Both teams continued to push each other, but struggled with possession as the majority of the players started showing signs of fatigue with less than 15 minutes remaining.
Zambia started taking shots from long range as the South African side continued to frustrate them, but the visitors didn’t look like scoring either.
Bafana were again unfortunate in the 81st minute after Lerato Chabangu’s tap-in came off the upright from Manyama’s well played cross.
Kondwani Mtonga then gave Bafana something to worry about with five minutes remaining when his shot came off the upright for a corner.
Chipolopolo came close to stealing the victory in the dying embers of the game from a free-kick, but Sandilands had an important touch and palmed for a corner as both teams had to go into extra time.
The first half of extra time had little action in front of goal, but Mwape did threaten inside the first five minutes, although his shot was nowhere near the target.
Manyama got a chance to get his shot on target in the near side, but he couldn't keep his head down as he failed to trouble the Zambian keeper Danny Munyau.
Both teams looked to be thinking about penalties in the second half of extra time as they played long balls forward without creating chances.
Bafana packed their backline and tightly defended every ball that was played inside the box by the Zambians with Thulani Hlatshwayo and Gumede combining well.
Substitute Mzikayise Mashaba had a chance from an awkward angle and he did well to force a save out of Munyau who parried for a corner.
No team was willing to score and the outcome of the game had to be decided on penalties.
Alex N’gonga was the first to convert and gave Zambia an advantage, but Thulani Hlatshwayo made it 1-1, sending the keeper the wrong way.
Mwape then took the second spot-kick and made no mistake to restore Zambia’s advantage.
Manyama slotted home to make it 2-2, before Phiri sent Sandilands the wrong way.
Lerato Chabangu’s penalty was well saved by Munyau, and Ntonga ensured their lead by making it 4-2.
With Zambia needing a goal to book their place in the final, Mashaba made it 4-3, but Chama converted to make it 5-3.