City coach Pep Guardiola was sent to the stands at half-time for protesting at the decision to disallow the Leroy Sane goal that would have put his side 2-0 ahead at the break.
But after a whirlwind opening from the home side, Salah put Liverpool back in control when he chipped home brilliantly just over 10 minutes into the second period.
With two minutes on the clock, the home side had the start they and Guardiola had craved when Gabriel Jesus struck.
The goal came when Fernandinho found Raheem Sterling on the right and his low cross was swept beyond Loris Karius by Jesus as Virgil van Dijk appealed in vain for a Sterling foul.
De Bruyne fired over as the home side continued to press, with David Silva and Sane combining moments later for a cross that was cleared.
At the other end, Nicolas Otamendi was fouled by Mane as he closed him down, the Liverpool man going into the book and goalkeeper Ederson shown a yellow card for his reaction.
Lovren impeded Sterling as he got down the left to give City another free kick, and when the ball was rolled to Sane on the edge of the area his effort was deflected away.
David Silva crossed deep towards Bernardo Silva and, after Liverpool had scrambled clear, Jesus was unable to get a touch to another Sterling delivery.
As the half-hour approached De Bruyne tried his luck with a shot that Karius held, with Liverpool struggling to retain any sort of possession.
Trent Alexander-Arnold was booked for fouling Sane as the City pressure continued, with Bernardo Silva denied by a James Milner block and shown a yellow card for his animated handball appeals.
Some City players then wanted a penalty when Sterling went down under a challenge from Andrew Robertson, but referee Antonio Mateu Lahoz was not interested.
Firmino went into the book for fouling De Bruyne as he tried to race through from midfield, and then another David Silva cross just eluded the waiting Jesus.
A rare attack from the visitors saw Mane cross straight at a defender and City came forward once more, Bernardo Silva jinking his way into space before a deflected strike swung wide of the far post.
With five minutes left until the break Oxlade-Chamberlain's shot from the edge of the area was into Ederson's midriff -- and seconds later Bernardo Silva's deflected strike crashed off the post as City were within an ace of going 2-0 up.
A minute later, Sane prodded home after chaos inside the Liverpool area -- but Jurgen Klopp's side were saved by an offside flag when the ball had come back off Milner, meaning the goal should have stood.
With the closing action of a frenetic first half, Oxlade-Chamberlain took a pass from Salah, rounded Ederson but fired wide from an increasingly difficult angle.
Guardiola, furious at the decision to disallow Sane's goal, was sent to the stands by Lahoz as he ventured onto the pitch to talk to the officials.
And after a scrappy start, punctuated by fouls, the second half came to life as David Silva's cross was headed back by Sane but Dejan Lovren got there to clear.
But City were struggling to match the intensity of their first-half showing -- and with 56 minutes gone Liverpool were back on terms on the night when Salah struck yet again.
A pass was played through to Sane and although Ederson came to close him down the ball found its way to Salah, who kept his composure to level on the night with a superb chip over the covering Otamendi and leave City needing to score four more goals to go through.
Firmino almost got in as Liverpool, transformed by the goal, came forward once again -- but this time Ederson was able to gather at his feet.
De Bruyne fired a shot straight at Karius as City's belief began to wane, and then another good Mane run ended in a pull-back that eluded his teammates.
Van Dijk became the fourth Liverpool player shown a yellow card, booked for a foul, as City brought on Sergio Aguero for David Silva in a desperate search for new inspiration.
De Bruyne ran from midfield before seeing his strike cannon to safety, and then Aymeric Laporte's attempt hit Lovren and flew over the bar with Karius stranded.
City prepared another change, Ilkay Gundogan getting ready on the bench, but the home side were flat and Liverpool were cruising towards a place in the semifinals.
A Robertson cross flew across the area for the visitors before City made a second switch, Gundogan coming on for Bernardo Silva.
But with 13 minutes remaining, Liverpool set the seal on their place in the last four, Otamendi's mistake presenting the ball to Firmino, who kept his cool to send his strike across Ederson and in off the post.
The result meant Klopp's side set a record for the most goals by an English team in a Champions League season, with 33, with both Firmino and Salah, replaced by Danny Ings late on, having nine Champions League goals each.