Năm 1075, Vương An Thạch cầm quyền chính nhà Tống, tâu với vua Tống là Đại Việt bị Chiêm Thành đánh phá, quân còn sót lại không đầy vạn người, có thể dùng kế chiếm lấy được. Vua Tống sai Thẩm Khởi, và Lưu Di làm tri Quế Châu ngầm dấy binh người Man động, đóng thuyền bè, tập thủy chiến, cấm các châu huyện không được mua bán với Đại Việt.
Thái hậu Ỷ Lan biết tin, sai ông và Tôn Đản đem hơn 100.000 quân đi đánh. Quân bộ gồm 60.000 người do các tướng Tôn Đản, Thân Cảnh Phúc[17], Lưu Kỷ, Hoàng Kim Mãn, Vi Thủ An chỉ huy, tổng chỉ huy là Tôn Đản. Bộ binh tập trung ngay ở các châu Quảng Nguyên, Môn (Đông Khê), Quang Lang, Tô Mậu rồi tràn sang đánh các trại Vĩnh Bình, Thái Bình, Hoành Sơn, châu Tây Bình, Lộc Châu. Một cánh quân khác đóng gần biên giới Khâm châu cũng kéo tới đánh các trại Như Hồng, Như Tích và Đề Trạo, "quân ta tới đâu như vào nhà trống không người".[18]
Lý Thường Kiệt chỉ huy 40.000 quân thủy cùng voi chiến đi đường biển từ châu Vĩnh An (Quảng Ninh) đổ bộ lên đánh các châu Khâm, Liêm; Tông Đản vây châu Ung. Ngày 30 tháng 12 năm 1075, quân Đại Việt tiến chiếm thành Khâm Châu, bắt toàn bộ quan quân nhà Tống mà không phải giao chiến một trận nào. Ba ngày sau, 2 tháng 1 năm 1076, Liêm Châu cũng thất thủ[19].
Khi được tin hai châu Khâm, Liêm đã mất, nhà Tống rất hoang mang, lo ngại, các tướng ở địa phương bối rối. Ty Kinh lược Quảng Nam tây lộ vội vã xin viện binh: 20.000 quân, 3.000 con ngựa, xin thêm khí giới, đồ dùng và một tháng lương, và xin được điều động các dân khê động, tất cả lấy dọc đường từ Kinh châu đến Quảng Tây. Để điều khiển quân được mau chóng, ty ấy cũng xin dời đến thành Tượng, gần phía bắc Ung Châu[20].
Trong lúc bối rối, triều đình Tống đối phó rất lúng túng. Vua Tống cách chức Lưu Di và sai Thạch Giám thay coi Quế Châu và làm Kinh lược sứ Quảng Tây.
Trên các mặt trận, quân Đại Việt hoàn toàn làm chủ. Lý Thường Kiệt cho đạo quân ở Khâm và Liêm Châu tiến lên phía Bắc. Đạo đổ bộ ở Khâm Châu kéo thẳng lên Ung Châu. Đường thẳng dài chừng 120 cây số, nhưng phải qua dãy núi Thập Vạn. Còn đạo đổ bộ ở Liêm Châu tiến sang phía đông bắc, chiếm lấy Bạch Châu, dường như để chặn quân tiếp viện của Tống từ phía đông tới. Hẹn ngày 18 tháng 1 năm 1076, hai đạo quân sẽ cùng hội lại vây chặt lấy Ung Châu.
Ung Châu là một thành lũy kiên cố, do tướng Tô Giám cùng với 2.800 quân cương quyết cố thủ.
Đô giám Quảng Tây nhà Tống là Trương Thủ Tiết đem quân đến cứu. Lý Thường Kiệt đón đánh ở cửa ải Côn Lôn (nay thuộc thành phố Nam Ninh, khu tự trị Quảng Tây) phá tan được, chém Trương Thủ Tiết tại trận.
Tri châu Ung là Tô Giám cố thủ không hàng. Quân Đại Việt đánh đến hơn 40 ngày. Sau cùng quân Việt dùng hỏa công, bắn các chất cháy như nhựa thông vào thành, trong thành thiếu nước, không thể chữa được cháy. Cuối cùng quân Đại Việt bắt dân Tống chồng bao đất cao đến hàng trượng để họ trèo lên thành. Ngày thứ 42, thành bị hạ, tướng chỉ huy Tô Giám tự thiêu để khỏi rơi vào tay quân Đại Việt[21]. Thường dân trong thành không chịu hàng nên bị quân nhà Lý giết hết hơn 58.000 người, cộng với số người chết ở các châu Khâm, Liêm thì đến hơn 100.000[21], tuy nhiên quân Đại Việt cũng tổn thất đến 10.000 người và nhiều voi chiến[20].
Lý Thường Kiệt chiếm xong thành Ung, lại lấy đá lấp sông ngăn cứu viện rồi đem quân lên phía Bắc lấy Tân Châu. Viên quan coi Tân Châu nghe thấy quân Đại Việt kéo gần đến thành liền bỏ thành chạy trốn[22]. Mục tiêu hoàn thành, Lý Thường Kiệt cho rút quân về.
Lý Thường Kiệt bắt sống người ba châu ấy đem về nước. Nhà Lý cho những người phương bắc đó vào khai phá vùng Hoan - Ái (Thanh - Nghệ).