QIBO /do/jf.php EvilCode Execution Injected By /hack/jfadmin/admin.php
catalog
. 漏洞描述
. 漏洞触发条件
. 漏洞影响范围
. 漏洞代码分析
. 防御方法
. 攻防思考
1. 漏洞描述
这个漏洞的成因简单来说可以归纳为如下几点
. 类似于ECSHOP的的模版代码编译功能,QIBO允许在文章中添加指定格式的模版代码
. 在显示文章的时候,QIBO会使用: eval("\$rs2[title]=\"$rs2[title]\";");方式对模版动态变量进行赋值
. 黑客可以通过XSS、CSRF劫持管理员向数据库中注入恶意代码: ${@fwrite(fopen('ali.php', 'w+'), 'test’)}
. 由于PHP的动态执行特性,eval赋值的时候,在双引号中的代码会被动态执行,从而导致原本的变量赋值变成了代码执行入口
Relevant Link:
2. 漏洞触发条件
攻击向量
. 黑客需要向{$pre}jfabout数据表注入恶意代码
) 黑客直接拿到管理员密码,登录了后台
) CSRF
) XSS攻击
. 文章显示的时候,对模版变量进行解析,未对模版内容本身进行有效的过滤、恶意判断
0x1: POC
http://localhost/qibo/admin/index.php?lfj=jfadmin&action=addjf
POST:
title=test&content=${@fwrite(fopen('ali.php', 'w+'), 'test’)}&list=1 或者普通用户访问/do/jf.php,即可在do目录下生成ali.php文件

3. 漏洞影响范围
4. 漏洞代码分析
/do/jf.php
<?php
require(dirname(__FILE__)."/"."global.php"); $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]); $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
while($rs = $db->fetch_array($query))
{
$fnameDB[$rs[fid]]=$rs[name];
$query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");
while($rs2 = $db->fetch_array($query2))
{
/*
1. 用于变量赋值的客体用双引号包裹,PHP curl syntax(${${}})可以执行
2. 未对模版内容进行转义处理,存在闭合注入的可能
*/
eval("\$rs2[title]=\"$rs2[title]\";");
eval("\$rs2[content]=\"$rs2[content]\";");
$jfDB[$rs[fid]][]=$rs2;
}
} require(ROOT_PATH."inc/head.php");
require(html("jf"));
require(ROOT_PATH."inc/foot.php"); ?>
/hack/jfadmin/admin.php
//通过这个向量黑客可以向{$pre}jfabout数据表注入恶意代码
..
elseif($action=="addjf"&&$Apower[jfadmin_mod])
{
$db->query("INSERT INTO `{$pre}jfabout` ( `fid` , `title` , `content`, `list` ) VALUES ( '$fid', '$title', '$content', '$list' )");
jump("添加成功","index.php?lfj=jfadmin&job=listjf&fid=$fid",);
}
..
5. 防御方法
/do/jf.php
<?php
require(dirname(__FILE__)."/"."global.php"); $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]); $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
while($rs = $db->fetch_array($query)){
$fnameDB[$rs[fid]]=$rs[name];
$query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");
while($rs2 = $db->fetch_array($query2)){
//eval("\$rs2[title]=\"$rs2[title]\";");
//eval("\$rs2[content]=\"$rs2[content]\";");
$rs2[title] = addslashes($rs2[title]);
$rs2[content] = addslashes($rs2[content]);
eval("\$rs2[title]='$rs2[title]';");
eval("\$rs2[content]='$rs2[content]';");
$jfDB[$rs[fid]][]=$rs2;
}
} require(ROOT_PATH."inc/head.php");
require(html("jf"));
require(ROOT_PATH."inc/foot.php"); ?>
代码防御的关键点主要如下
. 将eval赋值语句内的双引号改为单引号,禁止其PHP动态执行特性
. 在参数外层包裹addslash,防止黑客注入进行闭合
6. 攻防思考
Copyright (c) 2015 LittleHann All rights reserved
QIBO /do/jf.php EvilCode Execution Injected By /hack/jfadmin/admin.php的更多相关文章
- NetBpm XML解读(5)
原文: nPdl的翻译 在看NetBPM的nPdl文档时做了个翻译,一来是让自己能更好的理解nPdl,二来是希望能得到关心NetBPM的同志的指导. 由于对工作流不熟悉,所以有不少术语翻译没有把 ...
- AOP aspect XML 配置
/** * 00配置接入点:定义一个切入点 * execution(* com.foen.foensys.controller..*.*(..))") "*" 第一个* ...
- Spring Boot -- Spring AOP原理及简单实现
一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...
- struts2 CVE-2013-1965 S2-012 Showcase app vulnerability allows remote command execution
catalog . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch Fix 1 ...
- CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 这次的CVE和 ...
- Microsoft Windows 2003 SP2 - 'ERRATICGOPHER' SMB Remote Code Execution
EDB-ID: 41929 Author: vportal Published: 2017-04-25 CVE: N/A Type: Remote Platform: Windows Aliases: ...
- 执行监听器( Execution listener)
相关类: org.activiti.engine.delegate.ExecutionListener org.activiti.engine.delegate.TaskListener org.ac ...
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- Error:Execution failed for task ':app:clean'.
运行时出现 Error:Execution failed for task ':app:clean'. 错误,Builld->Clean Project即可.
随机推荐
- Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...
- 初中级Web开发人员的福音:《JavaScript启示录》上市了
经历过14个月的等待,本书终于上市了,完全口语化叙述,请参考右边的链接. 本书介绍 本书无关于JavaScript设计模式,也无关于JavaScript面向对象代码实现.本书的写作目的也不是鉴别Jav ...
- 在线文档预览方案-office web apps
最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...
- <实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理
[root@localhost~]#序言 我们平时不论是买一个U盘硬盘,或者自己在电脑上创建一个分区,大小总是比我们创建的要小一点,有些人会说,这个正常啊,是因为厂家规定的1M=1000k,真正的是1 ...
- Java 的世界,我不懂:奇葩的 json 序列化
先上张图,代表我心中的十万头草泥马: 写这么长的代码,头回见数组和单个实体共用同一个 json 节点的! 恐怕只有 java 社区的大牛B 才能做出这等事.. 由 Apache 发布: http:// ...
- Orchard搜索与索引
Orchard提供了索引与搜索的功能.开启Indexing属性可实现索引功能,伴随着一个特定的索引执行(默认包含基础搜索引擎).除了Indexing和Search提供查询索引的功能外(通过关键字或使用 ...
- 备忘:powerbroker运行一个命令
pbrun su<space>-<space><taget user name> example: pbrun su - pmsdev
- Win7 64bit下32bit的 ODBC 数据源问题
win764位有数据源,但是如果我们在win7 64bit中使用32位的数据源的时候,我们就需要对其进行配置,很有趣的是,64为的数据源我们可以在控制面板——系统与安全——管理工具——数据源,进入可对 ...
- XML是什么东西
记住,XML就是为数据传输而设计的一种标记语言,也是特么的一种标记语言,在这点上,和html是有点类似的,你看<xml>和<html>看上去难道不是很像嘛,而html是为数据显 ...
- Java--笔记(2)
11.根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件: 1)互斥条件(Mutual ...