代码审计---证书申请系类
$_GET['m']=$m=isset($_GET['m'])?htmlspecialchars($_GET['m']):"index";
$m=str_replace(array("/","\",".."),"",$m);
$mfile= CONTROL_DIR."/$m.ctrl.php";
$mafile="";
$apiVersion=get("apiVersion","h");
if($apiVersion){
if(!preg_match("/W/",$apiVersion)){
$mafile= CONTROL_DIR."/$m.ctrl.".$apiVersion.".php";
}
}
if($mafile!="" && file_exists($mafile) ){
include($mafile);
}elseif(!file_exists($mfile))
{
error404();
}else{
include($mfile);
}
$classname = $m.'Control';
$control = new $classname();
$a=get_post('a',"h");
if(empty($a)){
$_GET['a']='default';
}
$method=method_exists($control,'on'.$_GET['a'])? 'on'.$_GET['a']:"onDefault";
if(function_exists("userinit"))
{
if(!defined("SKYINIT")){
userinit();
}
}
if(method_exists($control,'onInit')){
$control->onInit();
}
if(!defined("AUTO_CHECK_BAD_WORD")){
define("AUTO_CHECK_BAD_WORD",0);
}
if(AUTO_CHECK_BAD_WORD==1){
$control->checkBadWord();
}
$control->$method();
这里通过 $_GET['m']。获取了get提交的m的值是多少,在payload中 m=pv 所以这里$m=pv
$mfile= CONTROL_DIR."/$m.ctrl.php";
CONTROL_DIR 是一个常量值为 source/index
$m 为 pv
拼接完成就为 $mfile = source/index/pv.ctrl.php 。下面就是简单的include进行包含 。
然后看
$classname = $m.'Control'; //classname = pvControl
$control = new $classname(); // $control = new pvControl();
pv.ctrl.php 文件的类就是pvControl,这里对 pv.ctrl.php 文件进行一个实例化的作用。
看这一行代码。
$method=method_exists($control,'on'.$_GET['a'])?'on'.$_GET['a']:"onDefault";
在 a参数前拼接on ,根据数据包来看 a= stat 最后结果就是 onstat。
看最后一行
$control->$method(); // $control ->onstat();
跟进pv.ctrl.php(截取部分片段)文件。(因为刚才调用了 onStat函数,所以直接看onStat函数 )
class pvControl extends skymvc{
public function __construct(){
parent::__construct();
}
public function onDefault(){
}
public function onStat(){
M("pv")->stat();
echo "success";
}
if(file_exists( MODEL_DIR."/$model.model.php")){
require_once MODEL_DIR."/$model.model.php";
MODEL_DIR 常量在 index.php文件内被定义 是 source/model
$model 是我们传入的值 pv
最后拼接 source/model/pv.model.php。跟进这个文件的stat函数
截取部分片段
public function Stat($url=""){
$ssid=session_id();
$m=get("m","h");
$a=get("a","h");
$createtime=date("Y-m-d H:i:s");
$day=date("Y-m-d");
$createhour=date("H");
$createweek=date("w");
if(empty($url) && !$url=get('url','h')){
$url=$_SERVER['HTTP_REFERER'];
if(empty($url)){
return false;
}
$url=str_replace(array("https://".$_SERVER['HTTP_HOST'],"http://".$_SERVER['HTTP_HOST']),"",$url);
}
$ip=ip();
$user_agent=$_SERVER['HTTP_USER_AGENT'];
$isphone=is_mobile();
$row=M("pv_day")->selectRow("ssid='".$ssid."' AND url='".$url."' AND createtime like '".$day."%' ");
12/34行 $url=$_SERVER['HTTP_REFERER'];获取了ref的值。
在第22/44行拼接进了数据库查询语句中,中间没有经过任何过滤。
M("pv_day")->selectRow()是mvc架构的数据库查询定义,在skymvc.php中被引入。
跟进这个文件可知(cls_mysqli.php)
是用来查询数据库信息的并且返回一行数据。selecRow交给 getrow函数执行sql语句
交给query执行sql语句
$rs->execute(); 这里进行了执行,造成了sql注入。
访问index页面会进行301跳转,
根据常量设置301跳转会进入
http://192.168.3.75:555/module.php?m=csc
经抓包发现。会进行多个url访问操作,其中下图存在referer注入。
GET /index.php?m=pv&a=stat&url= HTTP/1.1
Host: 192.168.3.75:555
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://192.168.3.75:555/module.php?m=csc
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=el9p0kdcjr03ulc0eo3ksk2gno
Connection: close
黑盒测试更简单~
本公众号文章以技术分享学习为目的。
由于传播、利用本公众号发布文章而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。
一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
原文始发于微信公众号(藏剑安全):[代码审计]某cms前台Referer-sql注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论