Button started fifth on the grid but stole a yard on his rivals with a brave tyre call on his way to a second victory of the season.
As the rain began to fall, the reigning world champion opted to stay on slicks rather than pit for intermediates when the safety car appeared – a move, which saw him move up to second.
He then passed Nico Rosberg for the lead on lap 19 and held on to take the chequered flag and, with it, the overall lead in the drivers’ standings.
Hamilton started sixth on the grid and enjoyed his best drive of the season to push Button all the way in the driving rain and finish in second, while Rosberg held on for third.
Jubilant Button said: “This was my best victory in F1. “Every race you win becomes your best, but this was an extremely special win in very tough conditions. And it’s especially satisfying because it was a really dominant victory for the whole team.
“We scored a one-two today, and the reason we did so was that every single element within the team worked perfectly. From the strategy calls to the pit-stops, you need to get everything just right if you’re going to win in conditions like these. And today we did indeed get everything just right.”
Ferrari’s Fernando Alonso led on the first lap but a drive-through penalty for jumping the start, saw him settle for fourth, while seven-time world champion Michael Schumacher disappointed once again to clinch a solitary point for tenth.
Hamilton’s second place saw him draw level with Alonso in equal fourth in the standings, and he was gracious in defeat, full of praise for his team-mate. “I had quite an eventful race,” Hamilton added. “Congratulations to Jenson, he did an incredible job and made a better choice on tyres.”
Meanwhile, Hamilton and Red Bull’s Sebastian Vettel were reprimanded by race officials for a near collision in the pit lane, but both escaped penalty.