編程學習網 > PHP技術 > php漏洞是啥?常見php漏洞梳理
2021
08-04

php漏洞是啥?常見php漏洞梳理

每個開發者都很擔心遇到bug/漏洞,php開發者也不例外,本文就給大家介紹一下什么是漏洞/bug,PHP代碼常見漏洞有哪些?


漏洞是指一個系統存在的弱點或缺陷,系統對特定威脅攻擊或危險事件的敏感性,或進行攻擊的威脅作用的可能性。漏洞可能來自應用軟件或操作系統設計時的缺陷或編碼時產生的錯誤,也可能來自業務在交互處理過程中的設計缺陷或邏輯流程上的不合理之處。這些缺陷、錯誤或不合理之處可能被有意或無意地利用,從而對一個組織的資產或運行造成不利影響,如信息系統被攻擊或控制,重要資料被竊取,用戶數據被篡改,系統被作為入侵其他主機系統的跳板。

漏洞問題是與時間緊密相關的。一個系統從發布的那一天起,隨著用戶的深入使用,系統中存在的漏洞會被不斷暴露出來,這些早先被發現的漏洞也會不斷被系統供應商發布的補丁軟件修補,或在以后發布的新版系統中得以糾正。而在新版系統糾正了舊版本中具有漏洞的同時,也會引入一些新的漏洞和錯誤。因而隨著時間的推移,舊的漏洞會不斷消失,新的漏洞會不斷出現。漏洞問題也會長期存在。所以開發者才戲稱自己日常工作是:找bug,補bug,然后寫bug!

而php中常見的漏洞有哪些呢?


  • extract變量覆蓋漏洞


<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

又是老套路extract變量覆蓋,之前俗說君在上一篇中就有提到過,這次拿一下這個簡單題來練練手,首先這次有幾個新朋友,我們來認識一下(u??u??)

isset()函數:用于判斷一個變量是否被設置,如果設置了并且不為NULL,則返回True,反之就為False;


file_get_content()函數:用于將文本中的數據寫入字符串


然后本題要求就是shiyan這個變量和flag變量內容相同;所以payload:?shiyan=&flag=關于extract漏洞:它是會將原來同名的變量覆蓋,使用數組鍵作為變量名,使用數組鍵值作為變量值


  • strcmp字符串比較及MD5漏洞


<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果兩者相等,返回 0。
//比較兩個字符串(區分大小寫)
die('Flag: '.$flag);
else
print 'No';
}
?>

php5.3版本之前的strcmp函數在出現輸入變量類型錯誤時會返回0,所以這里我們只要構造數組傳值即可,因為這個函數只能處理字符串(??????)??;payload:?a[]=1

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>

md5漏洞:由于md5()函數不能處理數組,所以導致在返回時為false;


所以payload:?username[]=1&password[]=2

  • Urldecode二次編碼漏洞


<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("

not allowed!

");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "
Access granted!

";
echo "
flag

";
}
?>


PHP 函數 eregi()

語法

int eregi(string pattern, string string, [array regs]);

定義和用法

eregi()函數在一個字符串搜索指定的模式的字符串。搜索不區分大小寫。Eregi()可以特別有用的檢查有效性字符串,如密碼。

瀏覽器在讀取參數時,會默認對其進行一次url解碼,而這里eregi()函數在匹配到這個hackerDJ的id時就會返回not allowed,但是后面的if語句中又必須要求id是hackerDJ,所以我們就要想辦法對其進行編碼傳參,又由于urldecode($_GET[id]) 會在進行解碼,所以此時應對了題目的二次編碼,百度一下url編碼表,發現 “%”編碼是%25,“h”是%68,所以構造payload:?id=%2568ackerDJ

以上就是“php漏洞是啥?常見php漏洞梳理”的詳細內容,想要了解更多php教程歡迎關注編程學習網





掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取