The hosts went in front after 51 minutes when Bailey Wright’s deep cross from the right was headed in by Joe Bryan, whose close-range effort gave goalkeeper Darren Randolph no chance.
Before Middlesbrough regrouped, a breathtaking move out of defence led to Jamie Paterson driving home a second City goal.
It began with clever ball skills from Korey Smith and was carried on by Aden Flint who crossed for Paterson to strike past Randolph from 10 yards.
The visitors were given hope when Iceland international Hordur Magnusson headed an innocuous ball past his own goalkeeper after 75 minutes.
But Lee Johnson’s men held out with few alarms, going close again when Josh Brownhill’s late drive brought a diving save from Randolph.
Middlesbrough created the first chance after five minutes when Britt Assombalonga was given the benefit of a marginal offside decision, only to shoot over from 12 yards.
City’s first effort came five minutes later when top scorer Bobby Reid fired narrowly wide of the near post from Korey Smith’s long ball forward.
The hosts were looking dangerous as Bryan’s shot from an angle on the left was deflected and scrambled to safety by Randolph.
City went close again after 23 minutes when Marlon Pack’s shot from the edge of the box was touched on by Nathan Baker and cleared off the line.
Boro were threatening down their left flank where Adama Traore was giving City right-back Wright a torrid time.
When Traore won a 50-50 challenge between the pair he raced forward with menace, but shot tamely wide.
City were still looking the more likely team to open the scoring and Paterson was narrowly wide with a 38th-minute volley. Then Baker’s diving header from a Paterson cross was saved by Randolph.
Boro responded and Fabio’s shot from outside the box took a slight deflection before being parried by goalkeeper Frank Fielding.
The half-time scoreline was blank and fair. City started the second period on the front foot with Reid shooting high over the bar from Paterson’s low cross.
The two goals in quick succession looked to have settled the outcome and Bryan threatened to add to them, shooting wide and then at goalkeeper Randolph.
But Magnusson’s dreadful error breathed new life into Middlesbrough and the home side had to defend solidly, particularly against the dangerous Traore, before the final whistle had Ashton Gate rocking, with City up to third in the table.