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