漏洞一
涉及版本:
Myarticle 0.02以下
描述:
由于后臺管理入口驗證代碼存在嚴(yán)重缺陷。導(dǎo)致任何用戶可以只在用戶名里輸入任何字符可以進(jìn)入后臺。
詳細(xì):
在admin/admin_global.inc.php文件里的151行的代碼是這樣寫的:
引用 or 代碼:
function verifyUser($name, $pwd) {
global $DB_site,$table_user;
$usrpwd = $DB_site->query_first("select password FROM $table_user where username = '$name'");
return $pwd==md5($usrpwd);
}
看出問題了吧?因為輸入的是一個沒有的用戶名,所以它的密碼肯定是為空的,自然就等于你輸入的密碼了。自然登陸了。
解決辦法:
將上面的代碼改為:
引用 or 代碼:
function verifyUser($name, $pwd) {
global $DB_site,$table_user;
$usrpwd = $DB_site->query_first("select password FROM $table_user where username = '$name'");
$num=mysql_affected_rows($DB_site->link_id);
if ($num) {
if ($pwd==md5($usrpwd)) return true;
}
return false;
}
其實這個漏洞好象0.03也存在??墒菧y試了網(wǎng)上幾個0.03的站點。有些可以。有些不可以。在本地調(diào)試0.03的就不能利用。不知何故?哪位高手能指點一二?感激不盡。
漏洞二
涉及版本:
目前所有版本
描述:
由于category.php、article.php、print.php……多個文件對用戶提交的變量過濾不足。導(dǎo)致非法用戶可以進(jìn)行SQL Injection攻擊。
詳細(xì):
這幾個文件的相關(guān)代碼是這樣寫的(這幾個文件的代碼不一定相同):
引用 or 代碼:
if (!isset($aid)){
showerror('error_articleid');
}
……
……
$article=$DB_site->query_first("SELECT $table_article.*,$table_page.* FROM $table_article
LEFT JOIN $table_page USING (articleid)
WHERE $table_article.articleid=$aid and $table_page.pagenum=$page");
沒有檢查變量用戶提交的變量。不過在PHP里注入有點困難。因為MYSQL4以下的版本是不支持子語句的,而且新版本的php.ini里的 magic_quotes_gpc 選項默認(rèn)是 On 的。當(dāng) magic_quotes_gpc 打開時,所有的 ' (單引號), " (雙引號), \ (反斜線) and 空字符會自動轉(zhuǎn)為含有反斜線的溢出字符。這樣我們就無法注入了,所以注入語句就不說了,大家自己看看相關(guān)MYSQL語句再碰碰運氣自己嘗試注入吧。
解決辦法:
檢查用戶輸入的代碼。比如檢查提交的數(shù)據(jù)是否為數(shù)字類型。將以下代碼:
引用 or 代碼:
if (!isset($aid)){
showerror('error_articleid');
}
改為:
引用 or 代碼:
if (!isset($aid)){
showerror('error_articleid');
}
$idid=str_replace(" ","",${"aid"});
if (is_numeric($idid)==0 $idid=="")
{
print "非法參數(shù)";
exit();
}