源码分析
第一行是白名单过滤,只允许白名单中的类型上传
第二行中$_FILES['upload_file']['name']是获取上传文件的文件名,strrpos($_FILES['upload_file']['name'],".",是获得文件名中最后一次出现"."的位数。那么第二行代码的作用就是,获取文件名最后出现点的下一位的数据,记为$file_ext。通过这样就完成了文件后缀的获取
第三行if判断语句,如果$file_ext在白名单中就继续下面的操作,否则就显示上传失败
第四行是将文件暂时存放在一个路径中
第五行是将路径进行拼接,通过$_GET['save_path']请求获得上传路径,用而这个get传参是我们可以控制的地方 。那么我们的思路就是通过修改这里来绕过白名单。
%00和magic_quotes_gpc 知识点
php的一些函数的底层是C语言,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00,也会截断
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线。如果不关的话%00就会被转义,不能正常完成实验。
实验过程
注:phpstudy使用版本要低于5.3
先配置phpstudy
其他选项菜单→打开配置文件→php-ini
编辑→查找→magic_quotes_gpc→改为off,保存后重启phpstudy
上传一句话木马jpg格式的文件,并用burp进行抓包
在上传路径这增加文件要保存的名称和格式+%00,forward上传文件,可成功上传。%00起到截断这之后的部分
新建标签页打开后发现是Not Found
删除php后面的部分直接访问就可以了,这就是上传文件的url
最后使用蚁剑连接打开网站后门