常见漏洞关键字

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. echarts柱状图圆角实现

    series: [{ name: '销量', type: 'bar', barWidth : 30,//柱图宽度 data: [5, 20, 36, 10, 10, 20], itemStyle: { ...

  2. 图片三像素问题如何解决css

    一.提出问题 在浏览器中,图片有一个下间隙问题,有人也称之为图片3像素BUG 1.这并不是什么浏览器bug,而只是英文字母书写时有个基线的问题,基线决定了图片的对其方式.这才是造成浏览器中图片下间隙的 ...

  3. js判断一个时间是否在某一个时间段内

    很多时候,我们需要对时间进行处理: 比如说:获取当前的时间 判断某一个时间是否在一段时间内:如果在显示出某一个按钮: 让用户可以操作:如果不在,按钮隐藏 这个时候,我们就需要对时间进行处理了 < ...

  4. 【解决了一个小问题】vm-select中的`search.maxUniqueTimeseries`参数比vm-storage中的参数更大导致的问题

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了让vm查询更大的数据范围,修改了vm-select的参 ...

  5. [置顶] ES篇

    环境 第一篇: ES--介绍.安装 第二篇: ES--安装nodejs 第三篇: ES--插件 第四篇: ES--kibana介绍.安装 第五篇: ES--中文分词介绍.下载 第六篇: docker, ...

  6. 从零开始配置vim(28)——DAP 配置

    首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接.背面试题准备面试.好在最终找到了工作,也顺利入职了.期间也有朋友在催更,在这里我对关注本系列的朋友表示感谢.多的就不说了,我们正式进 ...

  7. MySQL【二】---数据库查询详细教程{查询、排序、聚合函数、分组}

    1.数据准备.基本的查询(回顾一下) 创建数据库 create database python_test charset=utf8; 查看数据库: show databases; 使用数据库: use ...

  8. C/C++ 提权与强制卸载DLL

    权限提升 #include <Windows.h> #include <stdio.h> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BO ...

  9. 俄大神 lopatkin Windows 精简优化系统 - 工具软件

    昨天有个网友邮件我,说是想找个Tiny7 Rev2的ISO操作系统文件,但是我找了下,以前的那些文件有些已经删除了,所以就在网上搜到了俄大神 lopatkin Windows 精简优化系统,特此放到网 ...

  10. C语言中如何使两个整型变量计算出浮点型结果

    遭遇的问题 在学习时有一个课后题要求计算两个变量的加减乘除以及取余,想到除法可能会计算出小数,就用浮点型接收除法的结果 int a,b: double div; div = a / b; 但是算出来的 ...