I am regularly imaging a river corridor with two lakes, and have been dealing with this a bit. My best results are from masking the water or cutting it out, then filling holes. changing reflection on flat water, and bad matches on white water are common, so the surface is noisy, not very useful, if at all. You can use the amplitude of the noise to filter the water surface out - I have been limited to doing that with the processed DSM, though I am hoping I can figure out how to write a filter in meshlab.
The water I am working with is very turbid, so I haven't tried extracting bathymetry through the water surface, but I have found that you need a fair amount of land surface on at least one side of the water body to be able to generate matches. On forested areas it is the most challenging, since the relief is great - and it is better to have at least 60% overlap along track, with at least 30% of the across-track image showing shoreline in my experience.