Sri Lanka produced an impressive run chase to down India by six wickets on Tuesday and leave their opponents staring at an early exit from the Asia Cup.
If Pakistan beat Afghanistan on Wednesday, they will face Sri Lanka in Sunday's final and knock out arch-rivals India in the process.
Half-centuries from openers Pathum Nissanka (52) and Kusal Mendis (57) gave Sri Lanka the perfect start to their chase of 174 in the Super Four game.
India hit back with a flurry of wickets, but Bhanuka Rajapaksa and captain Dasun Shanaka helped Sri Lanka get over the line, with two scrambled byes off the penultimate ball completing the job.
Rajapaksa, who hit 25 not out, and Shanaka, who made 33 not out, put on an unbeaten stand of 64 to leave the hopes of the tournament favourites India hanging by a thread, after also losing their Super Four opener to Pakistan.
If Afghanistan do India a favour against Pakistan, Rohit Sharma's men will still have to beat the Afghans on Thursday to have any chance of reaching the final.
Nissanka started cautiously before he hammered Arshdeep Singh for two fours and a six in an 18-run fifth over.
Mendis joined in the fun and cleared the fence three times, including with a brilliant shot over wide long-off against Ravichandran Ashwin.
Nissanka reached his fifty in 33 balls, but Indian leg-spinner Yuzvendra Chahal broke the partnership and struck twice in one over.
Mendis also completed his fifty but Sri Lanka lost Danushka Gunathilaka for one off Ashwin.
Chahal then trapped Mendis lbw to put Sri Lanka in trouble at 110-4 from 14 overs.
But Rajapaksa and Shanaka dug them out of that hole with some inspired batting, leaving only seven needed from the final over.
With two still to get from two balls, Shanaka played and missed outside off stump, but wicketkeeper Rishabh Pant and bowler Arshdeep both failed with their run-out attempts and the match finished on an overthrow.
Earlier, left-arm quick Dilshan Madushanka took 3-24 in India´s 173-8 after Rohit smashed 72 off 41 deliveries.
Rohit put on 97 with Suryakumar Yadav (34) after India lost two early wickets including Virat Kohli for nought.
Kohli, who struck form after an extended batting slump with two successive half-centuries in the tournament, walked back to stunned silence from a sparse crowd dominated by Indian fans.
Rohit hit back with a flurry of boundaries but his departure opened the door for Sri Lanka who took late wickets to keep the score down.
Shanaka and Chamika Karunaratne claimed two wickets each.