Despite a good start from Pakistan, they dramatically collapsed from 155 for two to all out for 191, and a fine 86 from captain Rohit Sharma set India up for a comfortable win.
Sharma fell just short of making it back-to-back centuries at the tournament, but his knock was more than enough to send India on their way to a huge win over their rivals in the biggest match of the group-stage. Pakistan have now lost all eight matches the sides have played at the World Cup.
Abdullah Shafique and Imam-ul-Haq got Pakistan off to a solid start, before captain Babar Azam and Mohammad Rizwan began to pose problems for the hosts with a valuable partnership of 82 off 103 balls.
India then got a grip on the game in a chaotic period that saw Pakistan lose five wickets for 16 runs, sparked by Mohammed Siraj bowling Azam out just as the Pakistan captain brought up his half-century, reducing them to 155 for three.
The momentum shift became apparent when Kuldeep Yadav struck twice in the 33rd over to dismiss Saud Shakeel and Iftikhar Ahmed and Jasprit Bumrah then sent Rizwan’s stumps flying for 49, before striking again to bowl Shadab Khan.
Hardik Pandya took Mohammad Nawaz’s wicket before Ravindra Jadeja wrapped the game up to dismiss Hasan Ali and Haris Rauf with seven overs remaining.
Chasing 192, Shubman Gill made a quick start hitting four boundaries before being caught by Khan off Shaheen Shah Afridi, but Sharma was easily the star of the innings, taking control after Gill’s departure.
The captain smashed 39 in a 56-run partnership with Virat Kohli, who fell for 16, and alongside Shreyas Iyer the pair easily chased down the runs with a 77-run partnership.
Sharma’s glittering innings was brought to an end by Afridi as the opener departed for 86 runs off 63 balls, but KL Rahul and Iyer saw the side over the line, with the latter smashing four to bring up his 50 and win the game with 117 balls to spare.
Additional reporting by PA Sport