Reeling at 32 for 4 after a fiery opening burst from the Proteas pacers, Dhas and Saharan put up an outstanding stand in the 245 chase as India crossed the finish line in the penultimate over.
While Dhas struck a fluent 95-ball 96 (11×4, 1×6), skipper Saharan hit a 124-ball 81 (6×4) in the tricky chase.
India will face either Australia or Pakistan in the summit clash to be played at this venue on Sunday, searching for their sixth trophy in the marquee event.
But the beginning of India’s chase resembled a debris yard, losing four wickets for just 32 runs in the 12th over.
The South African new-ball bowler Kwena Maphaka jolted India in the first ball of their innings, dismissing Adarsh Singh with a nasty climbing delivery that the batter had no choice other than snicking to wicket-keeper Lhuan-dre Pretorious.
His partner Tristan Luus soon joined the fun with the wickets of Musheer Khan, Arshin Kulkarni and Priyanshu Moliya as all three India batters were indecisive outside the off-stump while hanging their bats to dry.
But the Indians found their saviours in Dhas and Saharan, who dished out innings of vastly contrasting nature and tempo.
Dhas was aggressive despite the situation his team was in, but Saharan was happy to keep his end going.
Dhas’ knock was a treatise on playing cross-batted shots as he cracked a six, pulled fours besides those well-placed nudges through the vacant spots on the on-side.
Saharan, on the other hand, was more traditional but was not entirely hesitant to bring out an exquisite drive or rasping cut whenever an opportunity was there for him to do so.
Dhas reached his fifty in 47 balls, fittingly, with a pull off pacer Riley Norton and Saharan reached his half-century in 88 balls with a cover drive off off-spinner Juan James.
In the process, Saharan also became the highest run-getter in this World Cup with 389 runs.
But these two youngsters showed immense maturity not to squander the start they got; piling runs to keep the pressure squarely on the hosts.
A second hundred in this event was there for his taking, but Maphaka, the tournament’s highest wicket-taker so far, deceived him with a slower ball that Dhas just managed to scoop to David Teeger at covers.
But the breakthrough came a wee bit late as India hung on to squeeze past the line notwithstanding the run out of Saharan when the scores were level.
Earlier, bowlers played a significant part in shaping India’s victory, limiting 2014 champions South Africa to 244 for 7 on a pitch that offered them considerable assistance.
SA found fight through wicketkeeper batter Lhuan-dre Pretorious (76, 102 balls) and Richard Seletswane (64, 100 balls) after early blows, but those efforts were not enough to rattle the visitors.
Pretorious and Seletswane milked 72 runs for the third wicket but they took nearly 22 overs for that.
The South African top-order just could not get going against India pacers Naman Tiwari (1/52) and Raj Limbani (3/60) who found appreciable pace, bounce and carry from the Willowmoore track.
Even when Seletswane and Pretorious were reconstructing the SA innings, they failed to score at a brisk pace, as the run-rate for a large part remained under four.
Left-arm spinners Saumey Pandey and Musheer Khan (2/43) along with off-spinner Priyanshu Moliya shackled the host batters’ progress in this phase, bowling a tidy line and length.
Pretorious, who tried to bring in some momentum hammering Moliya for a six over mid-wicket, departed just as the alliance began to blossom.
The left-hander, who made his third successive fifty in this event, wanted to cart Musheer over mid-wicket but a leaping Murugan Abhishek held on to a stunner to end his stay.
Seletswane also could not build on the platform as he soon fell to Tiwari, as his hoick ended in the hands of a running-in Moliya in the deep.
James (24 off 19 balls) and Luus (23 off 12 balls) helped South Africa amass 81 runs off the last 10 overs but that was not enough to stop the Indians.
(With inputs from PTI)