真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php函數(shù)漏洞的示例分析

這篇文章主要介紹了php函數(shù)漏洞的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司提供高防服務(wù)器租用、云服務(wù)器、香港服務(wù)器、內(nèi)江機(jī)房主機(jī)托管

PHP是世界上最好的語言,是的,php在世界上養(yǎng)活了兩類人,一類是編寫php代碼的人,一類是從事安全×××的這類人,因?yàn)樵趐hp中存在著有漏洞的函數(shù)。
在一定條件作用下,這些函數(shù)沒有按著函數(shù)發(fā)明者的意愿去解析。
在ctf的web世界中也算待了幾個(gè)月了,對(duì)學(xué)習(xí)當(dāng)中的遇到的有問題的函數(shù)略做一下總結(jié)。

md5()函數(shù)

定義:Md5()函數(shù)計(jì)算字符串的MD5散列

問題1:經(jīng)過MD5()函數(shù)處理的字符串散列如果出現(xiàn)0e開頭的,在被php處理的時(shí)候會(huì)被認(rèn)為等于0。
源碼:

代碼功能:判斷get方法傳入的參數(shù)的MD5的hash字符串是否相等,并且是在兩參數(shù)值不相等的情況下。
測試結(jié)果:
php函數(shù)漏洞的示例分析

原理分析:
當(dāng)兩個(gè)字符串被MD5加密的時(shí)候,會(huì)產(chǎn)生以0e開頭的哈希值。Php進(jìn)行判斷的時(shí)候0e…會(huì)被看成科學(xué)計(jì)數(shù)法,0的n次方都是等于零。所以這兩個(gè)字符串被md5()加密后都等于零。
var_dump(0 == 0e123456)
php函數(shù)漏洞的示例分析
問題2:處理數(shù)組的時(shí)候返回為null
源碼:

測試:
php函數(shù)漏洞的示例分析

原理分析:
md5(string,raw)語法:string必須,規(guī)定要計(jì)算的字符串,raw可選,規(guī)定輸出格式,TRUE-16字符二進(jìn)制格式;false-默認(rèn),32字符十六進(jìn)制數(shù)。
函數(shù)作者規(guī)定處理的字符串類型為str字符串型,才能正常輸出。傳遞數(shù)組無法處理。造成輸出結(jié)果為null

問題3:造成sql注入漏洞

某些查詢語句,特別是查詢密碼的時(shí)候,往往會(huì)使用md5()函數(shù)處理后再去數(shù)據(jù)庫查詢對(duì)比,這樣就會(huì)造成一些風(fēng)險(xiǎn)。
查詢語句:
Select from user where passwd = ‘.md5($password,true)’;
這個(gè)地方有一個(gè)特殊的字符串可以繞過,在你不知道密碼的情況下查詢到user表的內(nèi)容。
字符串:ffifdyop
測試:
php函數(shù)漏洞的示例分析
可以看到字符串被md5()加密后成為了 ‘ or ‘ 6…,
添加到查詢語句中就變成了
Select
from user where password=’’or’6…’(…表示亂碼,并不影響查詢)
這時(shí)候我們將加密后的東西拿去到數(shù)據(jù)庫查詢一下。
php函數(shù)漏洞的示例分析
看可以將數(shù)據(jù)庫中的所有的數(shù)據(jù)全部查出。
原理分析:
Or語句就不在贅述,只說一下,數(shù)據(jù)庫中的操作,在查詢的時(shí)候,where 的后面并不一定非要跟上參數(shù)才能夠查詢。
php函數(shù)漏洞的示例分析
只要where后面的值不等于零,就表示true。等于零為false
php函數(shù)漏洞的示例分析
并且where后面的值是字符串的時(shí)候,但是第一個(gè)是一個(gè)非零數(shù)的時(shí)候也能查詢所有有內(nèi)容
php函數(shù)漏洞的示例分析
所以也解釋了,為甚前面亂碼依然成立的問題。

***擴(kuò)展同類函數(shù):sha1()函數(shù)。具體用法相同。其哈希值0e開頭的有,sha1('aaroZmOk')   sha1('aaK1STfY') sha1('aaO8zKZF') sha1('aa3OFF9m')


ereg()函數(shù)

    定義:正則表達(dá)式匹配

問題1:可以00截?cái)?br/>源碼:
if(isset($_GET['num'])){
if(ereg('^[a-zA-Z0-9]+$', $_GET['num']) === FALSE){
echo "請(qǐng)輸入符合要求的";
}else{
echo "您輸入的符合要求";
}
}
代碼分析:只有當(dāng)輸入數(shù)字和字母的時(shí)候,輸入正確,如果輸入包含符號(hào)的就會(huì)提示不正確。
漏洞利用:輸入123%00
看字符串中含有符號(hào),應(yīng)該返回“請(qǐng)輸入符合要求的”的提示。但是漏洞就通過00截?cái)喈a(chǎn)生了
php函數(shù)漏洞的示例分析
原理解析:
當(dāng)ereg()函數(shù)碰到%00的時(shí)候,就會(huì)認(rèn)為字符串結(jié)束,并不會(huì)繼續(xù)往下檢測。
問題2:碰到參數(shù)是數(shù)組的返回為null
源碼相同,測試結(jié)果:
php函數(shù)漏洞的示例分析

實(shí)現(xiàn)原理:因?yàn)榉祷貫閚ull,null != FALSE,所以匹配正確

intval()函數(shù)

    定義用法;
    獲取變量的整數(shù)值,允許以使用特定的進(jìn)制返回。默認(rèn)10進(jìn)制 
    注:如果參數(shù)為整數(shù),則不做任何處理。

問題:可以構(gòu)造字符串繞過
測試:
php函數(shù)漏洞的示例分析
問題解析:
通過上面的實(shí)驗(yàn)說明,當(dāng)取回字符串整數(shù)的時(shí)候,如果字符串中含有非數(shù)字的字符,將會(huì)返回第一次出現(xiàn)非數(shù)字符的前面的整數(shù)。若果沒有數(shù)字返回0.

unset()函數(shù)

定義用法:unset() 銷毀指定的變量。

存在問題:可能銷毀原有定義的變量,進(jìn)行繞過

源碼:

$abc['a'] = true;

foreach(array('_GET','_POST') as $method) {
    foreach($$method as $key=>$value) {
      unset($$key);
    }
}

if ($abc['a'] == false) {
    echo 'flag {123}';
}

?>

測試:
php函數(shù)漏洞的示例分析
解析:
如果unset變量存在請(qǐng)求參數(shù)當(dāng)中,便會(huì)出現(xiàn)銷毀變量實(shí)現(xiàn)繞過的現(xiàn)象。就如這里,通過$$符號(hào),$key=abc;$$key=$abc;最后unset()函數(shù)便會(huì)變成unset($abc),將原來定義的$abc[‘a(chǎn)’]=true給銷毀。

extract()函數(shù)

定義用法:
extract() 函數(shù)從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號(hào)表。
該函數(shù)使用數(shù)組鍵名作為變量名,使用數(shù)組鍵值作為變量值。針對(duì)數(shù)組中的每個(gè)元素,將在當(dāng)前符號(hào)表中創(chuàng)建對(duì)應(yīng)的一個(gè)變量。
EXTR_OVERWRITE - 默認(rèn)。如果有沖突,則覆蓋已有的變量。
EXTR_SKIP - 如果有沖突,不覆蓋已有的變量。
EXTR_PREFIX_SAME - 如果有沖突,在變量名前加上前綴 prefix。
EXTR_PREFIX_ALL - 給所有變量名加上前綴 prefix。
EXTR_PREFIX_INVALID - 僅在不合法或數(shù)字變量名前加上前綴 prefix。
EXTR_IF_EXISTS - 僅在當(dāng)前符號(hào)表中已有同名變量時(shí),覆蓋它們的值。其它的都不處理。
EXTR_PREFIX_IF_EXISTS - 僅在當(dāng)前符號(hào)表中已有同名變量時(shí),建立附加了前綴的變量名,其它的都不處理。
EXTR_REFS - 將變量作為引用提取。導(dǎo)入的變量仍然引用了數(shù)組參數(shù)的值。
這個(gè)函數(shù)的重點(diǎn)就是默認(rèn)將已經(jīng)有的變量給覆蓋掉

存在問題;將原來的變量覆蓋,進(jìn)行繞過

源碼:

    $a = 'yaun';  
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }

測試:
php函數(shù)漏洞的示例分析

問題解析:當(dāng)我傳遞a=1的時(shí)候,extract()函數(shù)發(fā)現(xiàn)有原來的變量,于是將原來變量的值覆蓋掉,變成a=1,在進(jìn)行if條件語句的判斷。

parse_str()函數(shù)

定義用法:
parse_str() 函數(shù)用于把查詢字符串解析到變量中,如果沒有array 參數(shù),則由該函數(shù)設(shè)置的變量將覆蓋已存在的同名變量。 極度不建議 在沒有 array參數(shù)的情況下使用此函數(shù),并且在 PHP 7.2 中將廢棄不設(shè)置參數(shù)的行為。此函數(shù)沒有返回值。

源碼:

  if(empty($_GET['id'])){
    show_source(__FILE__);
    die();
}else{
    include('flag.php');
    $a = "https://blog.51cto.com/12332766";
    $id = $_GET['id'];
    @parse_str($id);
    if($a[0] == 'yaun'){
        echo "yes is flag";
    }else{
        exit('其實(shí)很簡單,其實(shí)并不難');
    }
}

測試:

php函數(shù)漏洞的示例分析
問題解析:
當(dāng)傳遞參數(shù)id=a[]=yaun的時(shí)候,經(jīng)過parse_str()函數(shù)的處理將a變成變量。但是原來有同名的變量,于是就將原來的變量覆蓋掉,同時(shí)覆蓋的還有變量的值。

變量覆蓋拓展:php中遇到$$的時(shí)候也會(huì)出現(xiàn)變量覆蓋的情況。詳情請(qǐng)到:https://blog.51cto.com/12332766/2120800。

strcmp()函數(shù)

定義用法:
Strcmp(string1,string2)函數(shù)比較兩個(gè)字符串

返回值:
0 - 如果兩個(gè)字符串相等
<0 - 如果 string1 小于 string2  >0 - 如果 string1 大于 string2

問題:處理數(shù)組的時(shí)候返回null

源碼“

$a="yaun";
$pass=$_GET['pass'];
if(strcmp($a, $pass) == 0){
    echo "成功";
}else{
    echo "失敗";
}

測試:

php函數(shù)漏洞的示例分析
問題解析:
傳遞數(shù)組的時(shí)候,函數(shù)沒有辦法比較數(shù)組,返回null,php語言本身就是弱類型的語言,null==0 在數(shù)值上相等。但是在類型上不等。

is_numeric()函數(shù)

定義用法:
is_numeric() 函數(shù)用于檢測變量是否為數(shù)字或數(shù)字字符串。
如果指定的變量是數(shù)字和數(shù)字字符串則返回 TRUE,否則返回 FALSE

問題1:傳遞十六進(jìn)制的話,會(huì)讓檢測無效。
源碼:

$a=$_GET['num'];
if(is_numeric($a)){
    echo "您輸入的是數(shù)字";
}else{
    echo "請(qǐng)輸入合法字符";
}

測試:
輸入一串查詢語句轉(zhuǎn)換過得十六進(jìn)制

php函數(shù)漏洞的示例分析
成功繞過函數(shù)的檢測
問題解析:這個(gè)函數(shù)不僅能夠檢測十進(jìn)制,同時(shí)還認(rèn)為十六進(jìn)制也是合法的。于是就可以構(gòu)造十六進(jìn)制的語句進(jìn)行繞過此函數(shù)。

preg_match()函數(shù)

定義用法:
Preg_match()函數(shù)匹配正則表達(dá)式。

返回值:
返回 pattern 的匹配次數(shù)。 它的值將是 0 次(不匹配)或 1 次,因?yàn)?preg_match() 在第一次匹配后 將會(huì)停止搜索。如果發(fā)生錯(cuò)誤preg_match()返回 FALSE。
問題:如果在進(jìn)行正則表達(dá)式匹配的時(shí)候,沒有限制字符串的開始和結(jié)束(^ 和 $),則可以存在繞過的問題
源碼:

$ip=$_GET['ip'];
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
  die('error');
} else {
   echo "this is flag";
}

測試:
輸入一個(gè)不符合匹配規(guī)則的字符串,依然返回flag
php函數(shù)漏洞的示例分析
問題解析:
因?yàn)檫@個(gè)函數(shù)在執(zhí)行匹配規(guī)則的時(shí)候沒有說明是以什么開頭或者結(jié)尾,所以只需要在這個(gè)字符串中存在規(guī)定的字符,其他的字符也可以添加上去進(jìn)行繞過。

in_array()函數(shù)

定義用法:
in_array(search,array) 函數(shù)搜索數(shù)組中是否存在指定的值。

返回值:
如果給定的值 search 存在于數(shù)組 array 中則返回 true。如果沒有在數(shù)組中找到參數(shù),函數(shù)返回 false。

$array=[0,1,2,'3'];  
var_dump(in_array('abc', $array)); 
var_dump(in_array('1bc', $array));

測試:
php函數(shù)漏洞的示例分析
問題分析:
可以看到上面的情況返回的都是true,因?yàn)椤痑bc’會(huì)轉(zhuǎn)換為0,’1bc’轉(zhuǎn)換為1。
在所有php認(rèn)為是int的地方輸入string,都會(huì)被強(qiáng)制轉(zhuǎn)換

unserialize()函數(shù)
具體使用方法見另一篇博客:https://blog.51cto.com/12332766/2121394

strpos()函數(shù)

定義用法:
strpos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(區(qū)分大小寫)。
注釋:strpos() 函數(shù)是區(qū)分大小寫的。
注釋:該函數(shù)是二進(jìn)制安全的。

語法:
strpos(string,find,start)   string 必須,規(guī)定被搜索的字符串;find    必須,規(guī)定查找的字符串;start 可選,規(guī)定開始搜索的位置。
返回值:
返回字符串在另一字符串中第一次出現(xiàn)的位置,如果沒有找到字符串則返回 FALSE。注釋: 字符串位置從 0 開始,不是從 1 開始
源碼:

if(strpos($_GET['password'],'abc') == 0 ){
    echo '123';
}
else{
    echo '456';
}

傳遞一個(gè)數(shù)組進(jìn)去測試,使得返回結(jié)果是123
php函數(shù)漏洞的示例分析
可以看到我們輸入的并不符合要求,但是還是給了123的輸出。
問題解析:
這個(gè)函數(shù)也是只解析string類型的字符串,給他個(gè)數(shù)組就不知道如何解析,于是就返回為null。Null==0!

strlen()函數(shù)

定義用法:
strlen() 函數(shù)返回字符串的長度

語法:
strlen(string) string-必須,規(guī)定要檢查的字符串。

源碼:

if(strlen($_GET['password']) == 0  ){
    echo '1233';
}else{

    echo '4566';
}

測試:
傳遞一個(gè)數(shù)組,使得返回為1233
php函數(shù)漏洞的示例分析
問題分析:
這個(gè)函數(shù)也是只解析string類型的字符串,給他個(gè)數(shù)組就不知道如何解析,于是就返回為null。Null==0!

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“php函數(shù)漏洞的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!


當(dāng)前文章:php函數(shù)漏洞的示例分析
本文URL:http://weahome.cn/article/gedpgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部