1. 程式人生 > 其它 >simple_php WP(php弱型別比較 型別轉換等)

simple_php WP(php弱型別比較 型別轉換等)

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:

  1. 布林值FALSE本身
  2. 整數0(零)
  3. 浮點數0.0(零)
  4. 空字串和字串“ 0”
  5. 零元素陣列
  6. 成員變數為零的物件(僅PHP 4)
  7. 特殊型別NULL(包括未設定的變數)
  8. 從空標籤建立的SimpleXML物件

其他所有值均視為TRUE(包括任何資源)。

同時還需要主要到題目第9行

if(is_numeric($b))

is_numeric() 函式用於檢測變數是否為數字或數字字串。如果指定的變數是,則返回 TRUE,否則返回 FALSE

所以最後構造URL後加上 /?a=qwe&b=2222a ,得到flag。

變數$a可以為任意轉化為數值為0,轉化為bool值為true的字串,

變數$b可以為任意非數字非數字字串,且轉化為數值後的值大於1234的字串。

參考

https://www.cnblogs.com/Mrsm1th/p/6745532.html