這道題以前做過但是沒有好好的總結下來。今天又做了一下,於是特地記錄於此。
首先就是針對源碼進行審計:
關於create_function
這個函數可以看一下這個:http://www.php.cn/php-weizijiaocheng-405287.html
我們先來了解一下生成的匿名函數是什么形式的。
按照這里來說那么生成的匿名函數應該是這樣的
<?php function lamdba() { $_GET[code]; }
?>
函數中間的部分在create_function
中默認以eval()來進行執行的,但是看看題目要想執行這個函數,必須保證$_GET['code'] === "echo 'Hello World';"
那這樣我們執行了還有什么用啊??
所以這里面還可以進行繞過,我們可以通過輸入將執行的內容整到函數外,這樣就不需要用$func();來進行執行了。
輸入 ?code=xxxxx;}phpinfo();/*
將輸入的值放進去你就可以發現:
<?php function lambda() { xxxxx;}phpinfo();/* } ?>
實際上在xxxx;}的時候函數就已經結束了,然后后面的內容我們就相當於超出函數之外了,后面巧妙的利用了注釋符將函數后面的大括號消掉了!!
而我們輸入的整個code都會以eval()的方式執行,因此就可造成命令執行。。
后面獲取flag的內容就很簡單了。。。
還看了一些博客,說這個函數在PHP 7.2被取消了。。。可是我PHP7.3.6還可以使用!
我也不是太清楚,如果有大佬知道的話,請賜教!