base64解码函数可以接受的字符范围是[A-Za-z0-9+/=],但是如果php的base64_decode遇到了不在此范围内的字符,php就会直接跳过这些字符,只把在此范围的字符连起来进行解码。

我们来做个试验:

1
`$i` `= 0 ;``$data` `= ``"upload_progress_ZZ"``;``while``(true){``  ``$i` `+= 1;``  ``$data` `= ``base64_decode``(``$data``); ``  ``var_dump(``$data``);``  ``sleep(1);``  ``if``(``$data` `== ``''``){``    ``echo` `"一共解码了:"``.``$i``,``"次\n"``;``    ``break``;``  ``}``}`

运行结果如下:

1
`string(12) "��hi�k�``޲�Y"``string(3) ``"�)"``string(0) ``""``一共解码了:3次`

upload_progress_ZZ一共是18个字符,但是由于base64_decode跳过了_,所以是剩下16个字符,解码一次之后是12个字符,又因为12个字符中只有4个在范围内,所以再次解码之后变为了3个字符,这三个字符都不在范围内,所以解码之后为空字符串。

hitcon2018 one-line-php-challenge