Dom Williams caught a pair of touchdown passes for Washington State (6-5, 4-4 Pac-12), which also returned two interceptions for touchdowns. The Cougars have not actually played in a bowl game since 2003, which was also their last winning season.
Utah (4-7, 1-7) has lost five in a row since upsetting No. 10 Stanford. This is the first time since 1997 and 1998 that Utah has been shut out of bowl games in consecutive seasons.
Sophomore quarterback Adam Schulz, a former walk-on, made his second start for Utah and completed 21 of 46 passes for 347 yards. He threw three touchdown passes and was intercepted twice. Former starter Travis Wilson is out for the season after suffering a concussion against Arizona State.
Halliday completed 36 of 62 passes, and was not intercepted. Williams caught five passes for 154 yards.
Students rushed the field after the game to celebrate a sixth victory in coach Mike Leach's second season.
Washington State piled up 580 yards in the game while Utah had 481 yards.
Washington State jumped to a 21-0 lead, then had to hang on for the victory.
Washington State drove 73 yards on the opening possession and Williams caught a 5-yard touchdown pass from Halliday for a 7-0 lead. The big play of the drive was a 44-yard pass reception by Williams.
Washington State squandered a chance to score on its next possession, when the Cougars turned the ball over on downs at the Utah 19. But two plays later Damante Horton picked off a Schulz pass and ran untouched for 22 yards into the end zone, giving WSU a 14-0 lead.
Three plays later, a Schulz pass was deflected and intercepted by Casey Locker, who returned it 39 yards for a touchdown and a 21-0 lead for Washington State.
Utah finally scored when Kelvin York ran 14 yards up the middle late in the first quarter for a touchdown. York carried 8 times and caught a pass during the 12-play, 75-yard drive.
After a WSU punt, Utah took over and Schulz immediately completed a 47-yard pass to Dres Anderson, putting the ball on WSU's 16. York ran three times, the last a 2-yard touchdown burst. That narrowed WSU's lead to 21-14 early in the second quarter.
Washington State drove to the Utah 10 on their next possession, but had to settle for Andrew Furney's 27-yard field goal for a 24-14 lead.
After a Utah punt, WSU drove 78 yards and scored on Halliday's 9-yard pass to Marcus Mason. But the conversion kick was blocked by Daniel Nielson and the Cougars led 30-14.
After a short punt gave Utah possession at the WSU 49, Schulz fired a 28-yard pass to Geoffrey Norwood, and six plays later hit Anderson with a 3-yard touchdown pass. An attempt at a 2-point conversion pass failed.
Washington State got the ball back with just over a minute left in the half, and Furney booted a 52-yard field goal as time expired that gave WSU a 33-20 lead at halftime.
Utah's Andy Phillips kicked a 34-yard field goal on the opening drive of the second half to cut WSU's lead to 33-23. Furney replied with a 28-yard field goal after a WSU drive stalled on the Utah 11.
Schulz fired an 11-yard touchdown pass to Jake Murphy on the next possession to cut WSU's lead to 36-30 with 6:58 left in the third.
Washington State went 75 yards in just four plays, including a 50-yard run by Mason, on its next possession. Halliday's third touchdown pass covered eight yards to Vince Mayle and gave WSU a 43-30 lead.
WSU's Gabe Marks fumbled the ball after catching a pass and Utah's Reginald Porter recovered on the Utes' 36. On the first play, Schulz fired a 64-yard touchdown pass to Murphy to cut WSU's lead to 43-37 with 12:28 left in the game.
Both teams punted on their next possessions.
Then Halliday fired a 71-yard pass Dom Williams, who caught the ball and outran Utah defenders into the end zone for a 49-37 lead with 4:42 left in the game. A 2-point conversion pass was intercepted.
Halliday broke a tie with Alex Brink and Ryan Leaf with the 13th 300-yard passing game of his career, most in team history.
Utah wraps up the 2013 season Saturday at home against Colorado.