Bennett began his sprint a long way out to storm past Matej Mohoric and Carlos Betancur, and claim his second victory of the race at a wet finish to the 214-kilometer route from Osimo to the motorsport circuit of Imola.
"I saw two guys ahead, my team had done so much work for me and I couldn't let them down. I just went for it," said Bennett, who rides for Bora-Hansgrohe.
"I looked back when I saw how far away the line was. I didn't know if I would make it but I kept going and I pulled it off."
Danny van Poppel was second, just ahead of Niccolo Bonifazio.
The general classification was unchanged as Yates retained his 47-second advantage over defending champion Tom Dumoulin of the Netherlands.
Thibaut Pinot is third, 1:04 behind the British cyclist.
"I guess these were favorable weather conditions for an Englishman. And also for an Irishman!" Yates said.
The stage was meant to be a relatively easy one before the race hits the mountains this weekend, but rain and hail in the final 30 kilometers and the one classified climb of the day added to the drama.
Tim Wellens attacked with just over 20 kilometers remaining and built a lead of 23 seconds before being caught.
There were more attacks before Diego Ulissi made a move and took Betancur with him.
Mohoric then bridged the gap to the leaders before they dropped Ulissi and had an advantage of four seconds heading into the race circuit for the second and final time.
Bennett caught everyone by surprise by making his early move, surging into the lead with 400 meters remaining and holding on to become the first Irish cyclist to win two road stages of the Giro.
Another mainly flat stage is scheduled for Friday, a 180-kilometer leg from Ferrara to Nervesa della Battaglia, before the race heats up again with a climb up Monte Zoncolan on Saturday and a grueling leg through the Dolomite Range on Sunday.
The race ends in Rome on May 27.
Copyright 2018 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.