1. 程式人生 > >程式碼審計 | 陣列返回NULL繞過

程式碼審計 | 陣列返回NULL繞過

<?php
$flag = "flag";

if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>

看到ereg就可以想到%00截斷

GET方式提交password,然後用ereg()正則規定密碼只能是一個或者多個數字、大小寫字母,必須含有--,最終才輸出flag

因為ereg函式存在NULL截斷漏洞,導致了正則過濾被繞過,所以可以使用%00截斷正則匹配。對於另一個難題可以使用科學計數法表示,計算器或電腦表達10的的冪是一般是e,也就是1.99714e13=19971400000000,所以構造1e8即100000000 > 9999999,在加上-

於是乎構造password[]=1e8%00*-*,成功得到答案