The Canucks have consecutive victories for the first time since mid-January. Vancouver pulled within three points of eighth-place Phoenix, and one point of ninth-place Dallas in the race for the second wild-card playoff spot in the Western Conference.
The Sabres, last in the NHL by a wide margin, suffered their eighth loss in the past 10 games as they squandered an early 2-0 lead.
The Sabres built a 2-0 lead only 3:29 into the game, but the score was tied 2-2 after the first period and the Canucks led 3-2 after the second.
Kassian, who has faced criticism since he was traded to Vancouver from the Sabres at the NHL trade deadline in February 2012, recorded the first four-point game of his career.
He stood out as the game offered another chapter in the ongoing debate about his acquisition in the four-player deal that had former Canuck fan favorite Cody Hodgson head to Buffalo.
Kassian, who has rarely lived up to his billing of a prototypical power forward, excelled offensively two days after saying he is playing primarily a checking role now. Hodgson, Vancouver's first choice (10th overall) in 2009, had an uneventful evening as the Sabres were badly outplayed for most of the game.
But Kassian left the game late in the third period after taking a puck in the face for the second time in the game.
The Canucks had not posted two straight wins since beating the Calgary Flames on Jan. 18, when coach John Tortorella drew a suspension for charging their dressing room between the first and second periods, and Edmonton Oilers on Jan. 21.
Vancouver goaltender Eddie Lack overcame a slow start to earn the win. After allowing goals on the first and third shots that he faced in the game, Lack was sharp and finished with 16 saves.
Nathan Lieuwen, a 22-year-old Abbotsford, British Columbia, native who made only his second NHL career start and third appearance after being promoted from Rochester of the AHL on March 16, took the loss. He recorded 32 saves as his club was outshot 36-18.
Ennis and McBain scored on their club's first and third shots. Ennis beat Lack with a high shot just 1:11 into the game. McBain scored as Lack whiffed on the puck with his stick after it hit Vancouver defenseman Mike Stanton and slid into the net.
But the Canucks rallied.
Richardson and Matthias scored on similar setups from Kassian 2:36 apart midway through the first. On both occasions, Kassian sent Richardson and Matthias passes from behind the net and they beat Lieuwen with high shots from the left faceoff circle.
The quick goals spoiled a strong period for Lieuwen, who made several timely saves on Daniel Sedin and Ryan Kesler, as they both returned to Vancouver's lineup from injuries suffered earlier this month, and others.
Kassian received a scare late in the first as an errant puck left a cut around the bridge of his nose. But he was able to play on and, just 1:40 into the second period, drew an assist on Weber's goal, which gave the Canucks a 3-2 lead.
The puck appeared to hit Buffalo defenseman Mike Weber and then went between Lieuwen's legs. The Canucks dominated the second, but could not score again before the period ended.
Lieuwen prevented Vancouver from taking a bigger lead with just over 12 minutes gone as he robbed Chris Higgins. The Buffalo rookie goalie was kept busy as the Canucks outshot the Sabres 12-4 in the second period and held a 27-10 advantage after 40 minutes.
Kassian did most of the work on Vancouver's fourth goal as he skated the puck out of the Vancouver zone, held off Sabres defenseman Henrik Tallinder and then gave Booth the puck. Booth beat Liuewen with a high wrist shot.
It was Booth's first goal since Dec. 17 against Minnesota.
Vancouver lost Henrik Sedin to an apparent knee injury late in the second period as he collided with a fallen Buffalo player behind the Sabres net. The mishap occurred after the Canucks and NHL honored the Canucks captain for his 1,000th NHL game, played March 12 in Winnipeg. NHL senior vice president of hockey operations Jim Gregory represented the league. ... Hodgson played his 200th NHL regular-season game. ... Lack made his 35th start of the season. At the outset of the season, Tortorella indicated he would get 15-20 starts -- before anyone knew that Roberto Luongo would be traded. ... Sabres starting goaltender Michal Neuvirth, acquired from Washington at the trade deadline, also missed his fourth consecutive game, with a lower-body injury. ... Neuvirth and Matt Hackett, who dressed as Buffalo's backup, were traded for each other in the 2007-08 OHL season. Neuvirth went to Windsor from Plymouth while Hackett went the other way.