Michael Bostwick put the struggling visitors ahead after 22 minutes with a superb long-range effort and on-loan Dagenham striker Dwight Gayle netted the second two minutes after the interval.
Rudy Gestede's late goal ensured a nervy finish for Darren Ferguson's team, but they held on for three crucial points.
The result saw Cardiff's lead at the summit reduced to two points.
Battling Birmingham fought back from two goals down to share the points with promotion hopefuls Crystal Palace in a 2-2 draw.
It looked like it was game over when Palace goal-machine Glenn Murray made it 20 goals for the season as he completed his double to make it 2-0 on the hour mark.
But substitute Nikola Zigic and Papa Bouba Diop levelled things up to ensure Lee Clark's men claimed a share of the spoils.
Middlesbrough grabbed two late goals to move back into third as Wolves' unbeaten December was ended in a 2-0 defeat at the Riverside.
Stale Solbakken's side, who had started the month with back-to-back wins, had not won on Teesside since 1951 although they seemed on course for a point until Marvin Emnes' penalty and Scott McDonald's strike sealed three points for Boro.
Substitute Chris Taylor fired Millwall back into the play-off places with the goal which sank fellow promotion hopefuls Leicester.
The winger struck midway through the second half of a scrappy match to condemn the Foxes to their sixth defeat on the road this season.
Burnley striker Charlie Austin scored his 22nd goal of the campaign as the Clarets and Watford drew 1-1 at Turf Moor.
Nathaniel Chalobah fired the visitors into an 11th minute lead with a well-taken volley from the edge of the area but Austin equalised 17 minutes later from the penalty spot.
Brighton and Nottingham Forest missed the chance to move into the play-off positions as they played out a goalless draw at the Amex Stadium.
Two goals in as many first-half minutes gave play-off chasing Derby their first away win since October, 2-0 at Bristol City.
Jeff Hendrick volleyed Nigel Clough's side into the lead in the 34th minute before Craig Bryson nodded home a second to delight the travelling fans.
Blackpool netted a goal in each half to see off Blackburn 2-0 and maintain boss Michael Appleton's unbeaten start to life at Bloomfield Road.
Rovers had more than their fair share of chances in the first half but Wes Thomas had headed Blackpool in front by the time Simon Vukcevic rattled the post for the visitors.
Henning Berg's side were unable to muster anything like a similar threat in a second half of few chances, and switched off late on to let former Rangers defender Kirk Broadfoot net a first Seasiders goal.
Leeds returned to winning ways as a 2-0 success ended Ipswich's three-match victory streak.
On-loan winger Jerome Thomas had a starring role, scoring one and setting up another for Paul Green.
Substitute David Ngog's second-half brace earned Bolton a 2-0 home victory against Charlton.
The former Liverpool striker scored twice within six minutes to help the Trotters to only their second win in eight games, and condemn Chris Powell's men to their first away defeat since September 18.