Hosts India, the former masters of the game lying ninth in the rankings, fought back from a 0-2 deficit to beat number four Belgium in front of a packed house of 7,000 in the eastern city of Bhubaneswar.
Eleventh-ranked Pakistan bounced back from three successive defeats in the preliminary league to stun number two the Netherlands 4-2 after Muhammad Irfan slammed in two quick penalty corners in the fourth quarter.
Olympic champions Germany will meet world number one Australia is Saturday’s other semi-final.
The Germans knocked England out of the race with a 2-0 win and Australia, chasing what would be an incredible sixth successive title, ousted Argentina 4-2 in other quarter-final matches.
Pakistan, winless against the Dutch in their last 12 Champions Trophy meetings since 1998, had suffered a humiliating 2-8 thrashing by England four days ago.
But the tournament format, which gave all eight teams a place in the knock-out rounds irrespective of the results in the league, helped Pakistan turn their fortunes around in dramatic style.
With the scores tied at 2-2 till the 50th minute, Pakistan seized the opportunity when Belgian Sander Baart was sent off with a yellow card and Irfan struck twice in quick succession to hand his team a shock win.
Pakistan coach Shahnaz Sheikh said the win over the Dutch, who had lost to India in their last league match, did not surprise him.
“We had studied them very carefully and we had found the right combination in our league games,” the former international said.
“This is a very important win for us and hopefully we will continue to shine in the semi-final. And I am glad we are playing India in the semi-final because the success of Asian teams is good for the health of hockey.”
The match will be a repeat of the Asian Games final in Incheon, South Korea in October, which India won in a penalty shoot-out to gain a direct entry into the 2016 Olympics.
Belgium led 2-0 lead by the 18th minute, but scores were level at half-time as India hit back through Rupinder Singh and Sannu Uthappa.
Backed by a boisterous home crowd, India picked up the pace and were rewarded with a goal in each of the last two quarters, the scorers being Akashdeep Singh and Dharamveer Singh.
“Today’s game showed we are improving all the time,” said Dutchman Roelant Oltmans, who is India’s high performance director and acting coach following the resignation of Australian Terry Walsh.
“It should be a very good semi-final.”
Australia, fielding a new-look team after retaining the World Cup earlier this year, slammed three quick goals after Pan-American champions Argentina had taken a 2-1 lead by the 35th minute.
Germany, with seven junior World Cup winners from 2013 in their squad, brushed aside two embarrassing defeats in the league to end England’s campaign.
Having missed five penalty corners in the first eight minutes, the Germans finally struck with the sixth in the 30th minute when skipper Moritz Furste banged home a flick.
As Christopher Ruhr made it 2-0 in the last quarter, England took off goalkeeper George Pinner to strenthen their attack, but the move did not produce any goals. -AFP