"We knew in the first hour it was crucial to get some early wickets," South Africa's Morne Morkel said. "All credit to Dale (Steyn) and Vernon (Philander), the intensity with which they bowled was fantastic."
James Anderson (1-27) trapped Alviro Petersen for 0, but he was the only England bowler to take a wicket on a day when the hosts struggled.
South Africa roared back into contention after England had looked well placed on 267-3 overnight.
Matt Prior hit 60 from 90 balls with nine fours, but South Africa took England's last seven wickets for 134 runs.
"It'd be very easy to sit there and say this was South Africa's day," Prior said. "But it was a very attritional day. If we come in and get two or three early wickets we're back in the ascendancy. I think 385 is a good score on that wicket. Yesterday people said 400, but I think 350 is almost a par score. A lot will depend on that first session tomorrow morning."
Morkel was the pick of the bowlers with figures of 4-72, while Steyn (2-99) took two wickets in seven balls including that of Alastair Cook, who was bowled for 115 having added just a single to his overnight total.
Jacques Kallis claimed 2-38 and wicketkeeper AB de Villiers took five catches.
The key wicket of Cook came in the fifth over of the morning, when he played on to his stumps and was bowled by Steyn.
Steyn then removed Ravi Bopara, recalled for this match after a year out of England's test side.
Bopara lasted just six balls before he wafted his bat at a bouncer and was caught behind for a duck.
Having toiled throughout day one, South Africa's bowlers exploited the overcast conditions to swing the ball both ways and stifle the batsmen.
Steyn in particular looked like taking a wicket with every delivery, but in an inspired piece of captaincy Graeme Smith replaced him from the Vauxhall End with Jacques Kallis.
Kallis' fourth ball clipped the top of Ian Bell's off bail, bowling him for 13, and things could have been worse for England had Jacques Rudolph held a difficult chance when Prior edged Morkel to gully.
Tim Bresnan (8) lasted 32 balls before he chopped Imran Tahir's third ball of the morning on to his stumps. But having lost 4-59 during the morning session, England countered after lunch.
Prior reached 50 with a straight drive off Philander, but the partnership was ended shortly afterwards when Philander bowled Stuart Broad for 16, ending a useful stand of 45 for the seventh wicket.
Prior eventually got the faintest nick to Morkel and was caught behind, and Morkel wrapped up the innings four balls later when Anderson (2) became de Villiers' fifth victim.
England's opening bowlers, Anderson and Broad, looked every bit as menacing as South Africa's and the tourists' innings was just 16 balls old when Petersen was lbw to an unplayable inswinger from the former.
Amla initially looked uncomfortable, but drove Anderson for successive boundaries in the last over before tea.
After just one over of the evening session torrential rain began to fall in south London and play was delayed for an hour and 50 minutes.
The hiatus seemed to draw the sting from England's attack. Amla and Smith batted for over an hour before the only real chance went begging when Amla slashed at a ball from Bopara and was dropped by England captain Andrew Strauss at first slip.