India crushed South Africa by eight wickets on Sunday to reach the Champions Trophy semi-finals and knock the world's top-ranked team out of the tournament.

South Africa crumbled from 116 for one to 191 all out in good batting conditions at The Oval before Shikhar Dhawan (78) and Virat Kohli (76 not out) shared a fluent partnership of 128 to lead India to victory with 12 overs to spare.

The defending champions followed hosts England and Bangladesh into the last four and they will be joined by the winners of Monday's final Group B game between Sri Lanka and Pakistan.

South Africa started cautiously after being sent in to bat as Hashim Amla and Quinton de Kock added 76 for the first wicket without undue alarm.

Dhawan made 78 off 130 balls (Getty)

Amla raised the tempo with a six over mid-wicket but, on 35, he tried to cut spinner Ravichandran Ashwin and nicked a sharp catch to wicketkeeper Mahendra Singh Dhoni.

South Africa were 94 for one after 20 overs and De Kock reached a tidy half-century off 68 balls before he was deceived by spinner Ravindra Jadeja and bowled for 53.

South Africa then pressed the self-destruct button with two run-outs in quick succession.

A large number of India fans turned out to cheer on their country (Getty)

AB de Villiers, on 16, perished trying to pinch a quick single and David Miller (one) was dismissed in farcical circumstances with both batsmen stranded at the same end to leave South Africa struggling at 142 for four.

Their hopes of a substantial total rested on the shoulders of Faf du Plessis but his scratchy knock of 36 ended when he dragged a ball from medium-pacer Hardik Pandya on to his stumps.

Chris Morris, Andile Phehlukwayo, Kagiso Rabada and Morne Morkel soon joined him back in the pavilion and the innings petered out in the 45th over when Imran Tahir became the third run-out victim.

De Kock was South Africa's highest scorer (Getty)

India began their reply positively and both openers had struck sixes before Rohit Sharma drove loosely at Morkel and was caught by wicketkeeper De Kock for 12.

Kohli joined Dhawan and after surviving hostile spells from Morkel and Rabada the pair started to play with more freedom.

Dhawan crunched Morris over mid-on for his eighth four to reach his 50 and the left-hander played some brutal strokes before he skied Tahir to Du Plessis at long-off.