php云两处SQL二次注入

php云两处二次注入

最新版。两个注入点。顺带一个绕过waf的小技巧。

第一处:/member/model/index.class.php

39行

function index_action() { $this->public_action(); $this->member_satic(); $this->com_cache(); $resume = $this->obj->DB_select_once("resume","`uid`='".$this->uid."'"); $expect=$this->obj->DB_select_once("resume_expect","`id`='".$resume['def_job']."'"); if($_GET['type']=="job") { $where="`job_post` in (".$expect['job_classid'].") and `status`<>'1' and `state`='1' and `sdate`<'".mktime()."' and `r_status`<>'2' and `edate`>'".mktime()."'"; }elseif($_GET['type']=="city"){ $where="`cityid`='".$expect['cityid']."' and `status`<>'1' and `state`='1' and `sdate`<'".mktime()."' and `r_status`<>'2' and `edate`>'".mktime()."'"; }else{ $where="`state`='1' and status<>'1' and `sdate`<'".mktime()."' and `r_status`<>'2' and `edate`>'".mktime()."'"; } $rows=$this->obj->DB_select_all("company_job",$where." order by id desc limit 12","`name`,`id`,`salary`,`edu`,`edate`");

where 语句拼接了$expect['job_classid'].变量。而这个变量来自于$expect=$this->obj->DB_select_once("resume_expect","`id`='".$resume['def_job']."'"); resume_expect 表。

member/model/index.class.php 587行

function saveexpect_action() { if($_POST['submit']) { $eid=(int)$_POST['eid']; unset($_POST['submit']); unset($_POST['eid']); unset($_POST['urlid']); $_POST['name'] = iconv("utf-8", "gbk", $_POST['name']); $where['id']=$eid; $where['uid']=$this->uid; $_POST['lastupdate']=time(); if($eid=="") { $num=$this->obj->DB_select_num("resume_expect","`uid`='".$this->uid."'"); var_dump($num); if($num>=$this->config['user_number']) { echo 1;die; } $_POST['uid']=$this->uid; $nid=$this->obj->insert_into("resume_expect",$_POST); if ($nid) {

可以看到整个$_POST插入到了expect表中。完全是可控的。

测试过程。因为phpyun有两个waf,360就不说了。phpyun自带的依然可以白名单绕过。这里说一下自带的waf。

function gpc2sql($str,$str2) { if(preg_match("/select|insert|update|delete|union|into|load_file|outfile/is", $str)) { exit(safe_pape()); } if(preg_match("/select|insert|update|delete|union|into|load_file|outfile/is", $str2)) { exit(safe_pape()); } $arr=array(" and "=>" an d "," or "=>" Or ","%20"=>" ","select"=>"Select","update"=>"Update","count"=>"Count","chr"=>"Chr","truncate"=>"Truncate","union"=>"Union","delete"=>"Delete","insert"=>"Insert","<"=>"&lt;",">"=>"&gt;","\""=>"&quot;","'"=>"&acute;","--"=>"- -"); foreach($arr as $key=>$v){ $str = preg_replace('/'.$key.'/isU',$v,$str); } return $str; }

这个函数直接过滤了select|insert|update|delete|union|into|load_file|outfile 关键字,$arr=array(" and "=>" an d "," or "=>" Or ","%20"=>" ","select"=>"Select","update"=>"Update","count"=>"Count","chr"=>"Chr","truncate"=>"Truncate","union"=>"Union","delete"=>"Delete","insert"=>"Insert","<"=>"&lt;",">"=>"&gt;","\""=>"&quot;","'"=>"&acute;","--"=>"- -"); 这里之前把%20替换为空。之前有人提的利用这里引入or关键字的方式就不可以了。这个过滤还是很变态的。所以这里尝试进行延时注入。

其中过滤sleep的正则是这样的:

sleep\s*?\\([\d\.]+?\\)

看了以前原来已经前辈发过了。 WooYun: 360webscan正则不当可被绕过进行SQL注入

sleep里面进行算数运算就可以了。这里说一下别的方法:

比如sleep((11)),多加一层括号,sleep((select 2)),等等。所以 WooYun: 360webscan正则不当可被绕过进行SQL注入 这里分析的改成benchmark这样也是不安全的。
benchmark\s*?\\(\d+?|sleep\s*?\\([\d\.]+?\\)

最彻底的就是sleep\s*?\(.*\)进行过滤。

最后说一下这里的利用过程。

首先登陆,post数据到数据库。

php云两处SQL二次注入

php云两处SQL二次注入

访问一下url触发。

php云两处SQL二次注入

所以这里实现的绕过也就是前辈说过的
如果我们想让服务器挂掉或者查询当前的数据库环境,很容易,我们可以很轻松的sleep或者获取当前运行的数据库信息了,这些不依赖select字符的事情我们都可以做了。

第二个点存在招聘会的地方,也是二次注入,写数据的时候需要后台审核。

企业预订的时候,抓包。

php云两处SQL二次注入

修改GET /phpyun3.1/index.php?m=ajax&c=zphcom&uid=5&pid=1&jobid=2 HTTP/1.1

jobid为注入payload。

然后查看参会企业触发。只是默认情况下,企业申请需要管理员审核。

php云两处SQL二次注入

相关代码:model/zph.class.php

23行:

function com_action() { $this->job_cache(); $row=$this->obj->DB_select_once("zhaopinhui","`id`='".(int)$_GET['id']."'"); $this->yunset("row",$row); $where="`zid`='".(int)$_GET['id']."' and status='1'"; var_dump($where); $urlarr["c"]=$_GET['c']; $urlarr["id"]=$_GET['id']; $urlarr["page"]="{{page}}"; $pageurl=$this->url("index",$_GET['m'],$urlarr,"1"); $rows=$this->get_page("zhaopinhui_com",$where." order by id desc",$pageurl,"13"); if(is_array($rows)){ foreach($rows as $key=>$v){ $rows[$key]['comname']=$this->obj->get_comname($v['uid']); $rows[$key]['job']=$this->obj->DB_select_all("company_job","id in (".$v['jobid'].") and `status`<>'1' and `r_status`<>'2'","name,id"); } }

写数据的代码位于model/ajax.class.php894 line

function zphcom_action() { if(!$this->uid || !$this->username || $_COOKIE['usertype']!=2 || $this->uid!=$_GET['uid']) { $arr['status']=0; $arr['content']=iconv("gbk","utf-8","您不是企业用户或者还没有登录,<a href='index.php?m=login&usertype=2'>请先登录</a>"); }elseif(!$_GET['pid']){ $arr['status']=0; $arr['content']=iconv("gbk","utf-8","你没有选择招聘会"); }elseif(!$_GET['jobid']){ $arr['status']=0; $arr['content']=iconv("gbk","utf-8","你还没有选择职位"); }elseif(is_array($this->obj->DB_select_once("zhaopinhui_com","uid='".(int)$_GET['uid']."' and zid='".(int)$_GET['pid']."'"))){ $arr['status']=0; $arr['content']=iconv("gbk","utf-8","您已经参与该招聘会"); }else{ [email protected](",",$_GET['jobid']); $array=array(); foreach($jobidarr as $v){ if(!in_array($v,$array)){ $array[]=$v; } } $sql['uid']=$_GET['uid']; $sql['zid']=$_GET['pid']; $sql['jobid'][email protected](",",$array); $sql['ctime']=mktime(); $sql['status']=0; $id=$this->obj->insert_into("zhaopinhui_com",$sql);

php云两处SQL二次注入

解决方案:

加强过滤

分类:默认分类 时间:2012-01-04 人气:26
本文关键词:
分享到:

相关文章

  • PHP代码网站防范SQL注入漏洞攻击的建议 2013-02-22

    所有的网站管理员都会关心网站的安全问题。说到安全就不得不说到SQL注入攻击(SQL Injection)。黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入 功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并 学会如何通过代码来保护自己的网站数据库。今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的

  • PHP漏洞挖掘之旅--SQL注入漏洞(一) 2014-08-11

    篇文章源自《黑客防线》2007年6月刊 转载请注明版权 作者:cnbird[H.U.C]河北泊头杨宁 第5期杂志给大家介绍的挖掘PHP远程文件包含漏洞不知道大家看了没有,收获如何呢?是不是也想开始自己的挖掘Web漏洞之旅呢?呵呵,不要着急,坚持看下去,自己挖掘PHP漏洞的愿望在不久的将来就能实现了。承接我一贯的风格,首先讲解原理,然后再到程序中寻找实际的例子来巩固我们的知识。 SQL注入基本知识 要想真正全面的了解PHP中的SQL注入漏洞,我们必须要有以下几方面知识的系统掌握。一是PHP语法知识

  • php导入sql文件 2014-08-30

    php导入sql文件 sql php php导入sql文件 基本思路 1.打开sql文件,放入一个变量(字符串类型)当中 2.使用正则替换掉当中的注释(“--”与“/**/”) 3.使用explode分割成为一个数组并去除每行的空格 4.链接数据库之后使用my_query()执行sql 代码 // +------------------------------------------------------------------------------------------ // | Aut

  • 易想团购ajax.php SQL注入分析和Exp 2014-10-19

    在注册的时候,输入用户名后台会验证用户名是否存在,当然是通过ajax去验证的也就是ajax.php。很多程序多会忽略这个导致存在SQL注入。 * 验证会员数据 */ function check_user($field_name,$field_data) { //开始数据验证 $user_data[$field_name] = $field_data; $res = array('status'=>1,'info'=>'','data'=>''); //用于返回的数据 if(t

  • PHP备份数据库为SQL文件 并可下载源码 2013-10-29

      这是一个将指定数据库里的所有表备份为一个SQL文件,可下载。这个源码来自dedecms程序,功能挺多,也很实用,但是代码的质量还有待提高 <!?php /****** 备份数据库结构 ******/ /* 函数名称:table2sql() 函数功能:把表的结构转换成为SQL 函数参数:$table: 要进行提取的表名 返 回 值:返回提取后的结果,SQL集合 函数作者:heiyeluren */ function table2sql($table) { global $db; $tab

  • php过滤sql注入关键词分析 2014-05-21

    1.使用mysql_real_escape_string代替 addslashes对输入进行转义 2.字段值两边加上单引号 str_replace替换sql 中的 update 这种做法本身就是错误的, 原因如下: 如果sql中本来就有update字段,如以下的SQL 代码如下 复制代码 $sql = "update content = 'update your name ..' where userid=1" 那么,你用str_replace替换的后果是什么? 只要用户提交的内容中包含有upd

  • 确保php应用程序的安全-不能违反的四条安全规则 2012-01-01

    规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。 例如,下面的数据元素可以被认为是安全的,因为它们是在 PHP 中设置的。 清单 1. 安全无暇的代码 <?php $myUsername = t

  • 突破Sql 防注入过滤程序继续注入的一点方法.经验.技巧总结 2012-01-03

    看了以下帖子想写一点东西,原帖内容如下: 标题:防注入真的有用吗? 作者:798146410 时间:2012-2-22 21:39 内容: 现在网上流传很多防注入代码。这些真的有用吗?这是在网上找的一个防注入代码 例如: ''''--------定义部份------------------ DimFy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr''''自定义需要过滤的字串,用"|"分隔Fy_In="''''|;|and|exec|insert|se

  • SQL批量添加数据略谈 2012-01-16

    SQL批量添加数据略谈 很多时候,我们需要把客户的产品添加到数据库,一般来说客户给的都是Excel这种表格数据,而我们平常程序中用的是mysql或者sql server,这样就需要数据导入,对于数据量小的当然可以手动添加,如果数据量过万甚至几十万,那么手动简直就是不可能完成的,这个时候我们就需要写一些辅助程序,这些程序不是给客户用,而是用来导入数据的工具一样.那么我们来结合实际例子来说说怎么开发这样的代码段. 拿到数据,首先就是数据分析,找出数据之间的关系,一般只有一两个表那就容易,多则三个以上

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.079 (s). 10 q(s)