[php審計實戰篇]BlueCms v1.6 Union註入
非常基礎的代碼審計練習,適合有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 "Error:".$msg."<br><br>";
}else{
echo "Errno:".$this->errno()."<br>Error:".$this->error();
}
exit;
}
作用是輸出錯誤信息。
之後回到ad_js.php文件:
$ad_content輸出查詢信息。
輸出形式:
<!–
document.write("test");
–>
0×03 構造Payload
正常的SQL查詢語句為:
select * from blue_ad where ad_id=1
因為直接回顯查詢內容,所以直接union註入咯。
看一下數據庫結構:
我們需要的數據列名為admin_name和pwd,構造PayLoad:
執行後查看源碼:
0×04 源碼下載及工具說明
回到文下載工具
[php審計實戰篇]BlueCms v1.6 Union註入