Boro were left fuming at referee Keith Stroud’s controversial decision to send off defender Daniel Ayala just after the hour when they led 1-0 courtesy of Ashley Fletcher’s 32nd-minute opener.
In-form Preston, who are now unbeaten in 11 games, levelled from the resulting free-kick when Paul Gallagher’s brilliant effort found the net.
With eight minutes remaining substitute Jayden Stockley headed in the winner to lift Preston to within two points of the play-off zone which Middlesbrough are now in danger of dropping out of.
Boro, fresh from their 2-1 loss to Brentford, got a positive start. Jonny Howson went close when his long-distance drive forced a save from goalkeeper Declan Rudd, while Ayala also shaved the upright.
Middlesbrough got the break they deserved when Fletcher’s effort deflected off Jordan Storey after Mo Besic’s run and pass had played the striker in.
Rudd made a strong save with his legs to deny Howson, before racing off his line to thwart Assombalonga.
Stroud sent off Ayala after going to ground with force on Brandon Barker and the official deemed it was reckless.
That presented Gallagher with a chance to level and he succeeded, curling the ball around the wall and inside the far post.
With eight minutes remaining Stockley headed in the winner.
Middlesbrough: Randolph, Shotton, Flint, Ayala, Howson, Mikel (Tavernier 85), Besic (Hugill 77), Friend, Wing, Fletcher (Fry 64), Assombalonga. Unused substitutes: Konstantopoulos, Clayton, Downing, Saville.
Preston North End: Rudd, Storey, Davies, Hughes, Browne (Rafferty 22), Johnson, Pearson, Gallagher (Stockley 75), Earl (Barker 46), Nmecha, Maguire. Unused substitutes: Crowe, Ginnelly, Ledson, Huntington.
Referee: K Stroud (Hampshire).