php审计学习

  • Comments Off on php审计学习
  • 12 views
  • A+

```

前言

我好菜。记录一下学习php审计的过程。

需要工具

VsCode

Seay源代码审计系统

前台审计

SQL注入

首先把整个cms源码放进Seay审计系统中,进行自动审计。

可以看到很多的漏洞,我们先看这个ajax.php

hkeHqs.png

php
if(empty($_GET['act'])){
exit("非法访问!");
}else{
$act=$_GET['act'];
}

可以看到它需要检测一下“act”的存在,如若不存在将不会往下执行。

```php
switch ($act){
//异步获取商品
case 'selgo':
$select = "";
$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.="";

    }
   exit('{"code":0,"msg":"'.$select.'"}');
    break;

```

先看一下这个循环,判断了act的传参是否存在selgo

存在的话久会接收tyid 的传参,可以看到在就收传参后会经过一个_if() 函数,跟踪一下这个函数。

php
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注入


我们继续往下看一个循环

```php
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
先看一下代码

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存在的问题。

先来看一下代码。

```php
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截断等手法的。


最后

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

```

```

相关推荐: AoiAWD 系统的安装和配置

最近打了几次AWD比赛,发现手中的工具依然不好用,在github上发现了AoiAWD,AoiAWD 是一个由Aodzip(安恒信息 海特实验室研究员、HAC战队成员)维护的一个针对于CTF AWD模式的开源项目。专为比赛设计,便携性好,低权限运行的EDR系统。…