Elliott smashed Dale Steyn into the stands as the South African native hit an undefeated 84 to earn the Black Caps a place in Sunday's title match in Melbourne where New Zealand will face either Australia or defending champions India.
Brendon McCullum made a 26-ball 59 and Corey Anderson (58) to also help the Black Caps to their rain-adjusted target of 298 after South Africa had made 281 for five batting first in a match reduced to 43 overs a side.
For South Africa, Faf de Plessis made 82, AB de Villiers was not out 65, while David Miller smashed an 18-ball 49.
Earlier, South Africa set New Zealand a target of 298 under the Duckworth-Lewis method to win.
After a two-hour rain disruption in Auckland on Tuesday, the Proteas smashed 65 runs from the five overs they had remaining to finish on 5-281.
Skipper AB de Villiers, who was 60 when play was interrupted, continued on to be unbeaten on 65.
It was big-hitting David Miller who pumped the accelerator in the closing stages.
Miller smacked 49 from 18 balls, including three sixes and six fours, before being caught behind going for another big hit.
South Africa were 3-216 after 38 overs and were building towards a big total when the wet weather arrived.
Faf du Plessis and de Villiers had upped the momentum and just taken their stand past 100 when the players went off.
When they came back on, du Plessis fell for 82 to the first delivery he faced.
Allrounder Corey Anderson had originally been called for a wide, but a review showed the ball coming off the batsman's glove on the way to keeper Luke Ronchi.
De Villiers had been the more aggressive in the pair's 103-run partnership.
He had a life on 38 when he thrashed a ball to cover, where Kane Williamson couldn't hold on to the chance.
The world's No.1-ranked ODI batsman responded to the let-off by hitting the next three balls of Anderson's over for a six and two fours to bring up a 32-ball half-century.
Earlier, de Villiers won the toss and chose to bat, but South Africa made a nervous start.
Openers Hashim Amla (10) and Quinton de Kock (14) were both gone with the score at 31, with Trent Boult claiming both scalps.
Boult, the tournament's most-prolific wicket-taker, took his tally to 21 with the double strike.
The total also took him past the record set in 1999 by another left-arm seamer, Geoff Allott, for most wickets by a New Zealander in a World Cup.
With Matt Henry, called in as third seamer to replace the injured Adam Milne, producing an impressive opening spell, New Zealand were able to slow down the Proteas' scoring rate.
Skipper Brendon McCullum again showed his attacking instincts, at one stage setting a field with four slips and a gully.
Du Plessis and Rilee Rossouw went about consolidating the South African innings.
Their 83-run stand was broken as McCullum rotated his bowlers, making five changes in five overs.
One of those was bringing on Anderson, who struck with his first ball, removing Rossouw for 39 to Martin Guptill's excellent one-handed catch at backward point.
Despite being the most costly of the New Zealand bowlers, Anderson finished with the best figures of 3-72 from his six overs.
(AFP/AAP)