来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 0x01 写在前面本文总结了红黑联盟主站最近提交的 由于第三方接口程序导致的高危漏洞本文实例都是使用率高,且在近期爆出漏洞的API,具有一定现实意义在程序中嵌入第三方程序,可...
0x01 写在前面本文总结了主站最近提交的 由于第三方接口程序导致的高危漏洞 本文实例都是使用率高,且在近期爆出漏洞的API,具有一定现实意义 在程序中嵌入第三方程序,可以追溯到discuz!。后来的各种SNS程序,CMS,BBS都纷纷效仿,他们或由官方 或由站长自己添加了各种插件和api,一方面 这些脚本增加了用户体验,然而在黑客眼中,实则是增大了入侵几率。 各种接口的添加,一般是在整站程序开发周期之后,那么开发全局观的不同步是显而易见的后果,简而言之,前期种种过滤和安全防护,可能由于后期开发对第三方插件盲目的信任,被彻底绕过,导致漏洞形成。
0x02 实例分析看看那些厂商都是怎么被出卖的第一弹 Alipay支付插件那碎一地的节操
我们看看cmseasy怎么被自己人干掉的吧 在alipay.php中 自己定义的数据库函数在rec_update中
public function rec_update($row , $where){ ... 省略无关代码 ...
$sql="UPDATE `".$this->tablename."` SET ".$sqlud." WHERE ".$where; //漏洞出在这里 一只裸体的$where
return $this->simpledb->execute($sql);
}
可以看到 where 是没有单引号的,我们看看where从哪里能传进来。
public static function changeorders($id,$orderlog) {
//file_put_contents('logs.txt', $id);
$where=array();
$where['id']=$id;
$where['status']=4;
//$where['orderlog']=serialize($orderlog);
$update=orders::getInstance()->rec_update($where,$id);
if($update<1) {
exit('改变订单状态出错,请联系管理员');
}
}
继续追踪changeorders
function respond() {
if (!empty($_POST)) {
foreach($_POST as $key =>$data) {
$_GET[$key] = $data;
}
}
$payment = pay::get_payment($_GET['code']);
$seller_email = rawurldecode($_GET['seller_email']);
$order_sn = str_replace($_GET['subject'],'',$_GET['out_trade_no']);
$order_sn = trim($order_sn);
....省略....
pay::changeorders($order_sn,$_GET);
看到没$order_sn 没有过滤 注入于是产生了 由于没有显示点 延时注入即可。 第二弹 Tenpay支付插件也疯狂
阿里巴巴那么疯狂,BAT的三弟腾讯怎么能示弱? 组队坑厂商什么的最有爱了~ 由于Cmseasy最信任插件了。。所以又是他受伤。。。
class tenpay {
......
function respond() {
require_once ("tenpay/PayResponseHandler.class.php");
$resHandler = new PayResponseHandler();
$sp_billno = $resHandler->getParameter("sp_billno"); //腾讯的函数,类似于$_GET['sp_billno']或者$_POST['sp_billno']
//上面谈到GET不受过滤影响,本地问价内包含POST,GET提交都可,但是注入的话必须提交POST,因为GET是URL码.
//sp_lillno=sp_billno=-1-1-../../../demo 包含根目录的demo.php
preg_match_all("/-(.*)-(.*)-(.*)/isu",$sp_billno,$oidout);
$paytype = $where['pay_code'] = $oidout[3][0];
include_once ROOT.'/lib/plugins/pay/'.$paytype.'.php';//匹配上面正则就行,包含之,触发,但是实在找不到能截断的PHP文件了,所以鸡肋了。
$pay = pay::getInstance()->getrows($where); //SQL注入,跟进0x02
......
}
看到where没? 难道又是一只裸体动物? 答案是NO 这次是Cmseasy本身代码和API共同狼狈为奸 看getrows
function getrow($condition,$order='1 desc',$cols='*') {
$this->condition($condition); //OMG跟进,又是这个函数
return $this->rec_select_one($condition,'*',$order);
}
function condition(&$condition) {
if (isset($condition) &&is_array($condition)) {
$_condition=array();
foreach ($condition as $key=>$value) {
$value=str_replace("'","\'",$value);//问题函数在这里 MARK
$_condition[]="`$key`='$value'";
}
$condition=implode(' and ',$_condition);
}
......
}
试想一下,当我们POST提交 所以卖队友成功 第三弹 腾讯连弹 换个姿势咱们继续卖队友 微信sdk接口(weixin.php) 影响程序:数不清,这个太多了点,从大到小 挑个超级典型的对象 PHPYUN
//weixin/model/index.class.php
private function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
首先介绍下
if($MsgType=='event')
{
$MsgEvent = $postObj->Event;
if ($MsgEvent=='subscribe')
{
$centerStr = "<Content><![CDATA[欢迎您关注".iconv('gbk','utf-8',$this->config['sy_webname'])."!\n 1:您可以直接回复关键字如【销售】、【南京 销售】、【南京 销售 XX公司】查找您想要的职位\n绑定您的账户体验更多精彩功能\n感谢您的关注!]]></Content>";
$this->MsgType = 'text';
}elseif ($MsgEvent=='CLICK')
{
$EventKey = $postObj->EventKey;
if($EventKey=='我的帐号'){
$centerStr = $this->bindUser($fromUsername);
传进bindUser之后 最终到达
isBind private function isBind($wxid='')
{
if($wxid)
{
$User = $this->obj->DB_select_once("member","`wxid`='".$wxid."'","`uid`,`username`");
wxid就是一开始POST来的数据里面的参数 注入赤果果的产生 微信团队开发这个API的时候,其实是验证了来源的 0x03 卷尾语这样的第三方插件 应该成为程序员或者白帽子重点检查对象,原因如上0x02 这货们如同后门一般有魅力... |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com