你不知道的文件上传漏洞服务器端编程语言(专业超文本预处理器的缩写)代码分析
漏洞描述
开发中文件上传功能很常见,作为开发者,在完成功能的基础上我们一般也要做好安全防护。文件处理一般包含两项功能,用户上传和展示文件,如上传头像。
文件上传攻击示例
upload.php
?PHP $ uploaddir=' uploads/';$uploadfile=$uploaddir .基本名称($ _ FILES[' user FIle '][' name ']);如果(move _ uploaded _ File($ _ FILES['用户文件'][' tmp _ name '],$uploadfile)){ echo 'File有效,并且已成功上传“\ n”;} else { echo '文件上传失败“\ n”;}?upload.html
表单名称='上传'操作='upload1.php '方法=' POST ' ENCTYPE=' multipart/form data '选择要上传的文件输入类型=“文件”名称='userfile '输入类型='提交'名称='上传'值='上传'/表单上述代码未经过任何验证,恶意用户可以上传服务器端编程语言(专业超文本预处理器的缩写)文件,代码如下
?PHP eval($ _ GET[' command ']);
恶意用户可以通过访问如http://server/uploads/shell.php?command=phpinfo();来执行远程命令
内容类型验证
upload.php
?phpif($ _ FILES[' user FIle '][' type ']!='image/gif') {//获取超文本传送协议(超文本传输协议的缩写)请求头信息中ContentType回应"抱歉,我们只允许上传GIF格式图像";退出;} $ uploaddir=' uploads/';$上传文件=$上传目录。base name($ _ FILES[' user FIle '][' name ']);如果(move _ uploaded _ File($ _ FILES['用户文件'][' tmp _ name '],$uploadfile)){ echo 'File有效,并且已成功上传“\ n”;} else { echo '文件上传失败“\ n”;}?该方式是通过超文本传送协议(超文本传输协议的缩写)请求头信息进行验证,可通过修改内容类型==图像/jpg绕过验证,可以通过脚本或BurpSuite、小提琴修改如下内容-处置:表格-数据;名称=' userfilefilename=' shell。“PHP”内容类型:图像/gif
图片类型验证
该方法通过读取文件头中文件类型信息,获取文件类型
备注:如JPEG/JPG文件头标识为FFD8
upload.php
?PHP $ imageinfo=getimagesize($ _ FILES[' user FIle '][' tmp _ name ']);if($imageinfo['mime']!='image/gif' $imageinfo['mime']!='image/jpeg') { echo '抱歉,我们只接受GIF格式和联合图象专家组图像\ n ';退出;} $ uploaddir=' uploads/';$uploadfile=$uploaddir .基本名称($ _ FILES[' user FIle '][' name ']);如果(move _ uploaded _ File($ _ FILES['用户文件'][' tmp _ name '],$uploadfile)){ echo 'File有效,并且已成功上传“\ n”;} else { echo '文件上传失败“\ n”;}?可以通过图片添加注释来绕过此验证。如添加注释?PHP phpinfo();保存图片后将其扩展名改为php,则可成功上传。上传成功后访问该文件则可看到如下显示
文件扩展名验证
通过黑名单或白名单对文件扩展名进行过滤,如下代码
upload.php
?php $黑名单=数组('。php ',' .phtml ',php3 ',PHP 4’);foreach($黑名单为$ item){ if(preg _ match('/$ item \ $/I ',$ _ FILES[' user FIle '][' name ']){ echo '我们不允许上传服务器端编程语言(Professional Hypertext Preprocessor的缩写)文件\ n ';退出;} } $ uploaddir=' uploads/';$uploadfile=$uploaddir .基本名称($ _ FILES[' user FIle '][' name ']);如果(move _ uploaded _ File($ _ FILES['用户文件'][' tmp _ name '],$uploadfile)){ echo 'File有效,并且已成功上传“\ n”;} else { echo '文件上传失败“\ n”;}?当黑名单不全,构造特殊文件名可以绕过扩展名验证
直接访问上传的文件
将上传文件保存在非网根目录下其他文件夹下,可以防止用户通过路径直接访问到文件。upload.php
?PHP $ uploaddir=' d :/uploads/';$uploadfile=$uploaddir .基本名称($ _ FILES[' user FIle '][' name ']);如果(move _ uploaded _ File($ _ FILES['用户文件'][' tmp _ name '],$uploadfile)) {echo 'File有效,并且已成功上传“\ n”;} else {echo '文件上传失败“\ n”;}?用户不可以直接通过http://localhost/uploads/来访问文件,必须通过view.php来访问view.php
?PHP $ uploaddir=' d :/uploads/';$ name=$ _ GET[' name '];readfile($uploaddir).$ name);查看文件代码未验证文件名,用户可以通过例如http://localhost/view.php?名称=.//php/upload.php,查看指定的文件
解决漏洞示例
upload.php
?phprequire _ once ' db . PHP $ uploaddir=' d :/uploads/';$uploadfile=tempnam($uploaddir,' upload _ ');if(move _ uploaded _ file($ _ FILES[' user file '][' tmp _ name '],$ upload file)){ $ db=db : connect(' MySQL ://username :[email protected/database]);if(pear : iserror($ db)){ unlink($ upload file);连接到数据库时出错;}$res=$db-query('INSERT INTO上传SET名称=?original_name=?mime_type=?数组(basename($uploadfile),base name($ _ FILES[' user file '][' name ']),$ _ FILES[' user file '][' type ']);if(pear : iserror($ RES)){ unlink($上传文件);将数据保存到数据库时出错。文件未上传";} $ ID=$ db-getOne(' SELECT LAST _ INSERT _ ID()' FROM uploads ');"回应"文件有效,并已成功上传。你可以在a href=\'view.php?id=$ id '在此/a \ n ';} else {echo '文件上传失败“\ n”;}?view.php
?phprequire _ once ' db . PHP $ uploaddir=' d :/uploads/';$ id=$ _ GET[' id '];if(!is_numeric($id)) {die('文件编号必须是数字');} $ db=db :3360 CONNECT(' MySQL :/[电子邮件保护]/db ');if(pear : iserror($ db)){ die('连接数据库时出错');}$file=$db-getRow('SELECT名称,mime_type FROM上传WHERE id=?数组($id),DB _ FETCHMODE _ ASSOC);if(pear : iserror($ file)){ die('从数据库获取数据时出错');} if(is _ null($ File)| | count($ File)=0){ die('找不到文件');}标题(“内容类型:”.$ file[' mime _ type ']);readfile($uploaddir).$ file[' name ']);上述代码文件名随机更改,文件被存储在网根目录之外,用户通过编号在数据库中查询文件名,读取文件,可以有效的阻止上述漏洞发生
总结
通过以上示例分析,可总结一下几点
1.文件名修改,不使用用户上传的文件名
2.用户不可以通过上传路径直接访问文件
3.文件查看采用数据库获取文件名,从而在相应文件服务器读取文件
4.文件上传限制文件大小,个人上传数量等
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:你不知道的文件上传漏洞服务器端编程语言(专业超文本预处理器的缩写)代码分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。