# 前言
我好菜。记录一下学习php审计的过程。
# 需要工具
VsCode
Seay源代码审计系统
<!--more-->
# 前台审计
## SQL注入
首先把整个cms源码放进Seay审计系统中,进行自动审计。
可以看到很多的漏洞,我们先看这个ajax.php
[![hkeHqs.png](https://z3.ax1x.com/2021/08/24/hkeHqs.png)](https://imgtu.com/i/hkeHqs)
```php
if(empty($_GET['act'])){
exit("非法访问!");
}else{
$act=$_GET['act'];
}
可以看到它需要检测一下“act”的存在,如若不存在将不会往下执行。
switch ($act){
//异步获取商品
case 'selgo':
$select = "<option>请选择商品</option>";
$tpID = _if($_POST['tyid']);
if($tpID == ""){
exit('{"code":0,"msg":"'.$select.'"}');
}
$sql = "select * from if_goods where state =1 and tpId = ".$tpID." ORDER BY sotr desc";
$res = $DB->query($sql);
$i=1;
while ($row =$DB->fetch($res)){
$c = $DB->count("SELECT COUNT(id) from if_km where stat = 0 and gid =".$row['id']);
$select.="<option id='".$row['id']."' imgs='".$row['imgs']."' value='"._if2($row['gName'])."'kc='".$c."' title='".$row['price']."' alt = '"._if2($row['gInfo'])."'>"._if2($row['gName'])."</option>";
}
exit('{"code":0,"msg":"'.$select.'"}');
break;
先看一下这个循环,判断了act的传参是否存在selgo
存在的话久会接收tyid 的传参,可以看到在就收传参后会经过一个_if() 函数,跟踪一下这个函数。
function _if($str){
$str = str_replace(">","",$str);
$str = str_replace("/","",$str);
$str = str_replace("<","",$str);
$str = str_replace(":","",$str);
$str = str_replace("'","",$str);
$str = str_replace(" ","",$str);
$str = str_replace("=","",$str);
$str = str_replace("||","",$str);
$str = str_replace("-","",$str);
$str = str_replace("#","",$str);
$str = str_replace("*","",$str);
$str = str_replace("?","",$str);
return $str;
明显的看的到是一个过滤的安全函数,不过还好,至过滤了特殊符号,那么是否可以使用盲注呢,我们用sleep函数测试一下。 通过使用bp抓包测试sleep函数是生效了的。
ok一处SQL注入
我们继续往下看一个循环
case 'create':
$out_trade_no = $_POST['out_trade_no'];
$gid = _if($_POST['gid']);
$money = _if($_POST['money']);
$rel = _if($_POST['rel']);
$type = _if($_POST['type']);
$number = intval($_POST['number']);
if($number <= 0){
exit('{"code":-1,"msg":"no"}');
}
$checkcqq_row = $DB->get_row("select * from if_blacklist where data = '$rel' and type = 1");
if($checkcqq_row){
exit('{"code":-1,"msg":"当前QQ已被列入本站黑名单"}');
}
$sql = "insert into if_order(out_trade_no,gid,money,rel,benTime,type,number)
values('{$out_trade_no}',{$gid},{$money},'{$rel}',now(),'{$type}',{$number})";
$b = $DB->query($sql);
if($b > 0){
wsyslog("创建订单成功!","IP:".real_ip().",城市:".get_ip_city());
exit('{"code":0,"msg":"ok"}');
}else{
exit('{"code":-1,"msg":"数据库出错了~~~"}');
}
;
break;
从act接收的传参可以看到是一个创建订单的地方哈
在下面可以看到,应该是开发漏掉了,没有经过安全函数的处理,所以这里应该是存在sql注入。咱们测试一下。
$out_trade_no = $_POST['out_trade_no'];
加了一个' 他就已经报错了,说明单引号被带入到sql语句当中了,sql注入再加一处
到这里呢这个文件基本的问题都差不多了,还有其他几个循环,问题都是安全函数过滤不严格导致注入。问题不大哈。
接下来去看一下其他的文件
other/submit.php
先看一下代码
if($type=='alipay' || $type=='tenpay' || $type=='qqpay' || $type=='wxpay'){
require_once(SYSTEM_ROOT_E."epay/epay.config.php");
require_once(SYSTEM_ROOT_E."epay/epay_submit.class.php");
empty($_COOKIE['auth'])?exit():null;
$or = $_GET['out_trade_no'];
//防止修改价格
$sql = "SELECT * FROM if_order WHERE out_trade_no='{$or}' limit 1";
$row = $DB->get_row($sql);
if(!row || $row['money'] != $_GET['money']){
exit("验证失败1");
}
$number = $_REQUEST['number'];
$sql = "select * from if_goods where id = ". $_GET['gid'];
$row = $DB->get_row($sql);
if(!row || ($row['price']*$number) != $_GET['money']){
exit("验证失败2");
}
$parameter = array(
"pid" => $conf['epay_id'],//商户ID
"type" => $_GET['type'],//支付类型
"notify_url"=>"http://".$_SERVER['HTTP_HOST'].'/other/epay_notify.php',//异步通知
"return_url"=> "http://".$_SERVER['HTTP_HOST'].'/other/epay_return.php',//回调
"out_trade_no"=> $_GET['out_trade_no'],//订单编号
"name"=> $_GET['name'],//商品名称
"money"=> $_GET['money'],//金额
"sitename"=> $conf['title']//网站名称
);
大致的解读一下,首先是对$type进行判断,有其中一个就ok,再就是就收 out_trade_no money number 接收其中的传参,并带入到sql中,再这整个代码中没有见到任何对接收传参危险字符进行处理的行为。可以说是存在SQL注入的。
这里是可以直接sqlmap一把梭的。
文件包含
在分析的时候漏了一下index,我们来看看这个index存在的问题。
先来看一下代码。
if(!empty($_GET['tp']) && !empty($_GET['action'])){
$tp = $_GET['tp'];
$action = $_GET['action'];
include 'template/'.$tp.'/'.$action.".php";
exit();
}
if(!empty($conf['view']) && $conf['view'] != ""){
$t = $conf['view'];
}else{
$t = "default";
}
include 'template/'.$t.'/index.php';
这里其实一眼就可以看的出哈,这串代码是没有对tp、action,进行处理的,是直接拼接在include函数当中。所以这里就造成了文件包含。
这里如果php版本低一点的话,是可以使用00截断等手法的。
最后
愉快的一天结束了,有空再继续看看前台和后台。代码很菜,更别说审计了,本文一些注入点没有深入验证,但测试后实际是存在的,没有在文中体现,最后文中有错误的地方敬请指正。