php中提交代码漏洞,[代码审计] PHP 上传漏洞总结

背景:

这两天在网上瞎看,看到别人总结的一个上传漏洞靶场,觉得很不错,就是自己测试了下,感觉对代码审计能力提高还是有帮助的,下面简单介绍靶场的解题思路(当然,每一题可能存在多种上传方式)。

一、环境搭建

建议使用靶场提供的测试环境。

二、解题思路

Pass-01:

检查代码:

function checkFile() {

var file = document.getElementsByName('upload_file')[0].value;

if (file == null || file == "") {

alert("请选择要上传的文件!");

return false;

}

//定义允许上传的文件类型

var allow_ext = ".jpg|.png|.gif";

//提取上传文件的类型

var ext_name = file.substring(file.lastIndexOf("."));

//判断上传文件类型是否允许上传

if (allow_ext.indexOf(ext_name + "|") == -1) {

var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;

alert(errMsg);

return false;

}

}

由代码可知程序仅用js在前端做了简单的后缀名检查,很容易绕过。

27de39b45aa6dcbc3da610bcb2f8fc0c.png

本地目录放两个文件,一个phpinfo.png,一个phpinfo.php。 上传phpinfo.png抓包,在这将png改成php即可。

Pass-02:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];

$is_upload = true;

}

} else {

$msg = '文件类型不正确,请重新上传!';

}

} else {

$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';

}

}

这里仅对上传type类型做了判断。

2cffe62f8bb516430a78bcdf4fd45a97.png

这里将Content-Type: application/octet-stream修改成Content-Type: image/png即可。

Pass-03:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

$deny_ext = array('.asp','.aspx','.php','.jsp');

$file_name = trim($_FILES['upload_file']['name']);

$file_name = deldot($file_name);//删除文件名末尾的点

$file_ext = strrchr($file_name, '.');

$file_ext = strtolower($file_ext); //转换为小写

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

$file_ext = trim($file_ext); //收尾去空

if(!in_array($file_ext, $deny_ext)) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];

$is_upload = true;

}

} else {

$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';

}

} else {

$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';

}

}

这里只对基本类型做了简单的判断,可以上传php3,php5等类型的文件,由于我的环境配的不能解析php3等类似的文件,所以这里我们上传.htaccess文件,内容如下

AddType application/x-httpd-php .jpg

意思让服务器将.jpg文件当做php解析。

然后在上传phpinfo.jpg即可。

Pass-04:

同pass-03一样,先上传.htaccess, 然后上传phpinfo.jpg

Pass-05:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

$file_name = trim($_FILES['upload_file']['name']);

$file_name = deldot($file_name);//删除文件名末尾的点

$file_ext = strrchr($file_name, '.');

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

$file_ext = trim($file_ext); //首尾去空

if (!in_array($file_ext, $deny_ext)) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR . '/' . $file_name;

$is_upload = true;

}

} else {

$msg = '此文件不允许上传';

}

} else {

$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';

}

}

代码中未对文件后缀大小写做判断,直接上传phpinfo.PHP即可。

Pass-06:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

$file_name = trim($_FILES['upload_file']['name']);

$file_name = deldot($file_name);//删除文件名末尾的点

$file_ext = strrchr($file_name, '.');

$file_ext = strtolower($file_ext); //转换为小写

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

if (!in_array($file_ext, $deny_ext)) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR . '/' . $file_name;

$is_upload = true;

}

} else {

$msg = '此文件不允许上传';

}

} else {

$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';

}

}

上传phpinfo.php,使用burpsuit将文件名改成phpinfo.php. .即可

fd38f3f211caf61926ed1b3419b881b5.png

Pass-07:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

$file_name = trim($_FILES['upload_file']['name']);

$file_ext = strrchr($file_name, '.');

$file_ext = strtolower($file_ext); //转换为小写

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

$file_ext = trim($file_ext); //首尾去空

if (!in_array($file_ext, $deny_ext)) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR . '/' . $file_name;

$is_upload = true;

}

} else {

$msg = '此文件不允许上传';

}

} else {

$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';

}

}

上传phpinfo.php,使用burpsuit将文件名改成phpinfo.php.即可

b55e4d6651c6f20c5db601dc499e278c.png

Pass-08:

检查代码:

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

if (file_exists($UPLOAD_ADDR)) {

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

$file_name = trim($_FILES['upload_file']['name']);

$file_name = deldot($file_name);//删除文件名末尾的点

$file_ext = strrchr($file_name, '.');

$file_ext = strtolower($file_ext); //转换为小写

$file_ext = trim($file_ext); //首尾去空

if (!in_array($file_ext, $deny_ext)) {

if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {

$img_path = $UPLOAD_ADDR . '/' . $file_name;

$is_upload = true;

}

} else {

$msg = '此文件不允许上传';

}

} else {

$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';

}

}

上传phpinfo.php,使用burpsuit将文件名改成phpinfo.php ::$DATA即可

61e75a2a38b1d32afaca79a8f879966f.png

Pass-09:

同pass-06一样,抓包改文件名为phpinfo.php. .即可

Pass-10:

检查代码:

```

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值