Opener Brian Bennett scored an unbeaten 63 and captain Sikandar Raza made a quick 45 on Thursday as Zimbabwe, who stunned Australia last week, handed Sri Lanka their first loss in the campaign, with both teams having already qualified for the Super Eight stage.
"I am pretty excited with how we have gone about our business," player of the match Raza said. "We are unbeaten so far ... nice position to be in as a captain but I will try and enjoy at least tonight."
Zimbabwe won three of their four group games while Tuesday's match against Ireland was washed out, which ensured Zimbabwe qualified for the Super Eights with Australia eliminated.
Sri Lanka, who ensured their qualification for the Super Eights with Monday's win over Australia, chose to bat first and posted 7-178, as opener Pathum Nissanka led the way again with a knock of 62.
Two-wicket hauls by Blessing Muzarabani, Brad Evans and Graeme Cremer helped contain Sri Lanka to a competitive total in Colombo, before Bennett combined with Tadiwanashe Marumani (34) for a 69-run opening partnership to set the stage for the chase.
Raza hit four sixes and two boundaries to score 45 from 26 balls, leaving Zimbabwe 12 short with 10 balls left.
Bennett scored the winning runs with a drive towards mid off, getting his team to 4-182 on the third ball of the final over.
Zimbabwe, who did not qualify for the 2024 edition, are the only team in this year's Super Eights who reached the T20 World Cup through a continental tournament.
Sri Lanka will face England, New Zealand and Pakistan in group two of the Super Eights, while Zimbabwe will be in group one alongside holders India, South Africa and West Indies.
Zimbabwe will play West Indies on Monday, a day after Sri Lanka face England.