Both came through tense Last 4 matches but can now look forward to a chance at lifting the trophy during Friday’s decider at the Moses Mabhida Stadium.
South Africa sealed their berth with a come-from-behind 1-1 draw with Uganda, before they triumphed 4-2 on post-match penalties. The home side had exited in the Cup quarterfinals via spot-kicks on Sunday, but this time lady luck was in their favour as they held their nerve to claim the win.
After a goalless first half, Uganda hit the front thanks to a fine strike from Dan Serunkuma seconds after the break.
Uganda might have added a second goal but for two excellent saves from South Africa goalkeeper Mondlo Mpoto.
But from then on it was all pressure from the home side as Jamie Webber went close with a headed chance before Luther Singh beat the offside trap and crashed the ball into the back of the net.
Debutant Kgaogelo Sekgota had a superb chance to win it for the South Africans right at the death, but could not beat Uganda keeper Charles Lukwago in a one-on-one situation.
The match went to penalties and after Mustafa Kizza missed from the spot for the second time in the tournament, and Muzamiru Mutyaba followed suit, the game was up for the East Africans.
Malawi scored late on to seal their final place in what was another excellent contest in front of exuberant fans.
Gerald Phit Jnr came close to giving Malawi the lead midway through the first half when his free-kick from 35-yards thundered back off the post and was cleared to safety by a scrambling Comoros defence.
Malawi did take the lead just before the half-hour mark as Richard Mbulu’s looping header floated into the back of the net from John Banda’s cross.
Ali Nissam equalised just past the hour-mark for Comoros and the game looked to be heading for penalties before Chikoti Chirwa popped up late to fire The Flames into the final.
There will be two massive Cup semi-final matches on Wednesday, 6 June as the action shifts to the magnificent Moses Mabhida Stadium.
The first sees Lesotho take on Botswana at 17h00 (15h00 GMT) with both sides feeling they will be in with a great chance of making the final.
Lesotho have not reached the COSAFA Cup decider since 2000, when they lost to Zimbabwe, but did finish third last year and are a side on the up.
Botswana’s one and only final appearance was in 2016 when they narrowly lost 3-2 to South Africa in Windhoek.
The two previous meetings between the sides in the competition were both spectacular, though for different reasons.
The teams first played to a 0-0 draw in Maseru in 2004, which ended up going to penalties. Botswana eventually triumphed 11-10 in an epic shoot-out.
Their second encounter six years ago finished in a thrilling 3-3 draw, a game in which Botswana forward Jerome Ramatlhakwane scored a hat-trick.
Botswana led 2-0, but were pegged back to 2-2, before leading again. However, Thapelo Tale netted a Lesotho equaliser deep into injury-time at the end of the game.
The second semi-final sees Zimbabwe take on Zambia (19h30 local; 17h30 GMT) in a repeat of the last two COSAFA Cup deciders, both of which were won by the Warriors.
It promises to be an epic encounter with no love lost between these old foes and is the ninth time these two nations have clashed in the COSAFA Cup, with their previous four meetings in 2009, 2013, 2017 and 2018 all coming in the final.
There have been 16 goals scored in the last four encounters along, which comes after a period where there were only two goals in the four games prior to that.
Zimbabwe have brought their full squad to the tournament up to the semi-final stage, while Zambia have more of a locally-based selection, which would suggest they start as underdogs.
The winners of the two semi-finals will clash in Saturday’s final at the same venue, while the losers will play for bronze on Friday.
Uganda 1 (Serunkuma 46’) South Africa 1 (Singh 70’) – S Africa won 4-2 on pens
Comoros 1 (Nassim 61’) Malawi 2 (Mbulu 30’, Chirwa 90’)
Lesotho vs Botswana (KO 17h00; 15h00 GMT) – Moses Mabhida Stadium
Zimbabwe vs Zambia (KO 19h30; 17h30 GMT) – Moses Mabhida Stadium
Matches Played: 15
Goals scored: 40
Biggest victory: Malawi 3 Seychelles 0 (Group B, May 26)
Most goals in a game: 4
Eswatini 2 Mauritius 2 (Group A, May 25)
Eswatini 2 Comoros 2 (Group A, May 27)
South Africa 2 Botswana 2 (Quarterfinals, June 2)
Zambia 2 Malawi 2 (Quarterfinals, June 2)
3 goals – Gabadinho Mhango (Malawi), Ashley Nazira (Mauritius), Gerald Phiri Jnr (Malawi)
2 – Felix Badenhorst (Eswatini), Issaskar Gurirab (Namibia), Youssouf Ibroihim (Comoros), Richard Mbulu (Malawi), Luther Singh (South Africa)
1 – Khama Billiat (Zimbabwe),Emmanuel Chabula (Zambia), Chikoti Chirwa (Malawi), Thatayaone Ditlhokwe (Botswana),Lebogang Ditsele (Botswana),Charles Hambira (Namibia),Soulaimana Ibouniyamine (Comoros), Jeituso (Mozambique), Hassan Kajoke (Malawi), Ali Nassim (Comoros), Absalom Iimbondi (Namibia), Joslin Kamatuka (Namibia), Grant Margeman (South Africa), Siboniso Mamba (Eswatini), Austin Muwowo (Zambia), Sabelo Ndzinisa (Eswatini), Boina Bacar Raidou (Comoros), Evans Rusike (Zimbabwe), Dan Serunkuma (Uganda), Sadney Urikhob (Namibia), Witi (Mozambique)