文件上传主要是配合一些漏洞的利用,普遍意义上的文件上传是指将信息从个人计算机传送至中央计算机,也就是我们所说的远程计算机,对站点来说,就是传到运行网站的服务器上。一般网站都有自己的逻辑,比如在网站的注册页面,你想要上传个头像,网站只需要你上传头像,而不是传其他类型的文件。
CTF上传文件的目的是为了get shell,我们最终目的是拿到题目的flag,如果说存在一个上传的地方,很有可能它的目的就是通过上传的方式作为辅助或最终的方式去get shell。上传文件会做一些防护来我们进行干扰,所以需要掌握常见的文件上传的安全检测方式。针对文件上传检测的方式如何做一个绕过?
客户端校验——JavaScript
首先来看一下最简单的客户端校验,文件上传是文件从本地到传输到远程服务器,中间经过了三个步骤,在你的客户端(自己电脑)本身做一个文件检测,或者文件传到后端服务器之后,在后端服务器上对文件做检测,简单的就是客户端校验JavaScript校验。文件是在网页做上传,所以javascript就会在你的浏览器上运行。
这里有一些js代码及注释,方便大家对文件作出判断:
![8d4dc868879e9639108077afb2e9133e.png](https://i-blog.csdnimg.cn/blog_migrate/469253f95434b996c273f8f2cbf6a53c.png)
校验逻辑尽管很复杂,如果它的代码无法运行这个检测是不是就没有意义了可以直接绕过。
禁用js
比如说我上传一个文件,执行后系统提示
![0c755e1e0b61b0ba93b8c8458f5a9666.png](https://i-blog.csdnimg.cn/blog_migrate/b91f60e0a68730bd75224c14802cd27c.jpeg)
![6f7ebc73e62cb4f1a2f2bb7b15ab3527.png](https://i-blog.csdnimg.cn/blog_migrate/cdbd9d96ca2284a327bf20d96e19bf06.png)
我们看到这个弹窗就可以判断出代码是运行本地还是远程,不确定的话可以打开开发者模式去看它的校验是存在于本地,我们可以禁用js。
![1f8296b7004315ff70959f4682f1ec69.png](https://i-blog.csdnimg.cn/blog_migrate/e83096c08d1b27cf3c32cb102ca24069.jpeg)
我一般喜欢用一些插件比如yesscript2,浏览器本身也是可以直接设置的。使用插件后就可以上传成功。
![bf106e2d664da69011462d58a1f1c9b6.png](https://i-blog.csdnimg.cn/blog_migrate/68b4a4b1fba108877a7be1e351caa320.jpeg)
抓包改包
jpg结尾的文件肯定是可以传的,在文件发出的过程中,我们可以把包给截住从而绕过审核。我们按照刚才的图片上传方法试一遍:
![632791c74cd77f52e152dd00f26091b4.png](https://i-blog.csdnimg.cn/blog_migrate/1ba0ee3f6d635797f30f862bdb703b2b.jpeg)
如图显示,已经跳过js验证环节,把jpg改成php上传成功。
![7455c5d79377e5bbb30eac971310ec6a.png](https://i-blog.csdnimg.cn/blog_migrate/4261f3a1916664c2dd56a4a4eb55cd7f.jpeg)
![9e1fbf5052dded8dff91db806b414f38.png](https://i-blog.csdnimg.cn/blog_migrate/7db48ae85ca5195a7453a8cb829f2a04.jpeg)
服务器端校验——content-type字段校验
MIME类型检测
![8bccdeeecc65e8d4159003803f85294c.png](https://i-blog.csdnimg.cn/blog_migrate/08069917ef264c216075b8ff833f608a.jpeg)
![89030a79801bd7d281894d24653f2610.png](https://i-blog.csdnimg.cn/blog_migrate/be05ab2b115360b39a8efefac0706424.png)
在传文件的时候它会显示你传的文件类型,确定你传上去的文件是什么。如果在后端做判断,它会检测文件名的字段,因为这个数据包我们能抓到,所以发出去的数据我们也可以做修改。改数据的前提条件是,要知道我们去改什么内容,这里列了一些常见的文件类型:
![2b7cb365132f0fd17b4b5d3c3e344e02.png](https://i-blog.csdnimg.cn/blog_migrate/9efe6fa470e994533be9c4a6fd773de9.png)
![9290e439ca3e76b9fa6f5ee8ca14aff0.png](https://i-blog.csdnimg.cn/blog_migrate/2c4884ee11ca79ceef652dba9f2f3290.png)
上传时把文件名改成上面对应的MIME扩展名,浏览器就会根据你上传的文件名来做判断,再抓包然后再把文件名改回去就可以了。构造成一个发出请求的数据包,它的type字段是正确的就可以。
服务器端校验——后缀黑名单校验
判断后缀名
黑名单校验就是不允许哪些文件类型上传和js代码有点类似,js是只允许哪些文件可以上传。黑名单禁止的时候只能禁止一部分,会受限于开发者本身的知识量比如漏掉一些那种后缀名,导致存在一些可以突破的后缀名做解析。
获取文件后缀名,去检测后缀名是否在数组中,如下图,后缀名是php或php3就会禁止上传,结束退出。代码逻辑其实很简单,那么你要突破的时候,第一种第一种方法去突破不在黑名单里的后缀名就能解析到:
![cefcac3b254d6018cf8015de58820c9b.png](https://i-blog.csdnimg.cn/blog_migrate/efc7e5f7d82fb036939782ba51c1c657.png)
还有一种思路去对抗检测函数,这个函数是获取后缀名,如果是php的那可以换成其他 比如jpg。
绕过方法
![e55500ef72364e4e9b5119a5ddd340e8.png](https://i-blog.csdnimg.cn/blog_migrate/207b64b94d8138f57f597f22d706599c.png)
通过配置文件,我们是能够知道哪些文件能解析,哪些文件不能解析。
![12bb7b153e3bf9686051c30c185638be.png](https://i-blog.csdnimg.cn/blog_migrate/d93e36a44e9da75a9b34e4a2a42bad41.png)
![d1c212c845c8336d18b1f9e18a4942cf.png](https://i-blog.csdnimg.cn/blog_migrate/c3deab1a46f2002aa04538eea3943dfd.png)
![7fca89f779da8cee6ba179fb4585111d.png](https://i-blog.csdnimg.cn/blog_migrate/e513393bbd0e018fd03d49d97b10da68.png)
黑名单会受限于开发者的一个问题,我们可以利用这些方式去做绕过。
配合Apache的.htaccess文件上传解析
![1eb76fe53d47cf60062bb92930683a4f.png](https://i-blog.csdnimg.cn/blog_migrate/772212d331baf496bd2f0d694291a7ae.jpeg)
目录中文件可以被解析,如果把文件名改成jpg再去读下这个目录,会认为这是张图片,不会被解析:
![284131125728e2e5aa68d0ccb5f28f84.png](https://i-blog.csdnimg.cn/blog_migrate/20234a052e58f99a3cb7e1f7ecac9d07.png)
![ddb9b2582a8bcc49090b69418c91854e.png](https://i-blog.csdnimg.cn/blog_migrate/0318a4f1faf7afa55ed8b19535f3ce76.jpeg)
这种情况可以尝试去改.htaccess
![ba8bebc24893289661b24d51bb65f0d3.png](https://i-blog.csdnimg.cn/blog_migrate/c778fc2cfcca64bbee80079591d71380.jpeg)
文件传上去之后,不需要去重启服务器和中间件,传上去做解析会立即生效。
使用00截断
![5a26cf06c3cbccba9b0c664971edf151.png](https://i-blog.csdnimg.cn/blog_migrate/7975f365c7bd2edf556e47076fba46f7.jpeg)
先获取文件名,然后再把文件名保存下来。
举例
![5203a9a1f08c7a5919fc38fc3d4bcc6d.png](https://i-blog.csdnimg.cn/blog_migrate/7853e4fd19f838be37961430647350e1.jpeg)
![0edf8330789334a08f2c2b8cf9420f3e.png](https://i-blog.csdnimg.cn/blog_migrate/05530372fcca71e41dbd356b669c366e.jpeg)
![562692146d7936c33e68f2caf3b82b2b.png](https://i-blog.csdnimg.cn/blog_migrate/15cddcf4b761dd5840498a77fe473d08.jpeg)
![6e0efbcd4e62eec309291daea4dd077f.png](https://i-blog.csdnimg.cn/blog_migrate/01da640f5a5662e1c3de96111e05d0ea.png)
![81c9902289e5210b830347921b6e4a91.png](https://i-blog.csdnimg.cn/blog_migrate/11403eb390c6275e056ac0a84cd9054f.png)
![70a2153242b0c7465161dec3d5d38700.png](https://i-blog.csdnimg.cn/blog_migrate/5ca28cf4d058c0c606eda66c98780a80.jpeg)
如果文件名被截断,我们可以给文件名做修改
![224a05b779641062dfc3077981200827.png](https://i-blog.csdnimg.cn/blog_migrate/c1c69ef6f0e7011df1fdea9b2240c0df.png)
![718b45b1d01503536e46ecaaa5f04159.png](https://i-blog.csdnimg.cn/blog_migrate/43867c242541cfabd031a83e3e3109fe.png)