Georgia Southern (7-4) ran for 429 yards and didn't complete a pass all afternoon.
McKinnon finished with 125 yards rushing, including a 14-yard touchdown with 2:57 remaining. Ellison added 118 yards on the ground, scoring on runs of 45 and 1. Fullback William Banks also gashed the Gators, getting 94 yards up the middle. His 53-yarder on a third-and-2 play set up the winning score.
Florida had a chance to win it, thanks partly to two missed extra points.
Skyler Mornhinweg, making his second consecutive start in place of Tyler Murphy (shoulder), got the Gators in scoring territory, but his final two throws fell incomplete. He had Quinton Dunbar open in the corner of the end zone on third down from the 17, but his pass floated high. He tried to force one to Solomon Patton on the final play, but two defenders broke it up.
Georgia Southern's players rushed the field and celebrated wildly. They stopped long enough to pose for a team picture on the field, and then the party really started.
Florida, which paid Georgia Southern $550,000 for this game, was left to ponder the fate of coach Will Muschamp.
Athletic director Jeremy Foley and school president Bernie Machen said last week Muschamp was safe, but that was before the worst loss in school history and before there were thousands of no-shows in The Swamp.
The Gators have pinned their problems on a slew of injuries. But that doesn't work against Georgia Southern, which won its third consecutive game despite playing without 19 of 65 scholarship athletes.
Florida was beaten soundly — on both sides of the ball.
Georgia Southern ran wild from the triple-option formation.
McKinnon gained 66 yards on the first play of the second half, setting up Ellison's 1-yard plunge on fourth down. The touchdown put the Eagles up 14-10.
And that could have been enough against Florida's inept offense.
Mornhinweg was mostly ineffective, though he completed 14 of 25 passes for 122 yards and two touchdowns. He hooked up with Patton for a 46-yard score with 5:41 left that tied the game at 20.
But Florida's defense couldn't get a much-needed stop.
And on the final drive, the Gators started with a crucial penalty and some questionable clock-management issues.
Kelvin Taylor ran for 92 yards behind an offensive line that allowed steady pressure all day. And after Mornhinweg nearly threw two interceptions in the first quarter, the Gators stopped taking chances in the passing game until late.
Equally alarming as Florida's woeful offense was the team's defensive effort.
The Eagles gashed the Gators early and often, producing runs of 45, 53 and 66 yards. Eight Georgia Southern players had at least one run of 10 yards or longer.