php审计学习

# 前言
我好菜。记录一下学习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函数测试一下。 hkGlj0.png 通过使用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']; hkaX24.png

加了一个' 他就已经报错了,说明单引号被带入到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注入的。 hk6cad.png hk66VH.png

这里是可以直接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函数当中。所以这里就造成了文件包含。 hA6rnS.png

这里如果php版本低一点的话,是可以使用00截断等手法的。


最后

愉快的一天结束了,有空再继续看看前台和后台。代码很菜,更别说审计了,本文一些注入点没有深入验证,但测试后实际是存在的,没有在文中体现,最后文中有错误的地方敬请指正。

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐