紹卻傲慢地拒絕了這一出奇製勝的建議,繼續與曹操相持。許攸見袁紹不采用他的意見,便星夜離開袁紹,投奔曹操。許攸是曹操的故友,受到曹操的熱情接待。許攸向曹操獻計說:“袁紹的糧草有一萬多車屯於烏巢,屯軍防備不嚴,如果以精兵襲擊,出其不意地燒掉他的糧草,不出三天,袁紹必敗。”許攸的建議,是曹操尋找戰機出奇製勝的一著,便立即實行。曹操教苟攸、賈詡、曹洪同許攸守大寨,令夏侯惇、夏侯淵領一軍伏於左,曹洪、李典領一軍伏於右,以備不測。教張遼、許褚在前,徐晃、於禁在後,曹操自引諸將居中,共五千人馬,打著袁軍的旗號,於黃昏時分,向烏巢進發。途中,曹軍詭稱是袁紹為鞏固後路調派的援軍,騙過了袁軍的盤問。到達烏巢後,立即放火燒糧。袁軍大亂,淳於瓊倉促應戰。袁紹得知這情況後,又做出了錯誤的決策。他認為這是攻下官渡的好機會,命令高覽、張邰等大將領兵去攻打曹軍大營。張邰指出這樣做很危險,如果烏巢有失,事情就不好辦了,主張先救烏巢。謀士郭圖迎合袁紹的意圖,堅決主張攻打曹營,認為攻打曹營使曹操引兵回救,烏巢之圍就會自解。袁紹便派少量軍隊救援烏巢,而以主力攻打官渡的曹營。由於曹操事前已作了防備,袁軍攻打不下。曹操得知袁紹進攻自己大本營的消息,並沒有馬上回救,而是奮力擊潰淳於瓊的軍隊,決心將袁紹集存在烏巢的糧食全部燒光。當袁紹增援的騎兵迫近烏巢,曹操並未馬上分兵,而集中兵力與敵軍殊死決戰,大破淳於瓊軍,殺了淳於瓊,將全部糧草燒毀。
烏巢燒糧以後,袁軍軍心動搖,內部矛盾加劇。主張攻打曹營的郭圖怕追究自己的責任,就在袁紹麵前進讒言,說張邰為袁軍失敗而高興。張邰受到中傷,既氣憤又害怕,便與高覽一起燒毀戰具,投降了曹操。這使袁紹軍心更加惶惑,軍隊不戰自亂。許攸又勸曹操作速進兵,張邰、高覽請為先鋒。曹操即令張邰、高覽領兵往劫袁紹大寨。當夜三更時分出軍三路劫寨,混戰到天明,袁紹軍折其大半。苟攸獻計:“今可揚言調撥人馬,一路取棗陽,玫鄴郡;一路取黎陽,斷袁兵歸路。袁紹聞之,必然驚惶,分兵拒我,我乘其兵動時擊之,可破袁紹。”曹操用其計,使三軍四處揚言。袁紹聞之大驚,急遣袁譚分兵五萬救鄴郡,辛明分兵五萬救黎陽,連夜起行。曹操探知袁紹兵動,便分大隊人馬,八路齊出,直衝紹營。袁軍俱無鬥誌,四散奔逃。袁紹披甲不迭,單衣幅巾上馬,幼子袁尚後隨。張遼、許褚、徐晃、於禁四將引軍追趕袁紹。紹急渡河,儘棄圖書車仗金帛,隻引八百騎而去,袁軍被殲八萬餘人。官渡之戰,以曹勝袁敗而結束。