It was always a tough ask for New Zealand on the Wankhede Stadium pitch, which will stage the April 2 final, where the highest ever successful run chase was 229.
Sri Lanka skipper Kumar Sangakkara had earlier led from the front, hitting a fine 111 as his team posted 265-9 before Muralitharan worked his magic to send the Black Caps crashing to 153 all out after 35 overs.
Muralitharan injured his left hamstring when he dived in vain to prevent being run out when Sri Lanka batted.
He left the field early when New Zealand started their reply, but returned with devastating effect to have Kane Williamson stumped when the batsman was undone by a doosra.
He then had skipper Ross Taylor, who had been dropped on nought, lbw for 33 to leave the Black Caps reeling on 93 for 5.
Muralitharan then took a third wicket when he caught Scott Styris (6) off his own bowling to make the score 102-6 in the 24th over.
Fellow spinner Tillakaratne Dilshan got rid of Nathan McCullum for 115-7 to break his sequence before Muralitharan had James Franklin caught by Dilshan at short extra cover for 20 to claim his fourth wicket.
Spinner Ajantha Mendis took two wickets with seamer Lasith Malinga wrapping up the win by clean bowling Hamish Bennett with the last ball of the 35th over.
The victory put Sri Lanka top of the table but with either Australia or Pakistan guaranteed to replace them on Saturday, the 1996 champions will finish second in the pool.
That will guarantee a last eight clash with Group B's third-place finishers.
Sangakkara put on 145 runs for the third wicket with his deputy Mahela Jayawardene (66) to pull his team out of early trouble in the day-night match featuring two sides who had already made the quarter-finals.
But Jayawardene endured a controversial stay at the wicket.
In the 24th over, the former captain tried to play a defensive shot against off-spinner Nathan McCullum but ended up chipping the ball back to the bowler.
McCullum dived and managed to get his right hand under the ball to cap what looked like a stunning effort.
But even as McCullum broke into a celebration, TV umpire Amish Saheba was called in and he ruled it not out.
A furious McCullum and Taylor angrily protested the decision with on-field umpire Asad Rauf.
"If I felt it was a clean catch, I would have walked," said Jayawardene. "It was a 50-50 thing and it was fair it went to the TV umpire."
Jayawardene, then on 26, hit six fours in a dour 90-ball innings before being adjudged trapped leg before off Tim Southee, a decision he asked to be reviewed but in vain.
Sangakkara played a captain's innings, racing to his 11th century and completing 9,000 one-day international runs in the process, the fourth Sri Lankan player to the mark.
This was Sangakkara's first three-figure score in 63 innings, having gone without a ton since June 2008.
He was bowled by Nathan McCullum in the 42nd over after facing 128 balls and hitting 12 fours and two sixes.
COMMENTS
Comments are moderated and generally will be posted if they are on-topic and not abusive.
For more information, please see our Comments FAQ