Sagan sprinted to victory ahead of Thibaut Pinot (FDJ) and Primoz Roglic (LottoNL-Jumbo) as an elite group of riders made it to the finish in Fermo after 209km of tough, climbing terrain.
There was no-one to challenge the Slovakian in the final sprint, with the likes of Geraint Thomas (Team Sky) and race leader Nairo Quintana (Movistar) in the front group, but he had to dig deep to hold on to the lightweight climbers on some short, steep ascents towards the finish.
After fighting hard to get back on terms ahead of the final climb, Sagan was able to repel attacks from Rigoberto Uran (Cannondale-Drapac) and Pinot, leading the small group around the final corner and gritting his teeth to sprint to victory.
Frenchman Pinot, who moved up to second in GC after Adam Yates (Orica-Scott) abandoned mid-race with illness, was able to sprint in just behind Sagan to take bonus seconds on the line.
Nairo Quintana held onto his overall lead after finishing on the same time as the winner Sagan.
How it happened
The day's first major break looked to be an elite one as the likes of Scott Thwaites and Steve Cummings (Dimension Data), Niki Terpstra (Quick-Step) and Gianni Moscon (Team Sky) got into a big group of riders that established nearly four minutes gap on the group.
They were eventually brought back with 82km remaining, and it wasn't long before attacks came thick and fast on the lumpy final 50km of the race.
The first major move was from Bob Jungels (Quick-Step) and Mattia Cattaneo (Androni) who were joined by Mikel Landa (Team Sky) and Tim Wellens (Lotto-Soudal) and established around a minute after attacking with 76km to go.
Movistar worked hard though in service of Quintana, and brought the quartet back at around 44.5km to go.
Michal Kwiatkowski (Team Sky) then started putting in a number of attacks, with nothing really sticking as the GC favourites eyed a stage win and some bonus seconds.
By this time there were only 80 or so riders left in the peloton, with the next purposeful attack coming from Vasil Kiryienka (Team Sky) and Luis Leon Sanchez (Astana) getting away on the circuit around Fermo with 21km to go.
They managed to put 30 seconds into the bunch, but with Kiryienka falling back on one of the steep climbs, Sanchez was forced to ride by himself until Tejay van Garderen bridged over with 9km to go.
That didn't last too long though with the pair brought back on the approach to the centre of Fermo.
Quintana then tried to make a move on one of the steepest climbs which hit 22 per cent gradient, but wasn't able to shake the likes of Thomas and Pinot.
Sagan was briefly distanced, but as soon as he made it back into the front group it seemed a sure thing that the rainbow jersey would be celebrating another win at Tirreno-Adriatico.
Monday's stage six sees the riders take on a 168km stage that should see the sprinters remaining in the race get some opportunity for a stage win.
Tirreno-Adriatico 2017 stage five, Rieti - Fermo (209k):
1. Peter Sagan (Svk) Bora-Hansgrohe, in 5-00-05
2. Thibaut Pinot (Fra) FDJ
3. Primoz Roglic (Slo) LottoNl-Jumbo
4. Geraint Thomas (GBr) Team Sky
5. Bauke Mollema (Ned) Trek-Segafredo
6. Rigoberto Urán (Col) Cannondale-Drapac
7. Tom Dumoulin (Ned) Team Sunweb
8. Nairo Quintana (Col) Movistar
9. Rohan Dennis (Aus) BMC Racing
10. Simon Spilak (Slo) Katusha-Alpecin
General classification after stage five
1. Nairo Quintana (Col) Movistar, in 21-34-51
2. Thibaut Pinot (Fra) FDJ, at 50s
3. Rohan Dennis (Aus) BMC Racing Team, at 1-06
4. Primoz Roglic (Slo) Team LottoNl-Jumbo, at 1-15
5. Tom Dumoulin (Ned) Team Sunweb, at 1-19
6. Geraint Thomas (GBr) Team Sky, at 1-23
7. Rigoberto Urán (Col) Cannondale-Drapac, at 1-30
8. Jonathan Castroviejo (Esp) Movistar Team, at 1-32
9. Bauke Mollema (Ned) Trek-Segafredo, at 1-37
10. Simon Spilak (Slo) Katusha-Alpecin, at 1-59
Thank you for reading 20 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1