安全狗上传php,文件上传安全狗绕过与防御

搭建漏洞服务

还是先搭一个漏洞的服务吧:新建一个~/Desktop/php/upload文件夹,文件夹下存在如下结构的文件和文件夹:

$ tree

.

├── files

└── upload.php

1 directory, 1 file

upload.php:

enctype="multipart/form-data">

Filename:

if ($_FILES["file"]["error"] > 0) {

echo "Error: " . $_FILES["file"]["error"] . "
";

}

else {

// 判断当期目录下的 upload 目录是否存在该文件

// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777

if (file_exists("files/" . $_FILES["file"]["name"]))

{

echo $_FILES["file"]["name"] . " 文件已经存在。 ";

}

else

{

echo "PWD: " . `pwd` . "
";

echo "Upload: " . $_FILES["file"]["name"] . "
";

echo "Type: " . $_FILES["file"]["type"] . "
";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";

// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下

$file_path = "files/" . $_FILES["file"]["name"];

$success = move_uploaded_file($_FILES["file"]["tmp_name"], $file_path);

echo "Stored in: " .$file_path."
";

if(file_exists($file_path)){

$str = file_get_contents($file_path);//将整个文件内容读入到一个字符串中

$str = str_replace("\r\n","
",$str);

$str = htmlspecialchars($str);

echo "File Contents: $str";

}

}

}

?>

配置nginx服务:

server {

listen 80;

listen [::]:80;

server_name test.com;

root /home/repersp/Desktop/php;

index test.php;

location ~ \.php$ {

include snippets/fastcgi-php.conf;

# With php7.0-cgi alone:

# fastcgi_pass 127.0.0.1:9000;

# With php7.0-fpm:

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

}

}

改完host之后网站正常访问,接着我们上传一句话,这里因为之前装了安全狗,我们用%00截断过一下狗:

e04d3fcb4df2

1544361917866.png

文件上传好了,用一下看看:

e04d3fcb4df2

1544360944473.png

可以看到,即使用了通用防护措施,但是若网站本身就是一个脆弱的,那么依旧有风险。

防护

我们知道,通过php判断后缀名,判断文件开头的几个字符是否为图片,判断Content-Type都是可以通过伪造绕过的,唯一的办法就是配置nginx,确保上传目录不被执行:

server {

listen 80;

listen [::]:80;

server_name test.com;

root /home/repersp/Desktop/php;

index test.php;

location ~ \/upload\/files\/.* {

root /home/repersp/Desktop/php;

}

location ~ \.php$ {

include snippets/fastcgi-php.conf;

# With php7.0-cgi alone:

# fastcgi_pass 127.0.0.1:9000;

# With php7.0-fpm:

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

}

}

可以看到这样做代码只是展现在前台而不会被执行

e04d3fcb4df2

1544363449099.png

任意文件读取防御

如果网站需要用户上传zip压缩文件,并且展现了zip压缩的内容,那么用户可以上传一个压缩后的符号链接文件,这样php会打印被链接的文件内容,即任意文件读取,这时代码里面还需要判断zip压缩里的文件类型。

目录穿越防御

如果网站设计缺陷可以使用../将文件上传到上层目录(当然这里不存在,因为表单默认过滤了../及其前面的字符),并且用户可以控制目录的话,还需要在代码中检查文件名。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值