在網(wǎng)絡安全領域中,安全研究人員經(jīng)常會遇到PHP漏洞的問題。其中extract PHP漏洞就是其中之一,這也是一個相對常見的漏洞。
首先我們來看一下extract的作用:
$someArray = array( 'color' =>'blue', 'size' =>'medium', 'shape' =>'round' ); extract($someArray); echo $color . ' ' . $size . ' ' . $shape;
執(zhí)行上面的代碼,可以得到輸出blue medium round。其中extract函數(shù)會將數(shù)組的key作為變量名,value作為變量值,并將其導入到當前的符號表中。這樣的話就避免了在進行的工作量大且繁瑣的語法操作,可以讓PHP程序的開發(fā)者更加簡單而快捷地完成任務。
然而這個函數(shù)同樣可以引發(fā)安全問題。代碼如下:
$someArray = array( 'color' =>'blue', 'size' =>'medium', 'shape' =>'round' ); extract($_POST); echo $color . ' ' . $size . ' ' . $shape;
這段代碼的問題就在于使用了extract函數(shù),并直接將$_POST數(shù)組導入到了當前的符號表中。如果攻擊者在提交的POST請求中添加了一些非法的key-value關系,就會將這些數(shù)據(jù)導入到符號表中,這樣就可能導致一些安全問題的出現(xiàn)。
舉個例子:
// 文件名為test.php extract($_POST); require_once($filename);
攻擊者可以構造一個非法的POST請求,使其參數(shù)中包含filename參數(shù),如下所示:
POST /test.php HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 23 filename=index.php&x=1
其中x=1是為了繞過空格的處理,讓攻擊者提交的文件名可以被正確地解析。此時extract函數(shù)會將filename作為變量名稱,將POST請求中的值導入到符號表中,而后面的require_once($filename)則會將攻擊者輸入的PHP文件引入到當前腳本中執(zhí)行。
這樣一來,攻擊者就可以通過構造POST請求成功地將惡意腳本引入到服務器端,造成危害或者泄露敏感信息。
因此,在使用extract函數(shù)時需要非常謹慎,避免將未經(jīng)過濾的、不可信的數(shù)據(jù)導入到符號表中,否則可能會引發(fā)嚴重的漏洞。