Match ends, Millwall 1, Middlesbrough 0.
Grant Hall's own goal delivered a blow to Middlesbrough's fading Championship play-off hopes, and saw Millwall pick up their third win in five games.
Hall turned into his own net after Lions dangerman Jed Wallace scampered down the left and drilled a low cross which the Boro defender could only inadvertently guide in.
It leaves the Teessiders, who won back-to-back games coming into the trip to The Den, six points behind sixth-placed Reading with eight games to play.
Gary Rowett's hosts had gone close before Hall's misfortune, with livewire winger Wallace denied by Boro keeper Marcus Bettinelli when put through by Mason Bennett.
Boro responded, with former Millwall midfielder George Saville denied by timely blocks, and Paddy McNair had an effort well saved.
However, only a smart save from Bettinelli to tip over Jon Dadi Bodvarsson's effort stopped the home side from doubling their lead late on.
Neil Warnock has turned Middlesbrough around since taking over last summer and delivering in his task of securing survival, but the promotion mix looks likely to elude them this season.
The form of home goalkeeper Bartosz Bialkowski was a formidable barrier, picking up his 15th clean sheet of the season, but neither Chuba Akpom, Yannick Bolasie nor substitutes Neeskens Kebano, Duncan Watmore and Ashley Fletcher could make the breakthrough despite chances.
Millwall can comfortably finish in mid-table barring a late collapse, and, with a perfect response to their midweek defeat by QPR, avoided losing consecutive home games for the first time since 2019.
Wallace again showed his value to the club, with a sixth assist of the season and an influential display in attack.
Millwall boss Gary Rowett:
"Defensively we were outstanding and, like any Neil Warnock team, they made us work - there's never an easy three points against them.
"They are a team that always put you on the back foot because of their attacking options - they've been able to bring on a lot of different types of players and I knew that as the game went on, our challenge was going to be to match that.
"We had some good moments in the first half when we got it down and played - I'm thinking of the Danny [McNamara] chance, Jed's [Wallace] chance when Mason [Bennett] put him in and two or three other opportunities - I'm pleased that we scored of course but you're always worried going in at 1-0.
"We dug in and had to weather the storm for 15 or 20 minutes in the second half but I thought we came out of that well and the substitutes helped us to do that."
Middlesbrough boss Neil Warnock told BBC Tees:
"It's the way we lost this game that's my disappointment. I can accept things going against you, I can accept you don't get the rub of the green etc, but today was unacceptable in the first half.
"I can't remember anything sticking up in the attack, it wasn't just the three or four that I brought off, there were two or three others I was disappointed in.
"I'd like to be very positive with the press tonight but it's very difficult."
- 3M Wallace
- 23McNamaraBooked at 35minsSubstituted forRomeoat 87'minutes
- 19WoodsSubstituted forWilliamsat 81'minutes
- 14MaloneSubstituted forPearceat 86'minutes
- 7J WallaceSubstituted forBradshawat 81'minutes
- 20BennettSubstituted forBödvarssonat 64'minutes
- 27BolaBooked at 20mins
- 29SpenceSubstituted forMendez-Laingat 45'minutes
- 17McNairSubstituted forKebanoat 81'minutes
- 7TavernierSubstituted forSavilleat 45+2'minutes
- 10AkpomSubstituted forFletcherat 45'minutes
- 14BolasieSubstituted forWatmoreat 45'minutes
- James Linington
- Shots on Target
Second Half ends, Millwall 1, Middlesbrough 0.
Foul by Nathaniel Mendez-Laing (Middlesbrough).
Mahlon Romeo (Millwall) wins a free kick on the right wing.
Substitution, Millwall. Mahlon Romeo replaces Dan McNamara.
Substitution, Millwall. Alex Pearce replaces Scott Malone.
Foul by George Saville (Middlesbrough).
Tom Bradshaw (Millwall) wins a free kick in the defensive half.
Corner, Middlesbrough. Conceded by Dan McNamara.
Attempt missed. Jake Cooper (Millwall) left footed shot from the centre of the box is close, but misses to the left. Assisted by Shaun Hutchinson following a corner.
Attempt missed. Shaun Hutchinson (Millwall) header from the centre of the box misses to the right. Assisted by Scott Malone with a cross following a corner.
Corner, Millwall. Conceded by Dael Fry.
Substitution, Middlesbrough. Neeskens Kebano replaces Patrick McNair.
Substitution, Millwall. Tom Bradshaw replaces Jed Wallace.
Substitution, Millwall. Shaun Williams replaces Ryan Woods.
Attempt missed. Marvin Johnson (Middlesbrough) left footed shot from outside the box is high and wide to the left. Assisted by Patrick McNair following a corner.
Corner, Middlesbrough. Conceded by Murray Wallace.
Corner, Millwall. Conceded by Marcus Bettinelli.
Attempt saved. Jón Dadi Bödvarsson (Millwall) right footed shot from the centre of the box is saved in the top centre of the goal. Assisted by Scott Malone.
Corner, Middlesbrough. Conceded by George Evans.