php代碼審計(jì)之弱類型引發(fā)的災(zāi)難

有人說php是世界上最好的語(yǔ)言吧凉,這可能是對(duì)開發(fā)人員來說,確實(shí)有這方面的特點(diǎn)怎栽,因?yàn)樗_發(fā)起來不像其他語(yǔ)言那樣麻煩丽猬,就比如:弱類型,它不需要像java等語(yǔ)言那樣明確定義數(shù)據(jù)類型熏瞄。這給開發(fā)帶來了很大的便利脚祟,所有的數(shù)據(jù)類型都可以用$xx來定義,而不需要int i,string a,fload b等等這樣去定義它强饮。這樣確實(shí)很方便由桌,因?yàn)閜hp幫助你判斷了數(shù)據(jù)類型,比如整形int ,你只要$a=1;那這個(gè)1就是整形邮丰,$a=’abc’那這個(gè)abc就會(huì)被php判斷為字符串類型行您。但是弱類型方便是方便,但是帶來的安全問題也是巨大的剪廉,很多的php安全漏洞都是因?yàn)樗鼛淼摹?/p>

本文是給做代碼審計(jì)漏洞挖掘和滲透測(cè)試人員總結(jié)的一個(gè)思路娃循,有不對(duì)的地方請(qǐng)多多指出。

這里主要是介紹如何通過利用弱類型來做php代碼審計(jì)的漏洞挖掘斗蒋。漏洞挖掘關(guān)鍵點(diǎn)肯定在變量上捌斧,因?yàn)樽兞靠梢猿薪油鈦韰?shù)和內(nèi)部數(shù)據(jù)的交互工作,這是漏洞的起因泉沾,也是必要條件捞蚂。如果外來參數(shù)是惡意代碼,同時(shí)再因?yàn)槭褂昧巳躅愋偷暮瘮?shù)或者比較運(yùn)算符導(dǎo)致了惡意參數(shù)的數(shù)據(jù)進(jìn)入了程序里比如數(shù)據(jù)庫(kù)爆哑,就可能引發(fā)想象不到的破壞力。這里我介紹了三種可以導(dǎo)致惡意數(shù)據(jù)進(jìn)入判斷體里的函數(shù)和比較運(yùn)算符舆吮,他們有共同的特點(diǎn)揭朝,就是和數(shù)據(jù)比較队贱,然后把外來變量做自動(dòng)類型轉(zhuǎn)換,如果外來變量是惡意變量潭袱,利用一定的方法就可以繞過你想繞過的地方比如判斷if條件柱嫌,讓惡意變量進(jìn)入到條件體內(nèi),惡意變量如果在判斷體內(nèi)被代入到了數(shù)據(jù)庫(kù)的增刪改查操作中就可以引發(fā)sql注入等漏洞問題屯换。

01第一個(gè)要介紹的是 is_numeric编丘,它的功能是,判斷參數(shù)是否為數(shù)字或者數(shù)字字符串彤悔,如果是則返回true嘉抓,假返回false,它的弱類型問題是他支持十六進(jìn)制0x格式晕窑,如何引發(fā)的安全問題讓我們繼續(xù)觀看抑片。

安全問題描述:is_numeric在做判斷時(shí)候,如果攻擊者把payload改成二進(jìn)制0x..杨赤,is_numeric會(huì)先對(duì)十六進(jìn)制做類型判斷敞斋,十六進(jìn)制被判斷為數(shù)字型,為真疾牲,就進(jìn)入了條件語(yǔ)句植捎,如果再把這個(gè)代入進(jìn)入sql語(yǔ)句進(jìn)入mysql數(shù)據(jù)庫(kù),mysql數(shù)據(jù)庫(kù)會(huì)對(duì)hex進(jìn)行解析成字符串存入到數(shù)據(jù)庫(kù)中阳柔,如果這個(gè)字段再被取出來二次利用焰枢,就可能因?yàn)槎巫⑷肼┒?比如這樣:

if(is_numeric($_GET['num']))

{

echo $_GET['num'];

echo “
”;

//假設(shè)這個(gè)插入進(jìn)了mysql數(shù)據(jù)庫(kù),mysql數(shù)據(jù)庫(kù)就會(huì)把十六進(jìn)制轉(zhuǎn)換成了字符串盔沫,這里為了方便用 Hex2String 函數(shù)代替

echo Hex2String($_GET['num']);

//輸入http://127.0.01/equal.php?num=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

// 輸出0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f2121272

//輸出9999999999999 union all (select ‘Hello!!’)

}

function Hex2String($hex){

$string=”;

for ($i=0; $i < strlen($hex)-1; $i+=2){

$string .= chr(hexdec($hex[$i].$hex[$i+1]));

}

return $string;

}


可以看到医咨,數(shù)據(jù)庫(kù)存入的是 9999999999999 union all (select ‘Hello!!’) ,如果被取出來再輸出沒做過濾就會(huì)引發(fā)二次注入

防御方法:用intval函數(shù)獲取變量整數(shù)值架诞,對(duì)從數(shù)據(jù)庫(kù)取出變量做過濾

上面的不理解拟淮,可以看一個(gè)案例分析:

這里有個(gè)例子:

圖1.1

問題出現(xiàn)在if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id'])) 如果能繞過is_numeric,就可以執(zhí)行mysql_query(“INSERT INTO vote VALUES ({$id}, {$vote}, ‘{$login}’)”); 注入sql語(yǔ)句谴忧。

999999999999 union all \(select ‘Hello!!’\)

轉(zhuǎn)成 hex=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

我們提交的參數(shù):

vote=1&submit=&id=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729

圖1.2

我們可以清楚的在圖片里看到很泊,我們插入的Hello!在其他查詢位置被顯示了出來,引發(fā)了二次注入漏洞問題沾谓。

02 第二個(gè)介紹的是比較運(yùn)算符的安全隱患委造,比如 ==,!= ,同時(shí)還會(huì)介紹他們和恒等式和=== ,!==的區(qū)別和安全問題

函數(shù)功能:

==和!=是比較運(yùn)算符號(hào) 不會(huì)檢查條件式的表達(dá)式的類型

安全問題描述:php是弱類型均驶,在做匹配和比較時(shí)候昏兆,會(huì)根據(jù)匹配的類型做類型轉(zhuǎn)換,如果后面是整形妇穴,如$a==1,因?yàn)楹竺娴?是整形爬虱,那前面gpc傳進(jìn)來就會(huì)轉(zhuǎn)換成整形隶债,轉(zhuǎn)換規(guī)則是前面的數(shù)字不變后面字母被當(dāng)成字符型舍去,也就是1a會(huì)變成1跑筝,判斷為真進(jìn)入判斷體死讹;如果這樣$a==”1″,那么后面的就是字符串1,如果gpc傳進(jìn)來1a會(huì)發(fā)現(xiàn)為假,因?yàn)閭鬟M(jìn)來的1a做類型轉(zhuǎn)換成字符串后就是1a曲梗,字符串1a和字符串1不想等赞警,所以為假,這時(shí)候要改成1才能進(jìn)入判斷體內(nèi)虏两;同樣在進(jìn)行加減乘除比較運(yùn)算判斷時(shí)候也會(huì)做自動(dòng)類型轉(zhuǎn)換愧旦,如果跟整形比較,1a會(huì)轉(zhuǎn)換成1碘举,跟字符串比較忘瓦,a1就會(huì)轉(zhuǎn)換成字符串a(chǎn)1,其他類型也一樣引颈。

如果你覺得這樣很繞看不懂耕皮,那就簡(jiǎn)單說,如果和字符串做比較蝙场,就會(huì)轉(zhuǎn)換成字符串凌停,如果和整形做比較,就會(huì)自動(dòng)轉(zhuǎn)換成整形售滤,只不過整形自動(dòng)轉(zhuǎn)換的時(shí)候php就是用的intval 函數(shù)導(dǎo)致1a為1罚拟。intval函數(shù)可以自查下,大致如:intval(“a”)=0; intval(12.3223)=12; intval(“12abc”)=12;

比如:


$a = $_GET['a'];

if ($a==1)

{

echo ‘vul->’.$a;

}

同樣!=也會(huì)有這個(gè)問題完箩,換成2就可以進(jìn)到判斷體內(nèi)


$a = $_GET['a'];

if ($a!=1)

{

echo ‘vul->’.$a;

}

防范方法:用===和!==來做判斷赐俗,他們是恒等計(jì)算符, 同時(shí)檢查表達(dá)式的值與類型

跟數(shù)字有關(guān)的運(yùn)算都可能引起弱類型漏洞弊知,比如下面這個(gè)運(yùn)算

但是這樣也不完全可以阻逮,比如加減乘除運(yùn)算符也會(huì)做類型轉(zhuǎn)換

假如這樣:


$a = $_GET['a'];

$b = $_GET['b'];

if($a+$b===2)

{

echo “vul->”.$a.”
”.$b;

}

所以最安全的防范是對(duì)gpc獲取數(shù)字型的參數(shù)值進(jìn)行intval強(qiáng)制類型轉(zhuǎn)換或者過濾,再做判斷


$a = intval($_GET['a']);

$b = intval($_GET['b']);

if($a+$b===2)

{

echo “vul->”.$a.”
”.$b;

}

03 第三個(gè)要就介紹的是in_array()函數(shù)

函數(shù)功能:判斷一個(gè)值是否在數(shù)組中存在

安全問題描述:這個(gè)函數(shù)的弱類型問題是秩彤,判斷的值在比較之前會(huì)做類型轉(zhuǎn)換叔扼,同樣是弱類型問題,比如in_array($_GET['id'],array(1,2,3,4,5)),如果我們傳入 id=1’ union select… ,判斷就會(huì)為真漫雷,因?yàn)閕d被轉(zhuǎn)換成1瓜富,這時(shí)候假如我們?cè)侔?_GET['id']拼接到數(shù)據(jù)庫(kù)語(yǔ)句中,就會(huì)引起sql注入漏 洞降盹。

if(in_array($_GET['id'],array(1,2,3,4,5)))

{

echo $_GET['id'];

//輸入http://127.0.01/equal.php?id=1′id

//輸出: 1′id

}

防范方法:外來變量要做過濾与柑,或者強(qiáng)制類型轉(zhuǎn)換

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子价捧,更是在濱河造成了極大的恐慌每辟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干旧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妹蔽,警方通過查閱死者的電腦和手機(jī)椎眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胳岂,“玉大人编整,你說我怎么就攤上這事∪榉幔” “怎么了掌测?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)产园。 經(jīng)常有香客問我汞斧,道長(zhǎng),這世上最難降的妖魔是什么什燕? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任粘勒,我火速辦了婚禮,結(jié)果婚禮上屎即,老公的妹妹穿的比我還像新娘庙睡。我一直安慰自己,他們只是感情好技俐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布乘陪。 她就那樣靜靜地躺著,像睡著了一般雕擂。 火紅的嫁衣襯著肌膚如雪啡邑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天捂刺,我揣著相機(jī)與錄音谣拣,去河邊找鬼。 笑死族展,一個(gè)胖子當(dāng)著我的面吹牛森缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仪缸,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贵涵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宾茂,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓷马,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跨晴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欧聘,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年端盆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀骤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焕妙,死狀恐怖蒋伦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焚鹊,我是刑警寧澤痕届,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站末患,受9級(jí)特大地震影響研叫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璧针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一蓝撇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陈莽,春花似錦渤昌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至私植,卻和暖如春忌栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曲稼。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工索绪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贫悄。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓瑞驱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窄坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唤反,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容