Pakistan will now face title-holders India in Sunday's final at the Oval if their arch-rivals beat Bangladesh in Thursday's second semi-final at Edgbaston.
Azhar Ali (76) and Fakhar Zaman (57) all but ended previously unbeaten tournament hosts England's slim hopes of victory with an opening stand of 118.
But the real damage was done when England collapsed to 211 all out after Pakistan captain Sarfraz Ahmed won the toss on a used pitch that played more like a sub-continental surface than a British one.
Paceman Hasan Ali led a disciplined attack with a man-of-the-match return of three for 35 from his maximum 10 overs.
“Credit goes to the bowlers and the batters who finished it very well,” said Sarfraz at the presentation ceremony.
“We adapted to conditions, we knew if we restrict them we could easily chase it down,” he added.
"Every game is a knockout game and I told my boys to play their game and not worry about the result."
Defeat extended England's long wait for a maiden major one-day international title until at least 2019 — when they stage the next World Cup.
“One thing we didn't do was adapt to conditions, which I thought Pakistan did extremely well,” said England captain Eoin Morgan.
“We did prepare for a used wicket but 211 wasn't a good score. 250/270 would have been.”
He added: “The fact we've produced brilliant performances in this tournament and then play like that on this wicket is extremely disappointing.”
Pakistan's openers compounded England's misery to the delight of their supporters at a sun-drenched Cardiff.
Left-hander Fakhar hit a six — something England didn't manage in their entire innings — when a top-edge off fast bowler Mark Wood flew safe.
The dashing Fakhar completed a 49-ball fifty to follow his 50 against Sri Lanka.
Azhar, who pulled all-rounder Ben Stokes for six, followed him to the landmark in 68 balls.
On a Cardiff ground where they chased more than 300 to beat England in an ODI last year, Pakistan completed Wednesday's pursuit with a mammoth 77 balls to spare when Mohammad Hafeez pulled Stokes for four.
England did avoid a 10-wicket defeat when Jos Buttler stumped Fakhar off leg-spinner Adil Rashid and Azhar too fell before the finish, pulling Jake Ball into his stumps.
Pakistan, however, had the game all but won at 173 for two.
India thrashed Pakistan by 124 runs in the teams' Champions Trophy tournament opener at Edgbaston on June 4.
But three days later Pakistan returned to the Birmingham ground to make a mockery of the rankings by beating South Africa in a bottom versus top clash.
Pakistan then held their nerve in a three-wicket win over Sri Lanka in Cardiff on Monday — a virtual quarter-final for both sides.
England didn't manage a single individual fifty in their innings.
Joe Root top-scored with 46 and Yorkshire team-mate Jonny Bairstow, recalled in place of dropped opener Jason Roy, managed 43.
Rumman Raees, in for injured fellow left-arm quick Mohammad Amir, took two for 44 on his ODI debut. England, who were 128 for two, lost their last eight wickets for just 83 runs.
Bairstow replaced Roy after the Surrey opener had managed just 51 runs in eight ODI innings this season. Dropped twice, Bairstow's luck ran out when a misjudged pull off Hasan sailed gently to Hafeez at deep square leg.
Root fell when well set after an edged cut off leg-spinner Shadab Khan was well held by wicket-keeper Sarfraz.
Morgan, who made 87 in a 40-run win against Australia last time out, fell for 19 when he charged down the pitch to Hasan and edged behind.
Stokes, fresh from his career-best 102 not out against Australia, took 64 balls to score a 34 that, remarkably for the usually big-hitting all-rounder, did not include a single boundary.
He eventually holed out to cover when deceived by Hasan's slower ball.
Pakistan belied their reputation as a poor fielding side, with Fakhar holding a brilliant diving catch at deep square leg to dismiss Moeen Ali, while substitute Ahmed Shehzad ran out Rashid with a direct hit.
Sarfraz rescued Pakistan with an unbeaten 61 after they collapsed against Sri Lanka but, two days on, there was no repeat of that batting slump.
England: 211, 49.5 overs (Hasan Ali 3-35)
Pakistan: 215-2, 37.1 overs (Azhar Ali 76, Fakhar Zaman 57)
Result: Pakistan won by eight wickets
Pakistan: Azhar Ali, Fakhar Zaman, Babar Azam, Mohammad Hafeez, Shoaib Malik, Sarfraz Ahmed (w + c), Imad Wasim, Rumman Raees, Shadab Khan, Hasan Ali, Junaid Khan
England: JM Bairstow, AD Hales, JE Root, EJG Morgan (c), JC Buttler (w), BA Stokes, MM Ali, AU Rashid, LE Plunkett, MA Wood, JT Ball
. Tags: #Pakistan #
ANKARA: Turkey, Iran and Iraq have agreed to consider counter-measures against Kurdish northern Iraq over a planned independence referendum, Turkey&rs... More
SRINAGAR: Authorities in India-held Kashmir claimed that suspected militants hurled a grenade at motorcade of a local government minister on Thursday,... More
Fifteen people drowned and up to 15 more were missing on Friday after a fishing boat carrying migrants sunk off Turkey's Black Sea coast, the coas... More
Iran's President Hassan Rouhani vowed on Friday that Iran would boost its missile capabilities despite warnings from Washington that it is ready t... More
Dozens of activists staged a demonstration in the capital of Azad Jammu and Kashmir (AJK) on Tuesday to condemn the alleged violence and discriminatio... More
Japan's defence minister on Tuesday said North Korea's latest nuclear test was more powerful than initially estimated, with a yield that was a... More