Your approach should be two-fold:
Technical:
Check for:
- Various escape sequences (e.g. \x00, %s, \\, etc.)
- Unicode tricks (e.g. multi-byte characters that end in 0x22 to produce a ")
- Alternative XSS methods (e.g.
<img src=0 onerror=alert(1) />
instead of <script>alert(1)</script>
)
- Various nasties (e.g. XSS, SQL injection) inside of cookies and HTTP headers - often WAFs miss these!
Advisory:
Ensure that the client understands that a WAF is just a sticking plaster, and cannot fix a broken limb. If the application is broken in an exploitable way, a WAF may prevent the attack or mitigate some of the impact, but there is no way to be sure if it will be effective.
It is also a double-edged sword, in that people often assume that a bug that a WAF makes unexploitable will always be unexploitable, and therefore doesn't need to be fixed (at least with any haste). Browsers and HTML / CSS / JavaScript / SQL / XML / server-side languages, etc. evolve constantly, so new exploit techniques may come along that make old bugs exploitable.
One additional point I'd like to make: if the test is aimed at the web-app, and not specifically aimed at the WAF solution they have deployed, then I would highly recommend asking the client to disable the WAF on their staging site for the duration of the test. Leaving it on makes it much harder for you to give them a reasonable estimate of the security posture of the application, and that means they get less value from the test. If they're really interested in testing the WAF, they could do an additional test day afterwards that compares the exploitability of the found issues with and without the WAF being enabled.