上传参数名解析:明确哪些东西可以修改
content-disposition:一般可更改 表单的数据
name:表单参数值,不能更改 表单提交的值
filename:文件名,可以修改 上传的文件名
content-type:文件mime,视情况修改 上传文件名自带的参数类型
mime可以作为一个验证条件,验证mime来判断你个文件一个合法性的时候,可以通过更改mime来达到一个伪造,比如上传一个php文件,这时候可以更改为图片类来尝试绕过mime验证。
waf验证判断形势,主要是这样的一种形式是判断,检测文件里面的代码,如果代码立马有后门代码检测到会拦截,这个代码怎么编译绕过是后面要学的,我们只讲文件上传所以这里先不管它,文件上传一般检测的都是这种有参数后面有数据的,四个参数值比较关键的是filename,文件名,文件名里面包含了文件的后缀。
前期upload第二关的时候,判断的方式就是mime的类型的绕过,绕过miem是图片类型就可以上传,没有验证后缀,这是代码的判断,我们在来探针一下防护软件是怎么判断的,现在第二关上传一个图片上去,抓住数据包,mime满足就可以上传,所以把上传的文件名字改成php格式,本来这是可以正常上传成功的
但是由于安全狗的原因被拦截了。改了之后php之后不能上传,所以他对那个文件名后缀绝对是有一个检测的,
安全狗这里就有php后缀检测,所以拦截。绕过方法,就是检测不到这个php,要么换一个脚本类型能执行出php,最终目的都是能执行出脚本的后缀,php只是一种,asp也可以,因为这个网站是php所以php作为演示。
两只思路,第一种是让他检测不到成功上传一个可以执行出php的权利,尝试一下猜想,在中间加上一个空格ph p,返回源代码没有那个安全狗关键词了,文件也成功上传了,但这个文件又不可以直接访问了,因为多了一个空格之后,访问网站就显示成
两个浏览器访问返回结果,这样子上传也还是张图片,没有当作脚本,没有执行出来脚本,也不可以。
之前绕过是在php后面加上点和空格,现在这样上传,安全狗还是拦截了。
常见绕过方法
数据溢出,放匹配的
这个原理借助的溢出漏洞,这是老师自己取的名字,就比如让你在一万个人里面找一个人,几率很小,我们把这个数据搞大,让程序去一个一个匹配也是这样,它不会排除就挨个去匹配,数据太多了,程序会停止或者崩溃,数据溢出就是用的这个方法,因为他匹配的就是名字,所以在后缀名之前名字开始溢出比较好,乱写一堆一直重复,
apache服务被迫停止工作,但是数据太多了,数据包没有发出去,所以这文件名那个地方不要去搞,
换一种思路,写道filename前面来,因为他会慢慢检测吗,先检测上面的content-disposition,在往下检测,检测filenam的起那么加上一堆垃圾数据,
这样子上传成功了但是文件了没有,这个是什么原因造成的,
这样子在filename前面加上aa.jpg乱码绕过,但是上传的是一个aa.jpg。
再换一个地方写垃圾数据,
写到这个name前面来,注意垃圾数据的结尾要写一个;,然后可以该修改的fielname更改为x.php,然后写够垃圾数据到不拦截看结果
上传成功了
注意 结尾一定要加上个;,不然上传不成功。
学前面的知识为了不会乱插入,插入到不该插入大地方去,比如name:表单参数值,不能更改
第二种 符合变异,放匹配(" ' ;)
抓住数据包,数据包里面的符合都是有讲究的,冒号就代表的后面是值,分号加上结尾了一对一。
而name="file_upload",这个呢是数据包自带的冒号里面代表的是可以更改的不固定的, filename="1.gif 这个里面的值是可以更改的所以是双引号,基本程序开发里面都有单引号双引号,都可以,这是第一个可以变化的地方。
第二个是分号,他代表一个语句的结束,
而这个最后面没有分号,意思就是截止了,如果后面有分号就表示可能还有。
这里我们的绕过思路,先把jpg换成php格式,现在最好加上分号加一堆乱码试试能不能绕过,并不能,再把括住php的双引号改成单引号试试,说不定安全狗加上针对的双引号,试一下也不行。
这里在去掉后面的一个双引号只留下前面的双引号,就不闭合了,这样子就会把 " 当作filenme的值,而不是后面的qq.php,安全狗匹配的时候,我们猜他只匹配双引号里面的,他要去匹配的话就只有三种情况,第一种是"qq.php,第二种是比较只能的他不管引号问题,还是直接匹配 qq.php,第三种它不知道该匹配谁就没有匹配,具体出现哪一种,还需要具体测试,如果是第三种就能实现绕过,
这个方法上传成功了,那么它就是第三种。这是因为安全狗在后面找另一个双引号,但是它找不到,所以就没有匹配。把两个双引号都去掉也可以绕过,安全狗现在是什么匹配机制,就是单引号双引号里面的东西,不写就能上传成功。相当于没有接收到。
但是如果在去掉前面的双引号留下后面的,还是会被拦截,所以在老师那个版本的时候,安全狗的拦截规则应该就是找最后的一个双引号,然后把前面的东西取出来匹配。
所以还可以写成"x"x.php,这样子也会上传成功,上传一个x.php的文件。
第三种,数据截断-防匹配(%00;换行)
开始思路
这个我们数据包上,恢复到最初的命名,在双引号里面改成x.php%00.jpg,这里%00要进行一下url编码,不然上传到网站服务器,网站识别不出来%00是截断都意思,得编码成网站可以识别的url格式,因为安全狗也是程序,所以程序在读取到这里的时候截断符合,会不会也截断,这里上传试一下,不行。我们验证一下会不会截断,换成x.jpg%00.php 上传上传,上传成功了一个x.jpg的文件,安全狗截断了。
我们在试试x.php;%00.jpg,这里上传成功了一个x.php; 不知道可不可以执行,再换一个
x.php %00.jpg,在后面加上一个空格,上传被拦截了,我们在加上::$$DATA ,x.php::$$DATA %00.jpg ,试试可不可以上传成功,也不可以。
那上传一个x.php;.jpg。文件试试,上传成功了不过是图片格式文件,那换成x.jpg;php,也上传成功了还是当作php格式执行,写:就不行,这个就是安全狗,语句分号就当作结束了,所以后面的.php就没有匹配到,而数据包又把它当作正常的命名执行了,就会以最后的.php,文件执行。
换行
这个就是很明显在php,直接换行,而在程序里面的换行后面会自动跟着一个/n,安全狗在识别的时候就识别成x.p\nh\np,所以不会拦截,上传成功了
数据包识别这种写法,但是安全狗在匹配的时候就被/n给干扰了,
怎么样都可以,全换行了数据包也能识别。
重复匹配
安全狗是匹配的filename,我们可以把filename写多一点,
这里先写两个jpg文件,第一个叫x第二个叫y,结尾加上;,表示结束。上传测试一下以那一个filename为准,上传的结果是y上传上去了,所以是以最后一个filename值为准。这也算一种递归循环,比如之前说过的php过滤一次,那些文件后缀写成pphphp,过滤一个php,刚刚好就是给php文件。
既然这里知道是以最后一个为准,那我前面写多少个filename值都无所谓了,就写多一点,和垃圾数据溢出很像但不是垃圾数据溢出,这是让他一直匹配,匹配到崩溃不管了都过去吧,最后写一个php的后缀文件,上传一下看看成功了,
这里我们还可以
把前面的值复制到filenam里面来,这样子安全狗在匹配的时候,先匹配content,正常继续匹配,匹配filename里面又匹配到了content,后面看到name的值等于upload,安全狗在匹配到content相当于把前面忽略不计了,就忘了前面是filename的值,而误认为x.php,没有值给他的,没有给参数,所以就相当于绕过,但是在数据包里filename的值还是等于x.php,上传成功
这就是典型的重复数据,把数据自带的正常的数据写道filename里面去,实现x.php,给他绕过。
把下面的值写进filename里面也不影响,不过是在后面加了一个分号;
上传成功了,只是名字有点不一样,但是php文件就可以。安全狗匹配到分号以为就结尾了。不匹配后面。
这里发现一个机遇/也可以绕过。
测试还要一个思路解释fuzz
在百度搜索fuzz web字典 fuzzdb 都可以搜到字典
下载好一个字典,放在自己可以找到目录地方
因为刚刚测试网站是上传个php,所以我们用php的字典,打开看一下它的源码
字典里面就写了很多种,可以支持php文件解析的后缀上传,该如何测试,把数据表发送到这个模式下
把它作为条件去变化
找好路径,选择和字典
数据包不能过大,过大安全狗会封主本地ip,
然后这样开始测试。
这种就是用工具去跑,我们称之为 fuzz模糊测试
最后一个知识点
安全修复
如何写出一个安全的验证形式呢,要从她的验证方式做文章,
后端验证:采用服务端验证模式 尽量不采用前端验证
后缀检测:基于黑白名单过滤 双重验证都用上
MIME检测:基于上传自带类型检测
内容检测:文件头,完整性检测
用三种更加安全,检测miem,又检查内容,
自带函数过滤:参考uploads函数
自定义函数过滤:function check_file(){}
waf防护产品:宝塔,云盾,安全公司产品等
和一个函数get_image_pointeerl,这个只接受图片信息,就定死了必须上传一个图片上来,
对方有上传漏洞才能进行上传绕过,如果没有上传漏洞就只能上传个图片没有上面用,没有办法能判断有没有上传漏洞,因为在测试的时候就可能被waf拦截了,只能硬着头去绕过,先绕过了才能判断有没有。