文件上传常见的验证,:后缀名,类型,文件头等
后缀名指的是白名单和黑名单
文件类型:mime的信息
文件头:内容头信息
我们一个一个来说,这个后缀名,大部分可以上传的对方都不允许脚本格式的上传,对方的代码判断的,直接查看文件名后缀,间接的通过类型和文件头去判断。
后缀名又分为黑名单和白名单,黑名单指的是,明确不允许上传的脚本格式,如asp,php,jsp,aspx,cgi,war等。意思:除了这些黑名单里面的都可以上传。假如对方是黑名单的验证,如果格式有记录不全, 假如还有一个格式可以执行出php的效果,比如php5,phtml,像这种格式有一定几率看当前搭建平台是否支持,支持的话就可以执行出来php的代码效果,看情况来。有这么一个缺陷,
白名单呢,明确可以上传的格式,jpg,png,zip,rar,gif。。。。等,意思:除了白名单里面的都不可以上传。白名单相对安全,我们只能上传这些格式,这是后缀名最基本的验证。
文件类型验证,mime信息指的是上传相关文件的时候,文件会自带一个信息。
这个后门的值的就是mime的值,换一个文件上传,所产生的值都不一样,通过这个值就能判断你是什么文件类型,gif值的最后面就显示gif,是png就显示png,这种验证方式也是很好绕过的,
假如他是对这种类型验证,
这就自己去手动伪造一个格式,就伪造成了jpg的格式,可以绕过的。
文件头,就是文件头信息,找一张图片打开源码格式,
png的前缀是这个东西,所有png的前缀都是这个 gif的前缀是这个东西,所有gif都是这个。
绕过文件上传采用这种验证的话,很不严谨,头部信息可以通过更改这个头部的信息,让对方认定为是可以通过的格式比如图片格式啊,这种来绕过。
接下来的学习需要会看源码,所有现在我们去学学怎么看源码,
老师再写一个表单,来讲解一下
upload_file的就是接受文件上传数据的值。这个全部解释起来接受,表单提交的数据会以upload_file的值提交到php的格式上来,上面接受的上传数据接受他,name值也是他,然后把文件名字输出,
修改一下源码,就能实习输出别的
这里是都输出来的就不截图演示了,
如果要进行过滤的话,就这样子,如果不是后面跟着要求值,后面在添加一些过滤代码和显示报错,来一起执行。
看一下upload第二关的代码
如果不等于就提出上传出错,
如果返回值是正常的就提示正确啦,这个我们只需要修改值让他们对应上,我们就能实现绕过。
第二关就是个很明显的mime验证,我们上传一个php的脚本代码,把文件提交时的数据包抓住把mime信息改成图片格式的信息然后提交上去,就可以了文件就上传上去了。
第三关也直接看代码,
最上面两行加上判断是否鼠标点击,下面是目录。
第一行,deny 拒绝,ext后缀名解析,array数组,拒绝后缀名是.asp,.aspx,.php,.jsp格式的文件
第二行,trim,绕过上传的这个文件有空格就会把这个空格去除掉。file加上上传文件的名字
第三行,把文件名里面多余的点删除避免,x.php.jpg.jsp,
第四行,strrchr,查找字符在字符串中最后一次出现的位置,并从这个位置删除之前的所有字符。
图中找到点出现的最后一位置,删除这个点之前的所有字符。
第五行,强制把字符串转换为小写。
第六行,str_ireplace,替换,把::SDTAT替换为空格 ,替换的目标是file_ext。
第七行,最后在进行一次空格过滤。去除尾部的空格。
第一行的意思如果你不在file_ext deny_ext的值里面(有个感叹号所有是不在),就上传,否则就上传失败, 这就是明显的黑名单。
这个就可能会通过php3,php5,phphtml的格式提交通过了,然后上传成功,前提是网站配置平台开了那种格式,如果没有开还是提交不成功。
第四关
第四关的考点是,htaccess解析,是网站搭建普通,前提是apache的服务器,apache作为伪静态的说明,htaccess经常会做伪静态的转换,他就是.apache的配置文件,这个文件会涉及到网站脚本文件解析的一个规则,所以我们就可以通过这个文件,来实现解析的自定义。
就可以直接在网搜htaccess 上传漏洞,这时候就需要复制一下网站提供的代码然后自己写到一个文件里面,
这个代码的意思,如果文件名字带 cimer,就解析成x-httpd-php的,这个就是mime的格式,就用这个mime格式去执行,这个.htaccess就会生效,这个过滤文件里面没有过滤.htaccess格式的,所以能上传成功,目录文件就会以.htaccess目录为准,然后上传一个文件名里面有cimer的可以上传成功的格式,之后再去访问上传成功的文件全名
执行成功了。
第五关
代码过滤了超级多,虽然它的代码超级多,但是有一个问题,他没有强制转换为小写,这一关就上传一个PHp大小写混合的绕过就行,能上传上去,并且执行。
第六关
过滤也是超级多,跟第二关对比少了一行收尾去掉空格的代码,最后一次空格过滤,这个也很简单,上传文件的时候,抓住数据包,在数据包里面的,就在文件的最后加上一个空格就能上传成功了,然后在放包出去,如果来黑名单的限制,就能上传成功。
为了绕过加了个空格,但是上传到对方网站之后会强制把空格去掉,就还原成了php格式。
第七关,
第七关的代码跟第二关的代码对比就少了一行,去掉末尾的点
这关绕过呢,先上传给带php脚本文件,然后抓住数据包,在数据包里面在文件名最后加一个点. 然后发送出去,就上传成功了,因为后缀名的不允许到对方网站上就被强制转换php的文件了。
第八关,
第八关的代码跟第二关的代码对比就少了一行,去除字符串::DATA,
必须是Windows必须是php,然后后缀名加上::DATA,会把这个之后的当作文件名处理就不会当作后缀名处理,又能保持之前的文件名。
直接上传一个php的代码,抓住数据包,在数据包里面找到文件的后缀名加上::DATA,任何放出数据包,就上传成功了,。这些绕过方式都是基于黑名单的绕过。
第九关
代码和第二关的代码差不多,这个涉及到了代码里面的递归循环,我举个简单的例子,我过滤你的php,替换为空,他会有缺陷,代码编写者的习惯问题,有的会写一个循环,有的会写一次过滤,一次过滤就只过滤一个php,比如a.phpphp 过滤玩a.php。循环过滤更安全。因为他都是执行的一次,所以在抓到数据包之后,把数据包的后缀名改成php. .,后面加上点空格点,去除一个空格去除一个点,剩下php. ,刚刚好不在黑名单可以绕过,就上传成功了。
第十关,
代码分析和第几关的差不多,不过是把禁止的格式替换为空格,比如出现php格式替换为空格,但是他是一次过滤,所以抓住数据包,任何把后缀名改成pphphp,他检测到替换掉一个为空格,就变成了p hp 成功绕过。
第十一关,
第十一关就是白名单了,源码展示
第一行呢就是白名单,只允许上传的格式
第二行,是一个循环,验证这个命名里面也没有多个点,+1相当于循环,把多个点取出来,只留下最后一个点,防止多个点绕过。
我们这一关运用到的方法,叫00阶段。
第一行呢,这个代码就会把传过来的参数,后面加上随即命名,取格式是取到变量fiel_ext的格式,那个格式是jpg,就在参数后面加个jpg的格式后缀,参数就变成了第三行,但是%00的意思是截断,相当与后面的东西没有了,就相当于保存了个1.php的文件。所有这个在数据表里面修改成
箭头指的地方是上传保存路径, 就在这里修改为1.php%00。最后数据就会上传到1.php里面就可以用这个文件执行成功代码。
%00截断需要apache版本小于5.3
第十二关
代码也是个白名单,这个代码和十一关相对比就是提交方式不同,他是post,他的数据包格式就跟get提交方式不一样,这个要找到post提交数据的地方
然后修改成为,x.php后面跟个url编码后的%00,就可以实现绕过,上传x.phpd的文件上去。
因为get会自动解码,会把%00解码处理,而post就不会,所以需要先变成url编码的%00,否则上传到对方网站是不会解码成网站可以识别的字符串,所以需要在数据包里面就编码成网站可以识别的字符串。