The two-time champions stretched their unbeaten tournament run to seven wins and will now face either co-hosts Australia or Pakistan in Sydney on March 26.
Opener Rohit Sharma top-scored with 137 off 126 balls and Suresh Raina hit a rapid-fire 65 from 57 balls to rescue India from early trouble in a 122-run stand that left Bangladesh facing a challenging target of 303.
The Indians, who were struggling at 115 for three, wriggled free to reach 302 for six after winning the toss on a flat pitch and always had Bangladesh struggling under lights in front of 51,552 fans.
No side has made more than 300 batting second to win a one-day international at the MCG.
Rohit blasted his seventh ODI century and had a big break on 90 when he holed out to deep mid-wicket off Rubel Hossain, only for umpire Ian Gould to signal a no-ball for what appeared to be a legitimate waist-high delivery.
“I’m glad we eventually posted a good total,” said Rohit. “It was important for me to stay as long as I could as we lost a couple of wickets in the middle.”
But right-hander Rohit relished his controversial reprieve to lash out in the final overs.
Rohit was finally bowled by a Taskin Ahmed yorker in the 47th over, finishing with 14 fours and three sixes.
– Raina recovery –
Bangladesh, playing in their first World Cup quarter-final, started well in the field before Raina followed up his unbeaten 110 in India’s six-wicket win over Zimbabwe in their concluding pool game last weekend with another free-scoring knock.
Rohit and Shikhar Dhawan dawdled through the opening hour’s play before Tigers’ all-rounder Shakib Al Hasan struck with his third ball to have Dhawan stumped for 30 off 50 balls.
Key batsman Virat Kohli lasted only eight balls before he needlessly flashed at a wide Rubel delivery and was caught behind for three.
India had another setback when Ajinkya Rahane lofted a drive to Shakib at mid-off on the edge of the circle for 19 off Taskin, leaving the favourites struggling at 115 for three in the 28th over.
But Raina and Rohit upped the tempo and Bangladesh’s fielding became ragged under pressure before Raina skied Mashrafe Mortaza to wicketkeeper Mushfiqur Rahim.
Skipper Mahendra Singh Dhoni was out for just six to give Taskin his third wicket but Ravindra Jadeja’s 23 not out off 10 balls helped see India past 300.
Bangladesh lost both openers in the space of two balls in seventh over, one in a dreadful mix-up that led to a run out at the non-striker’s end.
Tamim Iqbal edged Umesh Yadav to wicket-keeper Dhoni for 25 and next ball a mix-up between ball-watching Soumya Sarkar and Imrul Kayes led to Imrul’s run out for five after rapier fielding from Jadeja at short backward square.
Dhawan juggled a catch and just stayed inside the field with nimble footwork to dismiss Mohammad Mahmudullah on the boundary rope for 21 to leave Bangladesh 73 for three in the 17th over.
Mohammed Shami claimed his second wicket off a superb diving catch by Dhoni to dismiss Soumya Sarkar for 29 leaving Bangladesh with it all to do at 90 for four.
Bangladesh lost Shakib for just 10 to a safe catch by Shami at short third man off Jadeja, leaving them 104 for five in the 29th over as the match petered out in the face of India’s superiority.
Nasir Hossain topscored with 35 off 34 balls down the order and Yadav finished with four for 31.