"This was one of those days I should have gotten hit around harder more than I did," Buehrle said. "I got lucky. My control wasn't what I wanted it to be."
Making his first start since earning the win as the American League's starter in Tuesday's All-Star game, Buehrle (11-3) gave up two runs and three hits, striking out six without a walk.
Aaron Rowand had three hits and scored three times as Chicago improved to 9-3 against Cleveland and 29-5 against the AL Central.
Aaron Boone had two RBI for the Indians, who lost for the eighth time in nine games and scored only three runs in the first 26 innings of the series before putting together a three-run rally with two outs in the ninth.
Buehrle won for the first time in three starts. The left-hander was in command except for hitting two batters with pitches -- the only men he has hit in 143 innings this season.
With two outs in the first, Buehrle hit Hafner in the right cheek, ending a streak of 229 1/3 innings without hitting a batter since Aug. 4, 2004. That batter also was Hafner.
"It was a sinker," Buehrle said. "If I'm going to hit someone, I'm not going to go for his head. It slipped out of my hand. I hope he's all right."
Hafner had some bleeding inside his mouth and was taken to a hospital for tests, including a CAT scan and dental examination.
"I'm optimistic that it is nothing too serious," Indians manager Eric Wedge said. "Haf's a tough one, but you don't want to take any chances. Hopefully he will be OK."
Cleveland starter Jake Westbrook (6-12) hit Jermaine Dye in the left knee with a pitch with two outs and none on in the second. Plate umpire Bruce Dreckman issued warnings to both benches, but it was Westbrook who paid the price when Dye stole second and scored on a double by Joe Crede.
"If you know baseball, you know if something is going to happen, it's going to happen right away," Dye said. "You don't like it, but it's part of the game. You do your job. You go to first and hope someone can knock you in."
Buehrle hit Casey Blake in the right knee with a breaking pitch to start the fifth, but there were no other incidents. Blake went to third on a double by Ronnie Belliard, and Boone and Josh Bard had run-scoring groundouts to get Cleveland within 6-2.
Westbrook lost his third straight start after a four-game winning streak. The right-hander allowed six runs -- four earned -- in five innings.
"I had pretty good stuff, but it is frustrating for a sinkerball pitcher when the other team hits balls just out of reach," Westbrook said.
A.J. Pierzynski and Dye drove in runs in Chicago's three-run fifth when an error by second baseman Belliard helped the White Sox score two unearned runs.
Pierzynski had an RBI double to make it 7-2 in the seventh. Boone had an RBI single in the ninth.
- There was a 30-minute rain delay in the top of the ninth.
- Buehrle is 12-1 with a 2.70 ERA in his last 19 daytime starts since the start of the 2004 season.
- Buehrle pitched at least six innings for the 47th consecutive time, the longest streak by a White Sox pitcher since RHP Jack McDowell 's 48-game streak July 4, 1992 to Sept. 6, 1993.
- Cleveland put RHP Matt Miller on the 15-day disabled list with tightness in his right forearm.
- RHP Kazuhito Tadano was recalled from Triple-A Buffalo and gave up one run over four innings in relief of Westbrook.
- Chicago SS Juan Uribe went 0-for-4 and is hitless in his last 18 at-bats.
- The White Sox are 5-1 at Jacobs Field and 30-14 on the road.