simple_php WP(php弱型別比較 型別轉換等)
阿新 • • 發佈:2022-03-21
simple_php WP(php弱型別比較 型別轉換等)
攻防世界simple_php,連結https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5072&page=1
題目如下
<?php show_source(__FILE__); include("config.php"); $a=@$_GET['a']; $b=@$_GET['b']; if($a==0 and $a){ echo $flag1; } if(is_numeric($b)){ exit(); } if($b>1234){ echo $flag2; } ?>
php弱型別比較
php中比較符號分為兩種,=== 和 ==
其中 ===為嚴格比較,首先比較資料型別是否相同,再進行值比較
而 ==為鬆散比較,會自動進行型別轉換後再比較
如果用==比較一個數字和字串,則字串會自動轉換成數值再進行數值比較。且字串開始部分決定了它的值,如果字串以合法的數值開始,則使用該數值,否則為0。
如下所示
<?php
var_dump("admin"==0); //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
?>
同時注意到題目第6行處
if($a==0 and $a)
還需要考慮將變數$a型別轉化為bool後的值,在本地編寫bool.php測試轉化結果
//bool.php
<?php
$a=@$_GET['a'];
var_dump($a);
settype($a,"bool");//將變數$a強制轉化為bool型別
var_dump($a);
?>
上圖為測試結果,可以看到通過get方法將a=123穿入,得到變數$a為字串型別,值為'123',轉化後為true。一般情況下,其他型別轉換為bool型別時都為true,但空型別和0、字串"0"等為FALSE,具體如下。
轉換為布林值時,以下值為FALSE:
- 布林值FALSE本身
- 整數0(零)
- 浮點數0.0(零)
- 空字串和字串“ 0”
- 零元素陣列
- 成員變數為零的物件(僅PHP 4)
- 特殊型別NULL(包括未設定的變數)
- 從空標籤建立的SimpleXML物件
其他所有值均視為TRUE(包括任何資源)。
同時還需要主要到題目第9行
if(is_numeric($b))
is_numeric() 函式用於檢測變數是否為數字或數字字串。如果指定的變數是,則返回 TRUE,否則返回 FALSE
所以最後構造URL後加上 /?a=qwe&b=2222a ,得到flag。
變數$a可以為任意轉化為數值為0,轉化為bool值為true的字串,
變數$b可以為任意非數字非數字字串,且轉化為數值後的值大於1234的字串。
參考