筆記
== : 比較運算符號 不會檢查條件式的表達式的類型
===: 恆等計算符 , 同時檢查表達式的值與類型。(會檢查表達式類型,如bool)
PHP序列化與反序列化
serialize() 對輸入的數據進行序列化轉換
unserialize() 恢復原先變量,還原已經序列化的對象。
關於php序列化與反序列化,可以參考: http://www.111cn.net/phper/php-cy/62969.htm
intval():變量轉成整數類型
如果參數是字符串,則返回字符串中第一個不是數字的字符之前的數字串所代表的整數值。
如果字符串第一個是‘-',則從第二個開始算起。
如果參數是浮點數,則返回他取整之后的值。
當然intval()返回的值在一個4字節所能表示的范圍之內(-2147483648~2147483647),對於超過這個范圍的值將用邊界值代替。
* 當php進行一些數學計算的時候,當有一個對比參數是整數的時候,會把另外一個參數強制轉換為整數。
1 var_dump(0 == '0'); // true 2 var_dump(0 == 'abcdefg'); // true 3 var_dump(0 === 'abcdefg'); // false 4 var_dump(1 == '1abcdef'); // true
* bool類型的true跟任意字符串可以弱類型相等
鏈接: http://www.shiyanbar.com/ctf/1810
考點: PHP弱類型
點擊"登錄"沒反應,右擊查看源代碼,發現這么一段:
這里說明要為用戶名傳入一個字符串,並且它經過md5加密后要等於0。
在某些情況下,PHP會把類數值數據(如含有數字的字符串等)轉換成數值處理,== 運算符就是其中之一。在使用 == 運算符對兩個字符串進行松散比較時,PHP會把類數值的字符串轉換為數值進行比較,如果參數是字符串,則返回字符串中第一個不是數字的字符之前的數字串所代表的整數值。比如: '3' == '3ascasd'結果為true。
因此只要找到一個字串加密后第一個字符為0即可,這里提供幾個:240610708,aabg7XSs,aabC9RqS
在用戶名處輸入以上其中一個字符串,提交后出現提示: /user.php?fame=hjkleffifer
訪問得到源代碼:
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if ($data_unserialize['user'] == '???' && $data_unserialize['pass'] == '???') { print_r($flag); }
代碼意思是把post提交的password值經過"反序列化"得到一個數組,要求數組里的user和pass都等於某個值時就打印flag。
但是我們不知道兩處???到底是什么,因此無法考慮用php函數構造這樣的值。
別忘了還有一個提示: "偉大的科學家php方言道:成也布爾,敗也布爾" ,bool類型的true跟任意字符串可以弱類型相等。因此我們可以構造bool類型的序列化數據 ,無論比較的值是什么,結果都為true。(a代表array,s代表string,b代表bool,而數字代表個數/長度)
構造password值為: a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
在密碼欄中提交構造的值,即可獲取flag: ctf{dwduwkhduw5465}