常见漏洞关键字

SQL注入:select、insert、update、mysql_query、mysqli等

文件上传:$_FILES、type="file"、上传、move_uploaded_file()等

XSS跨站:print、print_r、echo、sprintf、die、var_dump、var_export等

文件包含:include、include_once、require、require_once等

代码执行:eval、assert、preg_replace、call_user_func、call_user_func_array等

命令执行:system、exec、shell_exec、``、passthru、popen等

变量覆盖:extract、parse_str、variables、$$等

反序列化:serialize、unserialize、__construct、__destruct等

其他漏洞:unlink、file_get_contents、show_source等

CNVD拿1day-RCE代码执行-ZZZPHP

根据CNVD平台,找到zzzphp存在命令执行漏洞。



有个参考链接,看一下。



要求我们首先登录后台,编辑search.html模板,加入“{if:assert($_POST[x])}phpinfo();{end if}”这段代码,然后访问search目录,并给x传参就会执行你传参的命令。复现一下。







复现成功。现在从源代码中找下原因。搜索eval关键词,只有一处,查看一下。



只有一个变量$ifstr,再往上找看到$ifstr是由变量$zcontent控制的,而$zcontent是调用parserIfLabel函数的传参,所以看下哪里调用了parserIfLabel函数。



发现是在ParserTemplate类里的parserCommom函数调用,看看哪里创建了ParserTemplate对象并且调用了parserCommom函数。

一处是/admin/save.php中的create_index函数。



这里$zcontent是通过读取$tplfile的文件获得,$tplfile=TPL_DIR.'index.html',不管TPL_DIR是哪个路径,但一定读的是index.html文件,不可由我们控制,故这里不行。

另一处是/inc/zzz_client.php中,有四个地方都调用了。



将这四处调用分为两类,第一处为一类,后面三处为一类。因为后三处的$zcontent都为load_file($tplfile,$location)。

追踪第一处$zcontent的来由。



当$location='user'时进入if循环,一开始$user_tpl为空,$uid从session中获取,如果$uid为空并且$act为reg、forget、login中的一种,则$user_tpl就根据$tplfile是否为文件来不同的赋值;如果$uid不为空且$act为userinfo或者其他情况,$user_tpl就为$incfile文件中的内容。然后把$user_tpl赋值给$zcontent。但根据尝试,此处不可行。

分析另外三处。$zcontent = load_file($tplfile,$location);跟进load_file函数。



该函数会载入对应路径的文件并返回文件内容。也就是载入此处传入的$tplfile变量中的路径的文件,并返回文件内容



跟踪$tplfile。



$tplfile的值是通过一个switch语句根据变量$location的值进行判断匹配然后赋值的,TPL_DIR为绝对路径。$location变量的值又是通过getlocation函数返回的。跟踪getlocation函数,此函数的作用就是返回get请求方式url中的最后一个文件名,例如:http://127.0.0.1/zzzphp/search.html返回的就是search



所以一开始就会在search.html文件中插入木马,实现任意命令执行。

分析: 1.当我们插入恶意语句后,getlocation函数获取url最后的文件名称为search赋值给变量$location 2.switch语句判断变量$location中的值为search,将当前绝对路径TPL_DIR和search.html拼接起来赋值给$tplfile变量 3.load_file函数去读取$tplfile变量中存放路径对应的文件的内容,并返回给$zcontent变量中 4.$zcontent变量当做参数传入parserCommom函数执行 5.parserCommom函数中定义将参数,也就是$zcontent变量,传入parserIfLabel函数来执行 6.parserIfLabel函数通过正则表达式将恶意代码{if:phpinfo()};{end if}进行匹配筛选,将筛选出来的字符串phpinfo()赋值给变量$ifstr 7.parserIfLabel函数通过eval将$ifstr中的恶意代码phpinfo()进行执行

CNVD拿1day-RCE命令执行-百家cms

根据CNVD平台,找到百家cms存在命令执行漏洞。



根据命令执行漏洞的关键函数,搜索system,总共找到5处。



一个一个查看,看哪个变量是可以由我们控制的,发现只有common.inc.php文件中的可以控制,具体代码如下。



$quality_command的前面会拼接一个"-quality",intval($scal)取的是整数值,所以$quality_command没什么用,看$file_full_path,它是传参过来的,所以需要看哪里调用了file_save函数,搜索file_save,总共有6处,一处是注释不用管。剩下5处先看common.inc.php中调用的。

第一处是file_upload函数调用。



"$file_full_path=WEB_ROOT . $path . $extpath. $filename;",其中

点击查看代码
WEB_ROOT=当前项目的绝对路径
$path = '/attachment/';
$extpath="{$extention}/" . date('Y/m/');
$filename = random(15) . ".{$extention}";





这些变量都不由我们控制,所以此处没用。再看common.inc.php中的其他几处。



都跟第一处一样,我们控制不了变量。所以在看最后一处。

源码如下:

setting.php

点击查看代码
<?php

$settings=globalSetting('weixin');

 if (checksubmit()) {
$cfg = array(
'weixinname' => $_GP['weixinname'],
'weixintoken' => trim($_GP['weixintoken']),
'EncodingAESKey' => trim($_GP['EncodingAESKey']),
'weixin_appId' => trim($_GP['weixin_appId']),
'weixin_appSecret' => trim($_GP['weixin_appSecret']),
'weixin_shareaddress'=> intval($_GP['weixin_shareaddress']),
'weixin_noaccess'=> intval($_GP['weixin_noaccess'])
); if (!empty($_FILES['weixin_verify_file']['tmp_name'])) {
$file=$_FILES['weixin_verify_file']; $extention = pathinfo($file['name'], PATHINFO_EXTENSION);
$extention=strtolower($extention);
if($extention=='txt')
{
$substr=substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'));
if(empty( $substr))
{
$substr="/";
}
$verify_root= substr(WEB_ROOT."/",0, strrpos(WEB_ROOT."/", $substr))."/"; //file_save($file['tmp_name'],$file['name'],$extention,$verify_root.$file['name'],$verify_root.$file['name'],false);
file_save($file['tmp_name'],$file['name'],$extention,WEB_ROOT."/".$file['name'],WEB_ROOT."/".$file['name'],false); if($verify_root!=WEB_ROOT."/")
{
copy(WEB_ROOT."/".$file['name'],$verify_root."/".$file['name']);
} $cfg['weixin_hasverify']=$file['name'];
}else
{
message("不允许上传除txt结尾以外的文件");
}
} $cfg['weixin_access_token']=""; refreshSetting($cfg,'weixin');
message('保存成功', 'refresh', 'success');
}
if(empty($settings['weixintoken']))
{
$isfirst=true;
} include page('setting');

此处$file_full_path=WEB_ROOT."/".$file['name'],WEB_ROOT是定值,所以看$file['name']可不可以被我们控制。$file=$_FILES['weixin_verify_file'],看下如何访问setting.php,再去考虑$file的值。先看登录进去后的界面的url。

http://127.0.0.1/baijiacms/index.php?mod=site&act=manager&do=store&op=display&beid=1

这一看就是mvc架构,act对应的是目录,do对应的是文件名,op对应的是操作。



尝试去访问setting.php,setting.php位于/system/weixin/class/web目录下,所以要访问它,act=weixin,do=setting。



在源代码里输出$file['name'],上传一个文件后看他输出的是什么。



这里只能上传txt结尾的文件。



输出如下



这就说明$file['name']为我们上传的文件名字,如果想要实现命令执行,就需要用到&或者|连接符。再看common.inc.php,需要满$settings['image_compress_openscale']不为空,才会执行system语句。



全局搜索image_compress_openscale,总共4处。



主要看netattach.php,如果image_compress_openscale的value为1时,就不会为空了。



找到该文件的位置,将这个开关开启。





将文件名改为&whoami&1.txt,上传。成功执行命令。

PHP项目&RCE安全&调试&追踪&代码执行&命令执行的更多相关文章

  1. php中代码执行&&命令执行函数

    转自i春秋 1.eval()函数 #传入的参数必须为PHP代码,既需要以分号结尾. #命令執行:cmd=system(whoami); #菜刀连接密码:cmd <?php @eval($_POS ...

  2. pikachu-远程代码、命令执行漏洞(RCE)

    一.RCE概述 1.1 什么是RCE? RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 1.2 远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要 ...

  3. PDB调试python代码常用命令

    常用命令 where(w) 找出当前代码运行位置 list(l) 显示当前代码的部分上下文 list n(line number) 显示指定行的上下文 list m, n(line number) 显 ...

  4. 风炫安全web安全学习第三十节课 命令执行&代码执行基础

    风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...

  5. [WEB安全]代码/命令执行总结

    0x01 代码执行 1.1 概念 远程代码执行实际上是调用服务器网站代码进行执行. 1.2 常见执行方法 eval eval():将字符串当做函数进行执行(需要传入一个完整的语句) demo: < ...

  6. 文件包含上传漏洞&目录遍历命令执行漏洞

    文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create_function() array_map() arr ...

  7. thinkphp学习笔记3—项目编译和调试模式

    原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并 ...

  8. 跟angular2学一键开启项目--关于上个react-redux项目的一键调试

    一键调试类似于webpack的hot-loader,但是这个hot-loader并不怎么好用,想省事的同学可以配置一下就完了. 今天介绍browser-sync,用它来一键开启项目.它可以监听任意文件 ...

  9. PyCharm Django项目开发的调试方法

    下面介绍两种PyCharm Django项目开发的调试方法: 方法一: 1. 使用PyCharm 自带的django项目Debug工具, 当然前提条件是django项目环境已经搭建好了. 2. 在代码 ...

  10. 关于Scrapy爬虫项目运行和调试的小技巧(上篇)

    扫除运行Scrapy爬虫程序的bug之后,现在便可以开始进行编写爬虫逻辑了.在正式开始爬虫编写之前,在这里介绍四种小技巧,可以方便我们操纵和调试爬虫. 一.建立main.py文件,直接在Pycharm ...

随机推荐

  1. vue中设置props参数类型

    props参数的使用 在使用vue的项目开发的过程中 经常会定义大量的组件使用 这个时候组件中的定义的数据类型就非常重要了 此时我们需要定义组件中需要的数据类型 之前我只知道简单的几个 今天忽然发现原 ...

  2. vm-storage在全部都是新metric情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 vm-storage中,写入索引的性能要比写入data p ...

  3. 驱动开发:Win10枚举完整SSDT地址表

    在前面的博文<驱动开发:Win10内核枚举SSDT表基址>中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则 ...

  4. Intel(R) Ethernet Controller X710驱动升级

    环境 CentOS Linux release 7.9.2009 (Core) 升级 先查看原驱动版本 [root@xcdcs ~]# lspci |grep net 01:00.0 Ethernet ...

  5. 【算法】priority_queue在力扣题中的应用 | 力扣692 | 力扣347 | 力扣295 【超详细的注释和算法解释】

    说在前面的话 博主也好长一段时间没有更新力扣的刷题系列了,今天给大家带来一些优先队列的经典题目,今天博主还是用C++给大家讲解,希望大家可以从中学到一些东西. 前言 那么这里博主先安利一下一些干货满满 ...

  6. 关于Oracle多租户架构下的每个PDB的dbtime查询

    有客户咨询在19c多租户这样的架构中,除了查询cdb本身外,还想查询具体pdb的负载(DB Time),但是使用之前的脚本发现查询不到,只显示cdb自己的结果,客户写的脚本如下: SELECT i.i ...

  7. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记

    任务16:oauth2 + oidc 实现 client部分 实现 client 之前启动一下上一节的 server,启动之前需要清除一些代码 注释 Program 的 MigrateDbContex ...

  8. HASHTEAM香山杯2023WP

    目录 前言 misc 签到题 web PHP_unserialize_pro Re URL从哪儿来 hello python pwn Move pwthon 附上c-python调试方法 crypto ...

  9. NC23413 小A买彩票

    题目链接 题目 题目描述 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的. ...

  10. 【Unity3D】角色控制器(CharacterController)

    1 简介 ​ 控制角色移动的组件主要有:Transform 组件.Rigidbody 组件.CharacterController 组件.Transform 组件通过控制角色位置实现移动,Rogidb ...