程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php substr_replace替換指定位置字符與內存破壞漏洞

php substr_replace替換指定位置字符與內存破壞漏洞

編輯:關於PHP編程

 

php教程 substr_replace替換指定位置字符與內存破壞漏洞

提示和注釋
注釋:如果 start 是負數且 length 小於等於 start,則 length 為 0。

$username = "zongzi"; 
echo substr_replace($username,'**','1','2');

定義和用法
substr_replace() 函數把字符串的一部分替換為另一個字符串。

語法
substr_replace(string,replacement,start,length)參數 描述
string 必需。規定要檢查的字符串。
replacement 必需。規定要插入的字符串。
start 必需。規定在字符串的何處開始替換。

正數 - 在第 start 個偏移量開始替換
負數 - 在從字符串結尾的第 start 個偏移量開始替換
0 - 在字符串中的第一個字符處開始替換
 
charlist 可選。規定要替換多少個字符。

正數 - 被替換的字符串長度
負數 - 從字符串末端開始的被替換字符數
0 - 插入而非替換
 
功能同 php的substr_replace()

'參數:被替換的內容,替換內容,起始位,替換長度

function substr_replace(sourcecon,repcon,startx,lenx)
   dim reped
   reped = mid(sourcecon,startx,lenx) '取出原內容同樣長度
   dim scleftx,scleft
   scleftx = startx-1
   if scleftx<1 then
    scleft = ""
   else
    scleft = left(sourcecon,scleftx)
   end if
   substr_replace = replace(sourcecon,reped,repcon,startx,1)
   substr_replace = scleft&substr_replace
end function

()中斷內存破壞漏洞
bugraq id:
cve id:cve-2010-2190
cncve id:cncve-20102190
 
漏洞發布時間:2010-05-31
漏洞更新時間:2010-06-28
 
漏洞起因
設計錯誤
危險等級

 
影響系統
php 5.2 <= 5.2.13
php 5.3 <= 5.3.2
 
不受影響系統
 
危害
遠程攻擊者可以利用漏洞洩漏敏感信息。
 
攻擊所需條件
攻擊者必須訪問使用substr_replace()函數的應用程序。
 
漏洞信息
php是一款流行的網絡編程語言。
php的substr_replace()函數存在信息洩漏問題:

php_function(substr_replace)
{
    ...
    if (zend_parse_parameters(zend_num_args() tsrmls_cc, "zzz|z", &str, &repl, &from, &len) == failure) {
        return;
    }
   
    if (z_type_pp(str) != is_array) {
        convert_to_string_ex(str);
    }
    if (z_type_pp(repl) != is_array) {
        convert_to_string_ex(repl);
    }
    if (z_type_pp(from) != is_array) {
        convert_to_long_ex(from);
    }
    if (argc > 3) {
        separate_zval(len);
        if (z_type_pp(len) != is_array) {
            convert_to_long_ex(len);
            l = z_lval_pp(len);
        }
    } else {
        if (z_type_pp(str) != is_array) {
            l = z_strlen_pp(str);
        }
    }
    if (z_type_pp(str) == is_string) {
        if (
            (argc == 3 && z_type_pp(from) == is_array) ||
            (argc == 4 && z_type_pp(from) != z_type_pp(len))
        ) {
            php_error_docref(null tsrmls_cc, e_warning, "'from' and 'len' should be of same type - numerical or array ");
            return_stringl(z_strval_pp(str), z_strlen_pp(str), 1);     
        }

使用不同類型的‘from’和'len'參數調用substr_replace()函數,會觸發e_warning錯誤。如果php沒有刪除調用時通過引用傳遞功能,用戶空間錯誤處理器會使用這個中斷更改'str'參數類型。如果'str'類型更改為整數類型可導致洩漏任意內存,如果'str'更改為數組,允許洩漏使用重要內存偏移的哈希表。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved