多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 淺談PHP弱類型安全

淺談PHP弱類型安全

來源:程序員人生   發(fā)布時(shí)間:2015-03-05 08:01:15 閱讀次數(shù):3721次

0x00 弱類型初探


沒有人質(zhì)疑php的簡(jiǎn)單強(qiáng)大,它提供了很多特性供開發(fā)者使用,其中1個(gè)就是弱類型機(jī)制。

在弱類型機(jī)制下 你能夠履行這樣的操作

<?php $var=1; $var=array(); $var='string';


php不會(huì)嚴(yán)格檢驗(yàn)傳入的變量類型,也能夠?qū)⒆兞孔杂傻霓D(zhuǎn)換類型。

比如 在$a == $b的比較中

$a = null;$b = false; //為真 $a = ''; $b = 0; //一樣為真


但是,php內(nèi)核的開發(fā)者本來是想讓程序員借由這類不需要聲明的體系,更加高效的開發(fā),所以在幾近所有內(nèi)置函數(shù)和基本結(jié)構(gòu)中使用了很多疏松的比較和轉(zhuǎn)換,避免程序中的變量由于程序員的不規(guī)范而頻繁的報(bào)錯(cuò),但是這卻帶來了安全問題。

0x02 知識(shí)豫備 php內(nèi)核之zval結(jié)構(gòu)


在PHP中聲明的變量,在ZE中都是用結(jié)構(gòu)體zval來保存的

zval的定義在zend/zend.h

typedefstruct_zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value;/* value */ zend_uint refcount__gc; zend_uchar type;/* active type */ zend_uchar is_ref__gc; }; typedefunion_zvalue_value { longlval; /* long value */ doubledval; /* double value */ struct{ char*val; intlen; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;



其中php通過type判斷變量類型 存入value

如上也就是php內(nèi)核中弱類型的封裝,也是我們后面講的所有東西的原理和基礎(chǔ)。

0x03變量的強(qiáng)迫轉(zhuǎn)換


通過剛剛的了解,我們知道zval.type決定了存儲(chǔ)到zval.value的類型。

當(dāng)源代碼進(jìn)行1些未限制類型的比較,或數(shù)學(xué)運(yùn)算的時(shí)候,可能會(huì)致使zval.type的改變,同時(shí)影響zval.value的內(nèi)容改變。

當(dāng)int遇上string

cp.1 數(shù)學(xué)運(yùn)算

當(dāng)php進(jìn)行1些數(shù)學(xué)計(jì)算的時(shí)候

var_dump(0 == '0'); // true var_dump(0 == 'abcdefg');// true var_dump(0 === 'abcdefg'); // false var_dump(1 == '1abcdef'); // true



當(dāng)有1個(gè)對(duì)照參數(shù)是整數(shù)的時(shí)候,會(huì)把另外1個(gè)參數(shù)強(qiáng)迫轉(zhuǎn)換為整數(shù)。

相當(dāng)于對(duì)字符串部份

intval再和整數(shù)部份比較,其實(shí)也就是改變了zval.type的內(nèi)容 尤其注意的是,'1assd'的轉(zhuǎn)換后的值是1,而‘a(chǎn)sdaf’是0

也說明了intval會(huì)從第1位不是數(shù)字的單位開始進(jìn)行

所有也有

var_dump(intval('3389a'));//輸出3389



這個(gè)例子就告知我們,永久不要相信下面的代碼

if($a>1000){ mysql_query('update ... .... set value=$a') }

你以為這時(shí)候候進(jìn)入該支的萬無1失為整數(shù)了

其實(shí)$a多是1001/**/union...

cp.2 語句條件的疏松判斷

舉個(gè)例子
php的switch使用了疏松比較. $which會(huì)被自動(dòng)intval變成0
如果每一個(gè)case里面沒有break ,就會(huì)1直履行到包括,終究履行到我們需要的函數(shù),這里是成功包括

<?php if (isset($_GET['which'])){ $which=$_GET['which']; switch($which) { case0: case1: case2: require_once$which.'.php'; break; default: echoGWF_HTML::error('PHP-0817','Hacker NoNoNo!', false); break; }



cp.3 函數(shù)的疏松判斷

var_dump(in_array("abc",$array));


in_array ― 檢查數(shù)組中是不是存在某個(gè)值 參數(shù)

needle 待搜索的值。

Note: 如果 needle 是字符串,則比較是辨別大小寫的。 haystack 這個(gè)數(shù)組。

strict 如果第3個(gè)參數(shù) strict 的值為 TRUE 則 in_array() 函數(shù)還會(huì)檢查 needle 的類型是不是和 haystack 中的相同。

可以看到,只有加了strict才會(huì)對(duì)類型進(jìn)行嚴(yán)格比較, 那末我們?cè)俅伟颜魏妥址M(jìn)行比較呢?

var_dump(in_array("abc",$array1)); var_dump(in_array("1bc",$array2));

它遍歷了array的每一個(gè)值,并且作"=="比較(“當(dāng)設(shè)置了strict 用===”)

結(jié)果很明顯了

如果array1里面有個(gè)值為0,那末第1條返回就會(huì)為真//intval('abc')=0

如果array2里面有個(gè)值為1,那末第2條就會(huì)為真//intval('1bc')=1

array_search也是1樣的原理

這里的利用就很廣泛了,

很多程序員都會(huì)檢查數(shù)組的值,

那末我們完全可以用構(gòu)造好的int 0或1 騙過檢測(cè)函數(shù),使它返回為真

總結(jié)1下,在所有php認(rèn)為是int的地方輸入string,都會(huì)被強(qiáng)迫轉(zhuǎn)換,比如

$a = 'asdfgh';//字符串類型的a echo $a[2]; //根據(jù)php的offset 會(huì)輸出'd'</br>echo $a[x]; <code class="php functions">echo</code> <code class="php variable">$a</code><code class="php plain">[x]</code>;//根據(jù)php的預(yù)測(cè),這里應(yīng)當(dāng)是int型,那末輸入string,就會(huì)被intval成為0 也就是輸出'a'


當(dāng)數(shù)組遇上string

這1個(gè)例子我是在德國(guó)的1個(gè)ctf中遇到,很成心思
前面我們講的都是string和int的比較

那末array碰上int或是string會(huì)有甚么化學(xué)反應(yīng)?

由php手冊(cè)我們知道

Array轉(zhuǎn)換整型int/浮點(diǎn)型float會(huì)返回元素個(gè)數(shù);

轉(zhuǎn)換bool返回Array中是不是有元素;轉(zhuǎn)換成string返回'Array',并拋出warning。

那末實(shí)際利用是怎樣的呢?

if(!strcmp($c[1],$d) && $c[1]!==$d){ ... }


可以發(fā)現(xiàn),這個(gè)分支通過strcmp函數(shù)比較要求二者相等且“==”要求二者不相等才能進(jìn)入。

strcmp() 函數(shù)比較兩個(gè)字符串。

該函數(shù)返回:

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

這里的strcmp函數(shù)實(shí)際上是將兩個(gè)變量轉(zhuǎn)換成ascii 然后做數(shù)學(xué)減法,返回1個(gè)int的差值。

也就是說鍵入'a'和'a'進(jìn)行比較得到的結(jié)果就是0

那末如果讓$array和‘a(chǎn)’比較呢?

http://localhost:8888/1.php?a[]=1 var_dump(strcmp($_GET[a],'a'));


這時(shí)候候php返回了null!

也就是說,我們讓這個(gè)函數(shù)出錯(cuò)從而使它恒真,繞過函數(shù)的檢查。
下面給出1張疏松比較的表格


0x04時(shí)時(shí)防備弱類型


作為1個(gè)程序員,弱類型確切給程序員書寫代碼帶來了很大的便利,但是也讓程序員忘記了
$array =array();的習(xí)慣。
都說1切輸入都是有害的

那末其實(shí)可以說1切輸入的類型也是可疑的,永久不要相信弱類型的php下任何比較函數(shù),任何數(shù)學(xué)運(yùn)算。否則,你絕對(duì)是被php出賣的那1個(gè)。

轉(zhuǎn)自烏云

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久久久国产在线 | 亚洲欧美日韩综合二区三区 | 国产精品久久久久久久久免费观看 | 最新jizz欧美 | 免费区欧美一级毛片精品 | 亚洲视频免费 | 国产女主播一区二区在线观看 | 亚洲一区二区三区四 | 欧美性猛交xxxxx按摩欧美 | 特级黄色免费片 | 日本网站免费 | 夜夜躁日日躁 | 国产欧美久久久另类精品 | 国产三级做爰高清视频a | seba51久久精品 | 国产欧美一区二区三区小说 | 性欧美精品久久久久久久 | 亚洲图片小说区 | 日本美女一级黄色片 | 久久精品国产999久久久 | 男人边吃奶边玩下面舒服 | 成人免费性视频 | 亚洲男女一区二区三区出奶水了 | 欧美一级毛片高清免费观看 | 欧美一级特黄毛片免费 | 日本a v 黄| 国产精品无码久久av | 国产欧美日韩不卡一区二区三区 | 国产a级一级久久毛片 | 最近中文字幕2019高清免费 | 91精品人成在线观看 | 男人天堂亚洲色图 | 久久国产综合 | 久久久精品456亚洲影院 | 欧美一级毛片高清免费观看 | 欧美精品第1页在线播放 | 一区二区三区四区视频在线观看 | 亚州黄色 | 欧美 日韩 成人 | a爱做片免费网站 | 日本爱爱网站 |