Danushka Gunathilaka and Kusal Mendis were the heroes as Sri Lanka chased down 322 runs to upset India by seven wickets at the Oval on Thursday and throw Champions Trophy Group B wide open.
Shikhar Dhawan's superb 125 had led India to an imposing total of 321 for six but Gunathilaka (76) and Mendis (89) shared a second-wicket partnership of 159 to set up an unlikely win for Sri Lanka, who achieved the highest successful run chase in the tournament's history.
All four teams in Group B have one victory from two matches going into the final round of games in which Sri Lanka face Pakistan and defending champions India meet South Africa.
India, who had beaten Sri Lanka in 14 of their last 17 one-day internationals, were given the perfect start by Dhawan and Rohit Sharma who shared a composed opening stand of 138 under slate grey skies.
Sharma was the more aggressive, hitting three sixes and six fours before he was caught in the deep by Thisara Perera off Lasith Malinga for 78.
Captain Virat Kohli had the perfect stage to display his array of attacking strokes but he immediately nicked Nuwan Pradeep to wicketkeeper Niroshan Dickwella, sending the Indian fans into a stunned silence as he headed back to the pavilion for a duck.
Yuvraj Singh contributed seven scratchy runs and it was left to Dhawan to increase the tempo along with former captain Mahendra Singh Dhoni.
Dhawan cut Pradeep for his 13th four to reach his 10th one-day international century and following his dismissal Dhoni took charge, bludgeoning 63 off 52 balls to lift his side to a commanding score.
Sri Lanka's chase started badly when they lost Dickwella for seven but Gunathilaka and Mendis played freely from the start.
The former got to his fifty off 47 balls, including two sixes and five fours, and Mendis soon followed him to the milestone.
The Indian bowlers looked short of inspiration and it took a Sri Lankan error of judgement to end the partnership when Gunathilaka was needlessly run out going for a risky second.
Mendis was also run out following a brilliant pick-up and throw by bowler Bhuvneshwar Kumar but the double blow did not upset Sri Lanka's concentration.
Kusal Perera and captain Angelo Mathews added 75 runs off 63 deliveries before Perera was forced to retire hurt on 47 due to a hamstring injury.
But Asela Gunaratne (34 not out) joined Mathews who finished unbeaten on 52 as Sri Lanka eased to a famous victory with eight balls to spare.
Sri Lanka 322 for 3
(Mendis 89, Gunathilaka 76, Mathews 52*) beat India 321 for 6
(Dhawan 125, Rohit 78, Dhoni 63) by seven wickets