On further investigation, I think this may be a bug in admin-themes.php -- the jQuery to launch the theme copy says:
`launchScript('',['action=copytheme&XSRFToken=<?php echo getXSRFToken('theme')?>','source='+encodeURIComponent(source),'target='+encodeURIComponent(targetdir),'name='+encodeURIComponent(targetname)]);`
...which seems to be causing the XSRFToken parameter actually to be received under the name `amp;XSRFToken`.
Is this maybe because it would need to be entity-encoded in HTML, but not in the JavaScript? Copy-and-paste error, maybe?
Not too sure I'm right, though, but I'm going to keep fiddling.
Cheers,
Matt