热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpissign为false,phpshe注入漏洞(目测通杀)

起因文件include\plugin\payway\alipay\return_url_db.php:这是一个付款的调用文件$alipayNotifynewAlipayNotify

起因文件include\plugin\payway\alipay\return_url_db.php:这是一个付款的调用文件$alipayNotify = new AlipayNotify($alipay_config);

$verify_result = $alipayNotify->verifyReturn();

//验证成功

if ($verify_result) {

//商户订单号

$out_trade_no = $_GET['out_trade_no'];

echo $out_trade_no;

//支付宝交易号

$trade_no = $_GET['trade_no'];

$info = $db->pe_select('order', array('order_id'=>$out_trade_no));

if ($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {

if ($info['order_state'] == 'notpay') {

$order['order_outid'] = $trade_no;

$order['order_payway'] = 'alipay_db';

$order['order_state'] = 'paid';

$order['order_ptime'] = time();

$db->pe_update('order', array('order_id'=>$out_trade_no), $order);

}

一般我会先去证明漏洞是否存在然后再看上面的验证条件(首先这里肯定不是必须管理员情况下才能够利用),这里用了最简单的GET获取直接带入pe_select(跟人)public function pe_select($table, $where = '', $field = '*')

{

//处理条件语句

$sqlwhere = $this->_dowhere($where);

return $this->sql_select("select {$field} from `".dbpre."{$table}` {$sqlwhere} limit 1");

}

继续跟进_dowhereprotected function _dowhere($where)

{

if (is_array($where)) {

foreach ($where as $k => $v) {

$k = str_ireplace('`', '', $k);

if (is_array($v)) {

$where_arr[] = "`{$k}` in('".implode("','", $v)."')";

}

else {

in_array($k, array('order by', 'group by')) ? ($sqlby = " {$k} {$v}") : ($where_arr[] = "`{$k}` = '{$v}'");

}

}

$sqlwhere = is_array($where_arr) ? 'where '.implode($where_arr, ' and ').$sqlby : $sqlby;

}

else {

$where && $sqlwhere = (stripos(trim($where), 'order by') === 0 or stripos(trim($where), 'group by') === 0) ? "{$where}" : "where 1 {$where}";

}

return $sqlwhere;

}

可以看到这里面并没有应用到安全函数,只是对内容进行一些简单的链接,分割等操作public function sql_select($sql)

{

$row = array();

return $row = $this->fetch_assoc($this->query($sql));

}

而在sql_select函数中就直接执行查询了,所以可以肯定漏洞存在,那么现在就是绕过上面的判断

跟进verifyReturn看看

判断文件:/include/plugin/payway/alipay/lib/alipay_notify.class.phpfunction verifyReturn(){

if(empty($_GET)) {//判断POST来的数组是否为空

return false;

}

else {

//生成签名结果

$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);

//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)

$responseTxt = 'true';

if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}

//写日志记录

//if ($isSign) {

// $isSignStr = 'true';

//}

//else {

// $isSignStr = 'false';

//}

//$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";

//$log_text = $log_text.createLinkString($_GET);

//logResult($log_text);

//验证

//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关

//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关

if (preg_match("/true$/i",$responseTxt) && $isSign) {

return true;

} else {

return false;

}

}

}

函数开始先判断GET是否为空,我们跟入看看function getSignVeryfy($para_temp, $sign) {

//除去待签名参数数组中的空值和签名参数

$para_filter = paraFilter($para_temp);

//对待签名参数数组排序

$para_sort = argSort($para_filter);

//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串

$prestr = createLinkstring($para_sort);

$isSgin = false;

switch (strtoupper(trim($this->alipay_config['sign_type']))) {

case "MD5" :

$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);

break;

default :

$isSgin = false;

}

return $isSgin;

}

前面三个函数都是对我们GET进来的数组进行整理与链接的操作

这里的三个变量,有两个变量是我们可控的,而$this->alipay_config['key'] 是我们在支付宝中的接口key值是无法控的

而我们跟进md5Verifyfunction md5Verify($prestr, $sign, $key) {

$prestr = $prestr . $key;

$mysgin = md5($prestr);

if($mysgin == $sign) {

return true;

}

else {

return false;

}

}

果然与书上写的一样,o(︶︿︶)o 唉 这也同时造成这个漏洞鸡肋的唯一点

漏洞复现:

ba89b900fb44366fe232ac141cf18716.png

第二枚就简单实在好利用:

漏洞文件:include\plugin\payway\ebank\Receive.php

include('../../../../common.php');

$cache_payway = cache::get('payway');

$payway = unserialize($cache_payway['ebank']['payway_config']);

$key = $payway['ebank_md5'];

$v_oid =trim($_POST['v_oid']);

$v_pmode =trim($_POST['v_pmode']);

$v_pstatus =trim($_POST['v_pstatus']);

$v_pstring =trim($_POST['v_pstring']);

$v_amount =trim($_POST['v_amount']);

$v_moneytype =trim($_POST['v_moneytype']);

$remark1 =trim($_POST['remark1']);

$remark2 =trim($_POST['remark2']);

$v_md5str =trim($_POST['v_md5str']);

/**

* 重新计算md5的值

*/

$md5string=strtoupper(md5($v_oid.$v_pstatus.$v_amount.$v_moneytype.$key));

echo $key;

/**

* 判断返回信息,如果支付成功,并且支付结果可信,则做进一步的处理

*/

if ($v_md5str==$md5string) {

if($v_pstatus=="20") {

$info = $db->pe_select('order', array('order_id'=>$v_oid));

if ($info['order_state'] == 'notpay') {

$order['order_outid'] = $v_pmode;

$order['order_payway'] = 'ebank';

$order['order_state'] = 'paid';

$order['order_ptime'] = time();

$db->pe_update('order', array('order_id'=>$v_oid), $order);

pe_success('订单支付成功...');

}

}

else {

echo "支付失败";

}

}

else{

echo "
校验失败,数据可疑";

}

?>



推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • PHP中的curl_multi系列函数可以实现同时请求多个URL来实现并发,而不是像普通curl函数那样请求后会阻塞,直到结果返回才进行下一个请求。因此在批量请求URL时可通过curl_multi系列函数提升程序的运行效率。curl普通请求$startT ... [详细]
author-avatar
紫逸石
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有