Bangladesh will now face New Zealand in the semifinal at the same venue on February 6.
Before eliminating the hosts in the Super League Quarter-final, Bangladesh came to this stage as the champions of Group C.
South Africa won the toss and sent Bangladesh to bat first, who amassed 261 runs for five in 50 overs. In reply, South Africa tumbled for 157 all-out in 42.3 overs.
South Africa started the chase scoring 34 without losing any wicket. But Tanzim Hasan Sakib came in and scalped Khanya Cotani for 15 off 33 balls. After losing the first wicket, South Africa lost their way to the win.
Before posting 100 runs on the board, they lost three more wickets and they were never able to recover from this situation.
Left-arm spinner Rakibul Hasan took the second wicket of South Africa and he took another four in the innings. His tremendous bowling efforts helped the junior Tigers pick up a big win.
South Africa middle-order batsman Luke Beaufort hit 60 off 91 with six fours but his effort was not enough for the hosts to keep their World Cup race alive. Eventually, they tumbled for 157 all-out in 42.3 overs.
Rakibul bagged five wickets conceding 19 runs in 9.3 overs. The spinner earlier took the first hat-trick of this World Cup. Tanzim Hasan Sakib took two wickets while Shoriful Islam and Shamim Hossain took one wicket each.
Earlier, Bangladesh batted first and posted 261 runs for five wickets in 50 overs.
Openers Parvez Hossain Emon and Tanzid Hasan put up 60 runs to ensure a strong start for the Tigers.
But after the dismissal of Emon for 17 off 40, Bangladesh lost a quick wicket as Mahmudul Hasan Joy fell for three only.
Tanzid Hasan fell as the third wicket scoring 80 off 84 with 12 fours. In the fourth wicket stand, Towhid Hridoy and Shahadat Hossain added 102 runs which helped the Tigers post a challenging total on the board.
Hridoy ended on 51 while Shahadat remained unbeaten on 74 off 76 with seven fours and one six.
Riding on the fifties of Tanzid, Hridoy and Shahdat, Bangladesh managed to post 261 for five in 50 overs.
Pheko Moletsane took two wickets conceding 41 runs in 10 overs while Tiaan van Vuuren bagged one wicket. Bangladesh lost two other wickets trapping in run-out.