The master leg-spinner was knocked around by Kevin Pietersen, but he persevered to deny Paul Collingwood a deserved hundred and claimed the wicket of captain Andrew Flintoff to have the Australians poised for victory on Monday's final day.
At stumps on an engrossing fourth day on Sunday, England, needing to bat out almost two days to avoid defeat and facing a monumental 648-run target, were 293 for five with Pietersen unbeaten on 92 and Geraint Jones not out 12.
Warne had coaxed Flintoff into a false shot for Justin Langer to take a safe catch at long-on and send the England skipper on his way for 16.
Warne left the field with the figures of 4-108 off 31 overs and now has taken 689 wickets, the most in Test cricket.
After three days of suffering Australian domination, England finally showed the application missing earlier in the Test when the Australians had plundered the tourists' bowling.
But inspired by the unorthodox shotmaking of Pietersen and the determination of Collingwood, England carried the fight to the Australians, who fielded without their skipper Ricky Ponting, who had treatment on a back injury.
England must defy history to get anywhere near Australia's huge lead with their highest successful fourth-innings run chase in an Ashes Test 332 for 7 in Melbourne in 1928.
Collingwood had his sights on a third Test century when he advanced down the wicket to Warne on 96 only to be hopelessly stranded and stumped by Adam Gilchrist.
His 216-minute knock of 13 fours and two sixes breathed new life into moribund England after three days of total Australian control. He had shared a 153-run fourth wicket stand with Pietersen in just 151 minutes.
It was absorbing cricket as Pietersen took on his English county Hampshire team-mate Warne with some exhilarating shots.
An irritated Warne chucked the ball at Pietersen's head at the end of his 15th over, but the England No.5 swatted it away with his bat and snapped back at Warne.
The Australians believed they had Pietersen out on 44 when he swung his bat at a low Warne leg-break that veered sharply out of a crack. Gilchrist appealed joyously, but umpire Steve Bucknor was unmoved.
Pietersen went to stumps having been at the wicket for 226 minutes and hit 14 boundaries.
It was a turnaround in momentum after Andrew Strauss, the most experienced of England's batsmen on tour, played his second ill-judged shot of the Test when he fell for an Australian trap set up for the hook before lunch.
Strauss obliged and played seamer Stuart Clark straight to fielding substitute Ryan Broad at fine leg to be out for 11 and expose England's top-order to Australia's experienced bowling attack.
Ian Bell, the top scorer in the England's first innings with 50, lasted just four balls before Warne trapped him lbw for a duck.
Warne followed up after lunch to remove Alastair Cook for 43 after the opener played forward to a leg-break and was caught at short-leg by Mike Hussey.
Ponting declared the second innings closed immediately after opening batsman Justin Langer completed his century to be 100 not out, with the skipper unbeaten on 60, early into the morning session.
It was 36-year-old Langer's 23rd Test century and in doing so he became the fifth all-time leading Australian scorer in Tests with 7,575 runs at 46.18 in his 101st Test match.
Langer batted for 199 minutes with 10 fours and celebrated enthusiastically after completing his ton by scampering through for a single off Steve Harmison.