Pep Guardiola's men were stunned when Brazilian Pato burst clear in the opening moments to fire coolly under Barcelona keeper Victor Valdes and give the Italians the lead in Group H.
Barcelona stormed back with Lionel Messi clattering a free-kick against the woodwork before the Argentinian brilliantly teed up the equaliser for Pedro after 36 minutes.
With Barca in cruise control a second goal seemed inevitable and it came after 50 minutes through a brilliant David Villa free-kick before both Messi and Pedro came close to adding a third.
But the hosts were punished for their failure to put the game beyond doubt three minutes into injury time when Thiago headed home a Clarence Seedorf corner to earn Milan a point in a 2-2 draw.
In the other game in Group H, Champions League debutants Plzen fought out a 1-1 draw with Belarusian side BATE Borisov in Prague.
Marek Bakos put the hosts ahead on the stroke of half-time and Brazilian Renan equalised for the visitors in the 69th minute.
Fernando Torres failed to break his goal drought for Chelsea in their Group E opener against Bayer Leverkusen, but the Spaniard was the driving force behind his side's impressive 2-0 victory.
Torres made a storming start, with two fine chances and a goal disallowed inside the opening 10 minutes, and his superb pass set up David Luiz to lash home the opener after 67 frustrating minutes.
The Germans pushed for an equaliser with former Stamford Bridge favourite Michael Ballack forcing a fine save from Petr Cech before Torres was again instrumental in Chelsea's second, releasing Juan Mata to make it 2-0 deep into injury time.
There was further good news for Chelsea in Group E as Valencia failed to break through a resolute Genk defence at the Cristal Arena in Belgium and were forced to settle for a goalless draw.
Ivan Perisic earned Borussia Dortmund a deserved point in their Group F clash with Arsenal at Signal Iduna Park just when Arsene Wenger's men looked set to claim a fortunate win.
The hosts dominated throughout with Shinji Kagawa firing a great chance over and Robert Lewandowski rounding Wojciech Szczesny only to see his effort booted off the line.
The Gunners grabbed their opener out of nowhere three minutes before the break when captain Robin van Persie pounced on a mistake by Sebastian Kehl to play a neat one-two with Theo Walcott before firing home.
But Dortmund's near-relentless pressure finally paid off two minutes from full-time when Marcel Schmelzer's free-kick was only half-cleared and fell to substitute Perisic who volleyed home from the edge of the box.
In the same group, Marseille grabbed a valuable 1-0 win over Olympiakos in Greece thanks to a 51st minute strike from Luis Gonzalez. Marseille had substitute Rod Fanni sent off in injury time.
Porto had to come from behind to see off nine-man Shakhtar Donetsk with a 2-1 victory in a controversial opener in Group G.
Brazilian Luiz Adriano fired the Ukrainians ahead after 13 minutes after Hulk had missed a penalty for the hosts, but the Porto striker finally got on the scoresheet with a 28th-minute equaliser.
Yaroslav Rakitskiy was the first Shakhtar player to see red five minutes before the break and Brazilian Kleber put Porto ahead six minutes into the second half. Dmytro Chygrynskiy was sent off for a second booking 10 minutes from time.
Also in Group G, Zenit St Petersburg blew a 1-0 lead to fall 2-1 to APOEL Nicosia in Cyprus.
After a goalless opening period Konstantin Zyryanov put the Russians ahead after 63 minutes but two goals in three minutes from Gustavo Manduca and Ailton turned the game on its head before Zenit's Bruno Alves was sent off late on.
Barcelona 2-2 AC Milan
Borussia Dortmund 1-1 Arsenal
Chelsea 2-0 Bayer Leverkusen
Porto 2-1 Shakhtar Donetsk
Olympiakos 0-1 Marseille
APOEL 2-1 Zenit St Petersburg
Viktoria Plzen 1-1 BATE Borisov