漏洞一
涉及版本:
Myarticle 0.02以下
描述:
由于后臺(tái)管理入口驗(yàn)證代碼存在嚴(yán)重缺陷。導(dǎo)致任何用戶可以只在用戶名里輸入任何字符可以進(jìn)入后臺(tái)。
詳細(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);
}
看出問(wèn)題了吧?因?yàn)檩斎氲氖且粋€(gè)沒(méi)有的用戶名,所以它的密碼肯定是為空的,自然就等于你輸入的密碼了。自然登陸了。
解決辦法:
將上面的代碼改為:
引用 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;
}
其實(shí)這個(gè)漏洞好象0.03也存在??墒菧y(cè)試了網(wǎng)上幾個(gè)0.03的站點(diǎn)。有些可以。有些不可以。在本地調(diào)試0.03的就不能利用。不知何故?哪位高手能指點(diǎn)一二?感激不盡。
漏洞二
涉及版本:
目前所有版本
描述:
由于category.php、article.php、print.php……多個(gè)文件對(duì)用戶提交的變量過(guò)濾不足。導(dǎo)致非法用戶可以進(jìn)行SQL Injection攻擊。
詳細(xì):
這幾個(gè)文件的相關(guān)代碼是這樣寫的(這幾個(gè)文件的代碼不一定相同):
引用 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");
沒(méi)有檢查變量用戶提交的變量。不過(guò)在PHP里注入有點(diǎn)困難。因?yàn)镸YSQL4以下的版本是不支持子語(yǔ)句的,而且新版本的php.ini里的 magic_quotes_gpc 選項(xiàng)默認(rèn)是 On 的。當(dāng) magic_quotes_gpc 打開時(shí),所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) and 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的溢出字符。這樣我們就無(wú)法注入了,所以注入語(yǔ)句就不說(shuō)了,大家自己看看相關(guān)MYSQL語(yǔ)句再碰碰運(yùn)氣自己嘗試注入吧。
解決辦法:
檢查用戶輸入的代碼。比如檢查提交的數(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();
}