And is there a convenience store which sells Oyster near every station in the zones if there are no TfL stations nearby? A visitor will be doomed if his intention is to use a London Bus to visit the suburb but he has no contactless and nowhere to buy an Oyster near his entry station into London, especially if he is transferring at a smaller zone 4/5/6 station instead of somewhere as busy as Clapham Junction where I can expect a convenience store on a street.
You can find Oyster ticket stop locations here: https://tfl.gov.uk/maps/oyster-ticket-stops . I had a look around south of the river and the vast majority of stations had Oyster ticket stops right next door, as to be expected from the correlation between stations, shops, and where many people go.
I did find a few stations that have a bus stop within 2 minutes' walk but to get to an Oyster ticket stop you'd have to walk 5-6 minutes (e.g. North Dulwich, Tolworth, Syon Lane, Teddington, South Merton, Morden South and Reedham) or even 10 minutes (e.g. Ewell East, Coulsdon South, Whyteleafe South and Mitcham Junction). (Although on closer inspection, the Southern website says that at North Dulwich and Coulsdon South, "Pre-loaded Oyster Cards can be purchased at the ticket office".)
On the very outskirts of the Rail & Tube map there are no Oyster ticket stops at all around Knockholt, Chessington South, and some stations on the Tattenham Corner branch, the Epsom Downs branch, and the outside-of-normal-zones line to Gatwick Airport, but many of these stations don't have TfL buses around anyway.
With foresight, in many cases you could avoid the walk of doom without too much added effort/time/cost by e.g. disembarking at an earlier station to buy your Oyster card at an adjacent Oyster ticket stop and then either continuing by bus from there or resuming the train journey. But I do think it's a reasonable assumption that train stations where Oyster cards are valid do sell Oyster cards, so I can't really fault passengers for assuming this without checking and then getting caught out...