Ryan Bowman was the man to give Shrewsbury the points after his goal in the 74th minute - his fourth of the season - and his second to give Salop the win in the space of eight days.
Oxford, on the back of three straight defeats in league action, had a bright start to the game with Shrewsbury goalkeeper Marko Marosi forced into making some decent saves in the opening 25 minutes.
Town did settle though, and whilst not threatening too often in the opening 45 minutes, they did see out the remainder of the half with little alarm.
The hosts started the second period brighter, but when Cotterill sent on Tom Bloxham and Ryan Bowman the pair had an immediate impact.
Bloxham hit the bar, and moments later Bowman gave Town the lead with a wonderful finish from a lobbed ball over the top by Killian Phillips.
Shrewsbury saw the game out with little alarm after the goal to keep up their pursuit of the League One play-offs.
Salop arrived at the Kassam Stadium looking to make five wins on the bounce in league action for the first time in almost eight years.
Steve Cotterill's men had been in fine form of late, thrashing Burton Albion and Cambridge United, before snatching late winners against MK Dons and Forest Green Rovers.
Matthew Pennington was ruled out of the clash before kick-off, the defender who has been immense for Shrewsbury this season was still suffering after he took a blow to the head in last weekend's win at Montogomery Waters Meadow.
Taylor Moore, who has been so versatile for Shrews this season, slotted in a centre back and Rekeil Pyke, fresh on the back of his late goal last weekend, got his first start since Boxing Day.
Killian Phillips also came back into the team in place of Rob Street, as Shrews played a 3-4-2-1 instead of the usual 3-5-2 they have used more often recently.
Shrews started brightly and Flanagan saw an effort from 30 yards go narrowly wide of the Oxford goal.
But as the hosts settled, they forced Marko Marosi into a couple of good saves. Firstly to deny Kyle Joseph from a narrow-angle and then to beat away a Brandon Fleming free-kick from distance.
It was busy for the Salop keeper in the opening exchanges, he made another important save from Marcus McGuane, and then the U's had appeals for a penalty waved away by referee Scott Oldham when an effort hit Flanagan, but replays suggested it came off his shoulder.
Just after the 20-minute mark, the hosts went close again, Joseph played in by a lovely reverse pass, his effort looked to be heading into the corner with Marosi beaten, but it hit the post and came out.
Phillips picked up a yellow card for a challenge on Ciaron Brown, which seemed a little harsh, in what was a pretty uneventful remaining 10 minutes of the first period.
Elliott Bennett was introduced at the break at the expense of Pyke at right wing-back.
The hosts were again bright, Marosi tipping and effort from Marcus McGuane over the bar and then Town did well to clear the ball following a mele in the box from the resulting corner.
The boss went to his bench again in the 53rd minute introducing Tom Bloxham and Ryan Bowman.
And it was the substitutes who made the difference again for Shrews, firstly, Bloxham crashed an effort of the crossbar from outside the box, in Shrewsbury's best chance of the game to date.
But moments later, Town led, Bowman the man with the goal, for the second match running from the bench.
It came from a wonderful lobbed ball over the top from Phillips, and Bowman produced a wonderful finish on the volley when he struck it first time beyond Eastwood.
From then on, the hosts' heads dropped and with Cotterill sending on Rob Street to add fresh legs, Town looked as comfortable as they had all afternoon.
Salop XI: Marosi, Leahy, Moore, Winchester (Bloxham 53), Phillips, Dunkley, Saydee (Bowman 53), Shipley, Flanagan, Pyke (Bennett 45), Bayliss (Street 80)
Unused subs: Burgoyne (GK), Bevan (GK)
Oxford XI: Eastwood, Long (Anderson 86), Fleming, Moore, Bodin (Smith 40), Bate (Konate 80), Brown, McGuane, Joseph, Goodrham, Wildschut (Murphy 71).
Unused subs: McGinty, Findlay, O'Donkor.
Attendance: 7,597 (550)