1. 程式人生 > >[php審計實戰篇]BlueCms v1.6 Union註入

[php審計實戰篇]BlueCms v1.6 Union註入

thread strong class link pla slide ret 明顯 urn

非常基礎的代碼審計練習,適合有php基礎的審計新手練習

本文作者:Aedoo

來源:i春秋社區

0×01 代碼跟蹤

首先,進入首頁代碼 :index.php

技術分享圖片

包含了php文件:/include/common.inc.php

跟蹤這個php文件,這些文件都是包含的全局文件。

技術分享圖片

這個php文件還是先包含了幾個全局文件。

最主要的是上圖最下方的if判斷:

if(!get_magic_quotes_gpc())

{

$_POST = deep_addslashes($_POST);

$_GET = deep_addslashes($_GET);

$_COOKIES = deep_addslashes($_COOKIES);

$_REQUEST = deep_addslashes($_REQUEST);

}

如果未開啟magic_quotes_gpc,則對以各種請求的數據使用deep_addslashes()進行過濾,跟蹤一下這個函數:

技術分享圖片

對傳入的的$str,無論是數組還是字符串,使用addslashes()進行過濾。

PS:magic_quotes_gpc=On的情況下,如果輸入的數據有,單引號(’)、雙引號(”)、反斜線()與 NUL(NULL 字符)等字符都會被加上反斜線。這些轉義是必須的,如果這個選項為off,那麽我們就必須調用addslashes這個函數來為字符串增加轉義。

0×02 註入分析

在phpstorm使用CTRL+SHIFT+F全局搜索:$_GET

尋找以GET方式傳入的參數:

技術分享圖片

使用紅框圈起來的這條有異常。

ad_id明顯是文章或者廣告的id,並沒有使用intval強制轉化為整數型而是使用了trim()函數來去除了前後的空格,有點看不懂。

此時還不能完全確定存在註入,跟蹤到這行代碼看一下:

技術分享圖片

這次確定,對傳入的ad_id只判斷了是否為空,去除了前後的空格,此外也就多了一個全局的addslashes()轉義了一下特殊字符,直接進行了SQL查詢。

將SQL語句傳入了getone()函數,很明顯getone是進行SQL查詢的函數,跟進。

getone()函數:

function getone($sql, $type=MYSQL_ASSOC){

$query = $this->query($sql,$this->linkid);

$row = mysql_fetch_array($query, $type);

return $row;

}

query()函數:

function query($sql){

if(!$query=@mysql_query($sql, $this->linkid)){

$this->dbshow("Query error:$sql");

}else{

return $query;

}

}

第一個if,如果執行發生錯誤,將錯誤信息"Query errorsql"傳入dbshow()函數。

dbshow()函數:

function dbshow($msg){

if($msg){

echo &quot;Error:&quot;.$msg.&quot;<br><br>&quot;;

}else{

echo &quot;Errno:&quot;.$this->errno().&quot;<br>Error:&quot;.$this->error();

}

exit;

}

作用是輸出錯誤信息。

之後回到ad_js.php文件:

技術分享圖片

$ad_content輸出查詢信息。

輸出形式:

<!–

document.write(&quot;test&quot;);

–>

0×03 構造Payload

正常的SQL查詢語句為:

select * from blue_ad where ad_id=1

因為直接回顯查詢內容,所以直接union註入咯。

看一下數據庫結構:
技術分享圖片

我們需要的數據列名為admin_name和pwd,構造PayLoad:

執行後查看源碼:

技術分享圖片

0×04 源碼下載及工具說明

回到文下載工具

[php審計實戰篇]BlueCms v1.6 Union註入