Three-time champions Pakistan now look strong enough to make the final as they now have 10 points from three wins and a draw. They have two matches left, against Belgium and India.
Canada, meanwhile, have three points from one win and two defeats.
Earlier India sent Belgium to their third defeat in a high-scoring match, while Argentina thrashed Malaysia in the final match.
Canada started the game the brightest and surprised Pakistan by taking the lead in the first minute after Kullar Bindi steered in a through pass from Sukhwinder Singh.
The goal shocked Pakistan, whose forwards, led by Shakeel Abbasi and Rehan Butt, created a number of chances in the first half but failed to score at the Azlan Shah Stadium.
They kept up the pressure in the second half but had to wait until the last six minutes of the match before scoring two quick goals within three minutes.
Defender Mohammad Saqlain’s cross from the left was deflected into the goal by Butt in the 64th minute. That was followed by a Saqlain finish off a penalty corner set-piece.
Pakistan coach Naveed Alam said: “We were under pressure with just minutes left on the clock. However, I am relieved that we scored two goals in the last six minutes of the match to collect full points.
“I hope the forwards will rise to the occasion in the last two matches to qualify for the final,” he said.
Meanwhile India, playing with 12 juniors in their squad, beat Olympics-bound Belgium 6-4 to register their second win of the tournament here, giving them six points from two wins and two defeats.
It was Belgium’s third consecutive loss, and placed them bottom of the standings with no points.
Forward Shivendra Singh (9th, 68th minutes) and defender Sandeep Singh (29th, 35th) each scored a brace while Diwakar Ram (22nd), and S.V. Sunil (32nd) scored the other goals for India.
Thomas Briels scored a brace for Belgium in the 45th and 59th minutes.
Alexandre De Sadeleer (24th minute) and Charles Vandeweghe (61st) were the other scorers.
Last year’s losing finalists Malaysia were hammered 5-0 by Argentina in the last match of the day, making it the host’s worst performance yet.
Malaysia have three points from three matches but their hopes of reaching the final are dead.
Argentina, meanwhile, have 10 points from four matches and look set for the final.
Facundo Callioni was the toast of the late match, scoring two in the 18th and 26th minutes.
Ignacio Juan Gilardi (47th), Hernan Lucas Cammareri (54th) and Tomas Innocente Argento (68th) scored the other goals.
The tournament takes a break on Tuesday before resuming on Wednesday when New Zealand take on Argentina, Belgium play Pakistan and Malaysia meet Canada.
Results:
Belgium 4 India 6
Canada 1 Pakistan 2
Argentina 5 Malaysia 0—AFP