Nuwan Kulasekara shone with 5 for 22 as the tourists, in pursuit of 75, got over the line in 20 overs at Brisbane.
Brisbane: Sri Lanka overcame a shaky start to their small run chase before beating Australia by four wickets with a full 30 overs to spare on Friday, taking a 2-1 lead in the one-day series thanks chiefly to Nuwan Kulasekara's five-wicket haul.
Australia, boosted by the return of regular captain Michael Clarke and test stars David Warner and Matthew Wade, crumbled as Kulasekara took 5 for 22 after the hosts won the toss and elected to bat.
Sri Lanka captain Mahela Jayawardene (1) was dismissed by Clint McKay in the first over before the visitors slumped to 37 for 4. But despite some spirited bowling from Mitchell Johnson (3 for 11), the tourists had too many wickets and overs in hand.
Angelo Mathews (1 for 10) had Warner caught in the second over of Australia's innings, then Kulasekara removed opening partner Phil Hughes, David Hussey, George Bailey, Clarke and Moises Henriques in succession to leave the hosts reeling on 30 for 6.
Tailender Mitchell Starc top scored with an unbeaten 22, rescuing Australia from an even more dismal score, having been 40 for 9.
Warner made just 4 runs before offering a catch to Eranga at mid-on and Hughes had 3 when he became Kulasekara's first victim with an edge to slip three overs later.
Hussey was ruled caught behind for 4 after Sri Lanka appealed to the TV umpire and Bailey followed lbw the next ball without scoring.
Clarke, a prolific scorer in Test cricket this Australian summer, made 9 runs before losing his middle stump and Henriques (2) joined him in the dressing room two balls later with Australia facing a humbling total.
Lasith Malinga chimed in shortly after to remove Test wicketkeeper Wade for 8 runs and dismissed Clint McKay for a duck.
Starc and spinner Xavier Doherty shared a gritty 34-run partnership for the last wicket before Eranga had Doherty caught by Jeevan Mendis for 15 to end the innings.
In reply, Sri Lanka lost Jayawardene early, then Johnson removed Tillakaratne Dilshan (22), Lahiru Thirimanne (7) and Mathews (0) in the space of eight balls.
Starc had Upul Tharanga caught at first slip by Clarke shortly after for 12 and claimed Jeevan Mendis for 2 in the last over of the match. Kushal Perera ended the game unbeaten on 22 with Thisara Perera on 4.
The fourth game of the series will be played Sunday at Sydney.