WeChall_PHP-0817
WeChall_PHP-0817
題目:
核心代碼:
<?php if (isset($_GET['which'])) {$which = $_GET['which'];switch ($which) {case 0:case 1:case 2:require_once $which.'.php'; break;default:echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);break;}} ?>php關(guān)鍵語(yǔ)法分析:
Switch 語(yǔ)句 如果您希望有選擇地執(zhí)行若干代碼塊之一,請(qǐng)使用 Switch 語(yǔ)句。使用 Switch 語(yǔ)句可以避免冗長(zhǎng)的 if..elseif..else 代碼塊。語(yǔ)法 switch (expression) { case label1:expression == label1 時(shí)執(zhí)行的代碼 ;break; case label2:expression == label2 時(shí)執(zhí)行的代碼 ;break; default:表達(dá)式的值不等于 label1 及 label2 時(shí)執(zhí)行的代碼; }工作原理:對(duì)表達(dá)式(通常是變量)進(jìn)行一次計(jì)算 把表達(dá)式的值與結(jié)構(gòu)中 case 的值進(jìn)行比較 如果存在匹配,則執(zhí)行與 case 關(guān)聯(lián)的代碼 代碼執(zhí)行后,break 語(yǔ)句阻止代碼跳入下一個(gè) case 中繼續(xù)執(zhí)行,這里需要注意!!!如果沒(méi)有break語(yǔ)句,那么會(huì)默認(rèn)執(zhí)行下一個(gè)case語(yǔ)句 如果沒(méi)有 case 為真,則使用 default 語(yǔ)句注:這里需要加強(qiáng)注意的是,php中switch/case是使用松散比較,也就是弱類(lèi)型比較的,并不是=,是==
代碼詳解:
<?php if (isset($_GET['which'])) //檢測(cè)變量which是否設(shè)置,并且不是 NULL {$which = $_GET['which']; //get請(qǐng)求參數(shù)whichswitch ($which) { //switch用法見(jiàn)上面的php關(guān)鍵語(yǔ)法分析,要記住這里的switch是使用的松散比較!!!下面實(shí)際測(cè)試時(shí)會(huì)寫(xiě)到case 0: //還有一點(diǎn)很重要的,這里的case語(yǔ)句后面如果沒(méi)有break,他會(huì)繼續(xù)執(zhí)行下面case語(yǔ)句的代碼段,并不會(huì)再比較下面表達(dá)式值與case值是否相等,而是直接執(zhí)行代碼段case 1:case 2:require_once $which.'.php'; break; //包含文件$which'.php'default: //如果表達(dá)式的值與case的值沒(méi)有一個(gè)相等的,那么就執(zhí)行default語(yǔ)句段echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);break;}} ?>這里希望我們使用文件包含,包含solution.php文件,因此,我們嘗試包含0
http://www.wechall.net/challenge/php0817/index.php?which=0發(fā)現(xiàn)可以包含,那么這是我們可以將0改為solution
http://www.wechall.net/challenge/php0817/index.php?which=solution有人就要說(shuō)了,這里代碼顯示,只能是$which=0或1或2時(shí),才能執(zhí)行對(duì)應(yīng)case里的代碼段。
因此,這里我就要說(shuō)一說(shuō)我之前提到的switch/case使用的是松散類(lèi)型比較,就是當(dāng)你輸入solution時(shí),它會(huì)進(jìn)行
這里的松散比較,也就是弱類(lèi)型比較,先判斷solution==0是否為true
注:使用==進(jìn)行比較時(shí),如果是數(shù)字與字符串進(jìn)行比較(或者字符串與數(shù)字),會(huì)先將字符串類(lèi)型轉(zhuǎn)化成數(shù)值型再比較,字符串的開(kāi)始部分決定了它的值,如果該字符串以合法的數(shù)值開(kāi)始,則使用該數(shù)值,否則其值為0。這里的solution因?yàn)槭亲帜搁_(kāi)頭,最后0==0,于是執(zhí)行case 0下面的代碼段,但是case 0 下面沒(méi)有代碼段,又沒(méi)有break語(yǔ)句,但此時(shí)case 0 是為true的,在它代碼段中沒(méi)有遇到break的情況下,繼續(xù)執(zhí)行case 1下的代碼段,又因?yàn)閏ase 1下又沒(méi)有break語(yǔ)句,再執(zhí)行case 2下的代碼段,包含文件solution.php,這時(shí),有一個(gè)break語(yǔ)句,代碼執(zhí)行結(jié)束。
注:如果第一個(gè)case匹配成功,執(zhí)行下面代碼段時(shí)都沒(méi)有break語(yǔ)句,那么再執(zhí)行完所有的代碼段后,再執(zhí)行default下的代碼段才會(huì)退出代碼執(zhí)行,也就是從匹配成功開(kāi)始,后面的代碼段只要沒(méi)有break,全部執(zhí)行一遍,直到遇到break為止,就不再執(zhí)行后面的代碼段了。
例:
執(zhí)行結(jié)果:
redbluegreenall no參考鏈接:
https://www.tuziang.com/combat/1542.html
http://ju.outofmemory.cn/entry/345804
總結(jié)
以上是生活随笔為你收集整理的WeChall_PHP-0817的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最新qq男生繁体字网名大全98个
- 下一篇: MOCTF-Web-一道水题