文件上传
文件上传中经常遇到白名单,在初期的测试中,一般直接测一下,发现是白名单,然后就放弃了,其实这里还是可以尝试绕过的。
众所周知,白名单限定死了文件名的后缀
1 前台有地方可以直接改后缀
2 不改后缀找别的漏洞结合利用
3 根据限制上传点找到了非限制上传点上传shell
比较少见的数组绕过
看一下这个上传的包
这里存在两个文件名
一个是filename
一个是save_name
那到底是哪个呢
这个可以通过黑盒的方法来测
证实是通过save_name来控制文件的后缀的
后台是直接获取的post的save_name的value
这里用的是黑名单,只是个引子,为了说明后台获取文件名是怎么写的
像这种写法,就是优先级写法
如果save_name有值,那么就用save_name的,不然就用本身的文件名
这种写法里,save_name如果没有,那么才用filename作为文件的后缀名
如果有,就是以save_name的值来进行命名
这个后台是用的白名单,这里如果不做代码审计是无法绕过的,纯黑盒猜,基本不可能。
这里触发漏洞的点是后台取文件名后缀的部分
因此这里虽然白名单但是并非没有办法绕过,因为上面的逻辑已经写了,是数组,就不必走那段explode逻辑,因此这里可以直接构造一个数组来进行绕过,然后我们看到保存
文件名的方式
就是用的就是file数组本身的文件名和后缀因此构造包发现后缀依旧为jpg,这里可以尝试截断,但是只限于低版本。
如果版本没有那么低,可以尝试另一种方法,就是构造特殊数组
其中$file[count($file)-1]是截取最后的后缀,用普通的数组怎么绕都是绕不过去的
这里构造一个数组
$a = {1.php,NULL,jpg}
即可解决这个问题
因为NULL是不算存在值的,那么这里这里$file[count($file)-1] = $file[2-1] = $file[1] = NULL
因此最后拼接到filename的后缀也就是NUL
可以看到最后文件名为upload-20.php.
最后那个.在windows中会被自动去除
成功getshell
最终的文件名
暂无评论内容