uploadd 第十三关
这一关告诉我们的,有一些上传漏洞需要配合这个文件包含和加解密。
这个先在一个图片源码里面写入php后门的脚本代码
这里也可以手工注入到图片的源码里面来,手工注入,如果采用16进制打开这个图片,这个图片在生成保存的时候,就不会出问题,否则会无法正常打开。
之后就把那个带有两个源码的jpg文件上传上去,打开图片的地址,想执行后门代码,需要利用到文件包含漏洞,文件包含漏洞会直接将包含的文件以后门的格式去执行,以当前文件包含的脚本去执行,因为是php,就会放到php去执行。我们打开文件包含地址
接受file的参数给变量file,再用include去包含变量file,在这里我们就可以复制这个地址,然后写上参数,?file=,就等于我们刚刚上传的图片的地址/upload/8020230514105109.png,被包含之后png里面的php脚本代码就会被执行,
这个没有写php后门脚本,随便写一个php的脚本,没有密码需要,如果是后门文件的话,需要输入密码执行
13.14.15.16关都运用到了文件包含漏洞,只是代码有一些不同,我们看一下13关的代码, 这个是头部验证,每一个格式都有自己特有的头部,比如jpg格式
所有的png格式都是这个东西,别的格式也有别的特有的头部。通过判断文件头来判断是什么格式,但这个可以通过后期的伪造,为造出来其他格式。
第十四关
第十四关的代码验证用的另一种方式,
这里用到了getimagesize函数,这个函数运是获取到图片里面的信息,而如果不是图片格式的话就没有返回值,就不能执行后面的代码,这个就限制了文件的类型,只能上传图像,排除解析漏洞和其他漏洞,只能配合别的漏洞去执行。
第十六关
exif_imagetype
这个代码就是获取到,获取图片的类型,所以这个函数也差不多就只会获取图片格式的信息,获取别的就没有返回值,就不会执行下面上传代码。所以就只能上传图片。这个代码就已经相当安全了。
第十六关,
代码也是判断图片类型,不过是一个格式,一个格式去判断的看,jpg,jpeg,也是检测文件信息的,这个代码是相当安全的。
过关的话就配合文件包含漏洞。
之后又开始一个重点
第十七关,
就没有配合漏洞了,第十七关涉及到的漏洞是二次渲染,
二次渲染是,在文件上传的时候有的网站,会先有一个缩小的图片的叫浓缩图或者拓展图,下面还会有保存或者删除类似的按钮,这种一般就涉及到二次渲染,先上传到服务器,这个服务器会有保存或者删除这个操作,这个就相当于在中间停了一下,让你选择保存或者删除,每个图片的规格都不一样,有大有小,有一些网站为了图片在页面中显示正常,会把你头像先截取然后按照他的规格来保存。
二次渲染的过程中会涉及到一个叫逻辑安全的问题,上传第一次的时候渲染到截取对方,对方服务器已经有了,就是他验证的地方是在第一步还是第二部。
我们看一下十七关的代码,
这个代码意思第三行接受鼠标提交事件
第四行截取jpg,png,gif,等等
第五行,在这个文件上传中取他的名字
第六行,把文件的后缀取出来给变量file_ext,后门十一行就直接用move_uploaded_file,去移动文件了把tmp_file,移动到变量upload_file上来了, 第八行就是他声明的路径uoload_path,加上 . / 加上名字,没有验证,就直接移动到了指定目录去了,下面才开始验证是否保存。
这个是存在二次渲染的逻辑漏洞,这个在验证之前就已经把文件放到目录去了。这个代码还有一个重命名,所以到了之后也找不到自己上传的文件,绕过的方法运用到了资源占用,就是在上传的时候,刚好到文件夹里面还没有命名之前访问到,代码就没办法对他重命名了,也叫文件竞争。
用十八关演示一下,
因为前面没有验证,直接上传一个php的文件,然后burp抓住数据包, 然后选择一个可以修改的且没事的作为可修改字节,然后重复上传数据包,这时候就打开网站一直访问上传的php文件,知道出现图中这个界面,就是访问到了,只要我们访问到了,我们就上传成功了!他不能在后面修改它。
网站有二次上传的时候就要多观察,判定符不符合二次渲染。这一关漏洞的原因是因为直接把文件放了进去,在第二步才做的验证。
第十九关
第十九关是黑名单验证,文件夹绕过,十九关源码
这个源码的黑名单验证啥都的就不说了,直接说重点,十三行代码把临时文件temp的信息转移到img来,十二行代码是img等于upload_path目录加上/和file的名字,file的名字是七行等于post提交的save的值,也就是说file的名字值我们是可以控制的,这一关可以有两种方法绕过,第一个看着文件名,我们看一下数据包,就有一个叫save name
利用这个绕过漏洞
把save值修改成php.%00.jpg,因为是post提交方法,不会自动解码,所以%00要url编码一下上传,不然对方服务器网站识别不出来它截断的意思,因为截断了最后到文件夹里面的就只剩下php。
第二种方法
我们同样抓包看一下save的值,然后通过的源码的分析,
如果这个文件名字后门还有/. ,验证的时候当作php/. ,就会绕过验证上传,然后到文件夹里面也会被强制为php文件,就会以正常php文件解读,那怎么利用就在数据包里面修改
就修改成跟箭头指的一样的值就可以。文件就会上传成功,还是php文件。
这个就是未造成与一个文件夹的情况,他会以为是在
upload-19.php这个文件下面上传一个点,但是系统接受这个值也会会把php的那个当作文件来处理。
第二十关,先看一下源码
这里运用到了数组接受+目录命名绕过。
第四行哪里写了是检测mime值的
第十行接受文件名(save name值)来检查测的,跟十九关相比多了一个十一行,is_array,判断是是一个数组,是数组就执行,
第十六行是个类型检测,检测上传类型,是一个白名单类型。jpg等格式不在截取的变量ext里面,变量ext从上面第十五行来的,end是截取文件最后的东西,接受截取的后缀,然后就去判断后缀是否在白名单里面,因为十六行前面是给感叹号是不在的时候,不在就截止了,在里面就进入下一个检测。
二十行变量file-name等于reset接受获取变量file前面的,文件名,中间跟个. ,然后加上后面的后缀,变量file【count(变量file)-1】,
上图做个比方,xiaodi。jpg,数组话就分为 xiaodi 。 jpg 三个数组,假如数组名字叫x,数组0就是xiaodi,数组2。,数组2就是jpg,这里有三个数组,所以count(变量fiel)等于3,3-1=2,所以是变量file的第三个数组,就是后缀名。就是等于他们三个合在一起。
在后面的验证就在十九关出现过了,临时文件temp指向img,img是upload/变量file的文件目录组合,就是正常的文件上传验证了。
这一关分为几个严重呢,第一个是mime的验证,这个在数据包里面改成白名单相关的进行了,
第二个是is-arryr判断是不是数组,是数组在进行后门的验证,不是数组就跳过了。然后下面的验证刚刚说了。
来试着绕过一下,我们上传一个php的文件,先抓住数据包,在save值哪里修改为,加上/. ,看看提示是上面,绕过到哪一步了,提示的是禁止上传改后缀文件,在十七行哪里被拦截了,因为他是白名单,文件名格式必须的是白名单里面才行。
我们上传一个正常的文件,在数据包里面save的值是这个
如果我们这样写upload/upload-20.php/.jpg,这个格式验证的是最好jpg,而上去的还是php的文件,,利用的目录文件,网站会以为是在php里面写入.jpg。
绕过开始,我们上传一个带有php脚本的图片格式文件,
然后把抓住的数据包源码修改成这样,变成数组的形式,检查的检查的最后一个数组加上jpg白名单刚好可以绕过去,看结果
这个样子文件上传成功,最好是php后面加上一个斜杠,这个我写早了,这个上传成功1了。
php文件。
这个代码里面支持数组。
实战情况下,很难绕过这种情况的网站,是碰不到这种情况,我们只能在代码中这样做,我们实战看不到代码,只能一个一个试试,这种只会在比赛中出现,会给一些代码去做。
我们再来说一下文件上传的漏洞,
tmocat方法任意写文件漏洞
文件上传的漏洞不只是程序里面的漏洞,也会爆出类似cve的漏洞,是一些上传环境里面的辅助漏洞,我们举个例子
tomcat任意上传漏洞,tomcat是一个搭建平台,上传漏洞不仅在网站层面上,之前演示的漏洞但是代码层面的,这个就不是
他是网站搭建的时候,漏洞也会在中间件层面,就是搭建件。
这也是为什么思维导图构造,验证和绕过是代码层面的,所以cve不在验证和绕过里面,而cve在漏洞修复里面,它属于其他层面和代码没有任何关系。
打开靶场环境
打开好啦,根据网页上的打开靶场网站
这个这里会有一个共同的疑问怎么知道这个搭建件和版本,这时候中间件信息收集,用nmap扫,端口扫描都可以扫出来,或者网站的源码返回看看
现在如何利用这个漏洞,访问直接抓数据包
靶场提示
复制这串代码,该修改的对方修改为网站的参数,下面那个shell是可以自定义的时候,就是写入的字符串,这时候我们写入一个jsp的后门,就可以获取到网站的数据,直接去网上搜jsp后门
这样子上传上去之后,访问这个1.jsp,然后根据搜的后门访问方式去访问
成功了。