Webb (14-9) allowed a season-high six earned runs in 5 1/3 innings and had his six-game winning streak snapped. It was his shortest outing since June 22, when he lasted five innings in a 7-1 loss to Baltimore.
"We beat a good pitcher today," Cameron said. "It's going to take that down the stretch in order for us to approach the goal we need to get to, a chance to play in the postseason."
The Padres, trying to win their third straight division title, have won the first two games in the four-game series. San Diego has won seven of nine overall and is back to a game behind Arizona for the first time since Aug. 7. San Diego had a one-game lead at the All-Star break, over the Los Angeles Dodgers, with the Diamondbacks 3½ back in third. The Padres continue to lead the wild-race by three games over Philadelphia.
The Padres and Diamondbacks will play each other seven times in a 10-day stretch, with a three-game series starting in Phoenix on Monday.
"We've lost two games. It's not the end of the world," said Arizona manager Bob Melvin, who was ejected in the sixth for arguing a call at first base.
"We just need to forget about these and concentrate," said Conor Jackson, who had three hits, including a homer, and two RBI for the Diamondbacks. "If we can win the next two, we leave here with the same lead we came in with."
Trevor Hoffman pitched a perfect ninth for his 35th save in 40 chances, extending his career record to 517.
The game fell apart for the Diamondbacks in the sixth, when they lost their lead, Melvin and then Webb.
Leading 3-2, Webb gave up Cameron's 18th homer, a leadoff shot to left on a 1-1 pitch. Milton Bradley walked, Adrian Gonzalez singled to right and Khalil Greene singled to left to give San Diego a 4-3 lead with runners on first and second.
Webb fielded Kevin Kouzmanoff's bunt and started to go to third but realized he wouldn't get Gonzalez. Webb spun and threw to first, and Kouzmanoff was ruled safe by first base umpire Lance Barksdale, loading the bases.
Melvin came out to argue and was ejected by Barksdale.
"I still don't know why I got thrown out," Melvin said. "He said, 'We better get it right,' that he didn't have a great angle. He said he was going to ask to make sure he got it right. When he came back to me, I said, 'How are we going to get it right?' and I was out."
Josh Bard hit an RBI single up the middle, Geoff Blum popped out to shortstop and Rob Mackowiak, pinch-hitting for Justin Germano (7-7), was hit by a pitch on the elbow to bring in another run and chase Webb. Tony Pena came on and struck out Brian Giles and Cameron.
Webb allowed seven hits, struck out four and walked three.
For the first time in more than a month, Webb didn't have it.
"It was not real good from the start, even in the bullpen," Webb said. "I didn't feel too sharp. I didn't make the big pitches. All of that combined, I didn't do too much."
Cameron said he waited for the ground ball specialist to make a mistake.
"He finally got one up, got one over the plate," Cameron said. "That's the key is getting balls on the plate and you can see the ball pretty well."
Germano beat Webb for the second time in their three matchups this year. He allowed three runs and seven hits in six innings, struck out four and walked three. Germano won for the first time since July 15, snapping a string of four losses in seven starts.
After Jackson hit an RBI double with two outs in the first, San Diego took a 2-1 lead on Greene's RBI double and Bard's sacrifice fly in the second. The Diamondbacks went ahead 3-2 in the fourth when Webb doubled in rookie Justin Upton.
Webb was making his first start since his shutout streak ended at 42 innings. He fell to 4-7 lifetime against San Diego and to 2-3 at Petco Park.
Jackson homered to left off Doug Brocail with two outs in the seventh, his 11th.
- Padres All-Star RHP Chris Young said his back feels fine and he's scheduled to start Thursday night's series finale. The 6-foot-10 right-hander was forced to leave his start at the New York Mets a week earlier after five innings because of lower back pain. He returned to San Diego to have his back checked and missed his scheduled start Sunday at Philadelphia.
- Bradley broke his bat over his knee after striking out to end the third, getting a rise out of some of the fans.
- The game drew a crowd of only 23,006.