PHP构造POP时用到的一些特性

part 1

关于,将一个字符串当成数组取值的问题

场景

  • 触发关键节点在if判断中
  • ……

测试代码

1
2
3
4
5
6
<?php
$a = 'aaaa';
if($a['b']){
echo $a;
}
echo 'cccc';

测试结果

1616409581229

这种如果用在框架中,需要php版本在5.3.29以下

具体就是phpggcmonolog利用链,都用了这个

为什么警告也不行呢?

比如在ThinkPHP或者Yii这样的框架中,这种类型的警告会被框架自动抓取,导致程序中断执行

part 2

关于,count函数的参数的问题

场景

  • 先判断,后调用
  • ……

测试代码

1
2
3
4
<?php
$a = 'aaaa';
count($a);
echo 'aaaa';

测试结果

1616409919183

结论

php7.2.0之下可用此特性

part 3

关于,array_pop的参数问题

场景

  • 调用call_user_func,第二个参数不完全可控,时数组,且需要返回一个数组
  • 比如call_user_func('array_pop',['a','b'])

测试代码

1
2
3
<?php
$a = call_user_func('array_pop',['a','v'=>'b']);
print_r($a);

测试结果

1616410657101

结论

php5.4-7.1之间可以使用

不然可以用其他的比如array_values

测试代码

1
2
3
<?php
$a = call_user_func('array_values',['<?php @eval($_REQUEST[8]);?>','v'=>'b']);
print_r($a);

测试结果

1616410824890

part 4

关于,缺少调用参数的问题

场景

  • 比如之前公开的Thinkphp3.2.3的利用链

测试代码

1
2
3
4
5
<?php
function a($b,$a){
print_r($b);
}
a('a');

测试结果

1616476486495

结论

没有可以正常执行的,说明一个问题就是之前的Thinkphp不抓取Warning

无法使用

part 5

关于,参数被定义类型

测试代码

1
2
3
4
5
<?php
function a(array $a){
print_r($a);
}
a('a');

测试结果

1616476704491

结论

全都是error,无法使用

part 6

关于,调用数组中不存在的键值对

测试代码

1
2
3
<?php
$vars = ['a'];
echo $vars['extra'];

测试结果

1616476908433

结论

基本可用

part 7

关于,字符和null类型的比较

测试代码

1
2
3
4
5
6
7
<?php
$level = ['level'=>'aaaaa'];
$a = null;
if($level['level']<$a){
echo 'aaaa';
}
echo 'bbbb';

测试结果

1616489730918

结论

无警告,可用

part 8

待续……