Bangladesh did the unexpected when they dismissed South Africa for a modest 184 on a slow pitch after having set a challenging 252-run target in their best-ever batting performance of the tournament.
Their first win over South Africa also threw the tournament wide open as more than four teams are now in contention for the semi-final berths.
Defending champions Australia lead the table with six points from three matches, followed by Sri Lanka (6 pts off 4 games), New Zealand (6 pts off 3), South Africa (4 pts off 4), England (2 pts off 3) and the West Indies (2pts off 4).
Bangladesh, who beat India in the first round, found more than one match-winner as they batted, bowled and fielded with discipline.
"It's historic win," said Bangladesh skipper Habibul Bashar.
"We can now think of moving forward in the tournament. We lifted ourselves in this game and once we put up a good total on the board we knew we could fight."
Middle-order batsman Mohammad Ashraful played a key role as he smashed a quickfire 83-ball 87 to help Bangladesh survive South African paceman Andrew Nel's maiden five-wicket haul in the morning session.
Left-arm seamer Syed Rasel then built on Ashraful's effort, dismissing South Africa skipper Graeme Smith (12) and in-form Jacques Kallis (32) in his opening spell to put South Africa on the back foot.
Rattled by pace, South Africa then looked clueless against spin.
They found themselves under pressure, but failed to find the batsmen to rise to the occasion. They virtually went out of the game when they slipped from 63-1 to a pathetic 87-6.
"It's very disappointing," said Smith.
"We let ourselves down and we now need to work very hard from here on. We could never build a partnership, but full credit to Bangladesh's bowlers."
Left-arm spinner Saqibul Hasan did the maximum damage in the middle overs as he had Mark Boucher (12) caught by Rasel and then held a low return catch to account for Justin Kemp (seven) off successive deliveries.
Left-arm spinners Abdur Razzak (3-25) and Mohammad Rafique (1-22) also kept the batsmen silent with their tight spells.
Herschelle Gibbs, batting low down the order and with a runner because of a calf injury, top-scored with an unbeaten 56 in a below-par South African performance.
South Africa will meet New Zealand, the West Indies and England in their last three matches, while Bangladesh opened their account after four games.
Bangladesh were earlier struggling at 84-4 following Nel's triple-strike before middle-order batsmen Ashraful and Aftab Ahmed (35) steadied the innings with a 76-run stand. Nel finished with 5-45 off 10 overs.
Aftab was the first to go for big shots, smashing two sixes in an over from Kemp. This was the beginning of the onslaught as Ashraful then improvised brilliantly to help his team post a respectable total.
Ashraful completed his 11th half-century in style, lofting fast bowler Makhaya Ntini for a straight four and then hitting two more boundaries in the same over.
Ashraful struck 12 fours in his 83-ball knock, his best since scoring 94 against England at Trent Bridge in 2005.
Nel, dropped after going wicketless in his team's opening game against the Netherlands, looked in fine nick as he dismissed openers Javed Omar and Tamim Iqbal (38), and Bashar in his lively opening spell.
Teenager Iqbal often stepped into the realm of adventure, hitting Ntini for a couple of boundaries before falling playing one shot too many.