WEB攻防-PHP-文件上传(原生态)

mikuku4周前叽里咕噜小代码37

前面了解SQL注入和SQLMAP的使用之后,我们继续来看关于PHP的文件上传漏洞

前面我们学习开发的时候简单了解了一下各种关于文件上传的写法,首先来说一下原生态的文件上传的一些安全问题


首先在说这个文件上传漏洞之前,回想一下我们之前开发时候提过的安全问题,首先就是要明白


无文件解析安全问题上:解析格式是一一对应的,比如图片就是图片,网页就好似网页,之前学习asp的时候就是虽然你改了后缀把他变成了图片,但是他还是可以把这个文件当成asp文件来解析,只有他有解析错误配置或者后缀解析漏洞时才能实现格式的差异解析。


文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的麻烦。



这里使用的测试环境是由f8x+docker搭建

这个f8x前面工具介绍的时候已经介绍过了,这里不多说,然后docker相信大家也已经安装过了,现在就来拉一个测试镜像

image.png

这是github上的一个项目,自己去搜哈,学到现在这些东西不用多说了

然后用docker 启动一下

docker compose config

image.png

启动后他会开放很多端口,这里注意一下

然后我们访问一下

image.png

首先登场的就是js绕过,首先我们就尝试直接日

image.png

但是他只接受图片类型格式,可恶哈,我们上传图片试试image.png

可以看到他成功上传了并且我们也看到了上传路径的地址,假如这是在实战中,首先我们肯定就是检查源码看他是前端验证还是后端验证了

image.png

可以看到他的上传逻辑,这里明显就是白名单策略,只接受白名单里的文件格式,如果说代码里没有的话,那我们也可以抓包判断他是前端还是后端,如果抓取的时候没有任何数据经过,那不就是前端验证吗,那现在就好绕过了啊,前端验证约等于没有哈,随便改


首先我们将要发送的木马改成他接受的格式,让他先绕过前端

image.png

然后他就能发送到服务器,我们就直接在这里修改格式,把jpg再改回php

image.png

然后就被日了,所以说搭建项目的时候一定不要只写前端验证哈,轻松日穿


那我们继续看第二个

image.png


这个是关于阿帕奇的配置文件,这个我们前面也说过,是他本身解析的时候有点问题,这算是中间件的安全问题了

我们可以通过一个小配置来借助这个配置文件来造成解析漏洞

ADDType application/x-httpd-php .png

这个语句的意识是,将所有的png文件当成php来解析,这个关于MIME的文件类型解析我们前面开发的时候也是说过的哈,既然我们现在知道了原理,那我们直接开日

首先流程还是走一遍

image.png

依旧只能上传图片,而检查源码也只能看到前端的代码,说明他是后端验证,而后端验证你不知道他用的什么策略呀,所以该咋办呢,一个一个测吗,我们来试试上面的方法可不可以

image.png

后端验证这样肯定不行呀笨蛋!而直接上传图片能被解析吗

image.png

当然也不行呀,他现在只是一个普通的图片,哪怕是带有后门的,也是没有用滴,所以要依靠我们前面说的这个小语句来攻击

image.png

修改文件然后把我们说的解析语句插进去,记得把图片格式改成png的

image.png

你就可以看到虽然他是图片格式的,但是依旧乱日,这个就是中间件的问题,这个配置文件完全可以不需要,有的程序员偷懒导致的哈

Apache 本身可以完全不使用 .htaccess,而是使用主配置文件(如 /etc/apache2/apache2.confhttpd.conf)进行设置。

除非特殊情况,不然最好不用这个东西


继续下一关

image.png

这个就是上面说的MIME文件类型了,这种前面我们已经做过一次实验了,这里就直接开日

image.png

image.png

直接修改这个类型为图片类型,就直接上传成功了,连接就更不用说了,依旧日穿


下一关

image.png

这一关是判断文件头,文件头是什么呢

我们用010来打开图片看看

image.png

image.pngimage.png

可以看到对应的头部就对应的文件类型,每个文件类型都不同,这是判断文件类型最准确的方法,比如我们现在来上传文件看看

image.png

上传gif文件都是没有问题的,既然是判断文件头,我们该从哪里修改呢,其实可以直接在文件里面添加一个试试

image.png

我们用这个头部伪装成一个gif的格式

image.png

然后修改一下文件类型让他上传成功

image.png

这样看着好像跟上面差不多,其实也是差不多,但是他多了一层验证,除了验证文件类型还要匹配文件头

image.png

image.png

只单纯的修改文件类型他还是会弹出这个,所以说这个也是要注意的哈


继续下一关

image.png

这一看就是我们写过的黑名单过滤,黑名单的话只要是不在他这个范围里的,就不会被过滤了,所以说这个也是非常的简单,直接绕过这个即可,看他这个源码的意思是有这个文件后缀就过滤为空,但是他这里有个问题就是,判断只执行一次,无递归逻辑,没有循环,比如现在上传一个文件试试

image.png

他直接把后缀过滤为空了,那么这个时候,我们就用上神奇的双写了

image.png

当他第一次读到php把他过滤为空了,那么剩下的字母不就又组成了一个php吗

image.png

然后又被日穿了


image.png

而这一关跟上面差不多,但是注意他的函数,使用了relplace,是过滤大小写的,但是我们可以使用畸形的,比如phP这种来绕过他,但是这个特性只有windows系统上才有,因为他对大小写并不敏感,由于这里靶场是liunx搭建,这里就无法演示了,但是这个也很简单,不用多说


image.png

这玩意是个老东西了,这是php特有的一个漏洞,并且还要满足这个上面的两个条件,所以说我们首先来查看一下这个php的版本是多少

image.png

看到服务器的回显是5.2.17版本的,符合第二个条件

这个怎么用呢,首先我们抓包看一下数据

image.png

首先我们能看到头部有一个存储我们上传文件的路径,这里有路径我们就修改路径,如果没有路径的话,我们就修改文件名

image.png

当你上传成功的时候,他就吧这个文件存储到这里,所以我们这里使用00截断

image.png通过上传一个带有木马的图片,然后正常流程是上传后直接是保留1.png,但是我们现在通过%00把后面的全部截断,那上传之后只会把木马内容传给前面我们写的1.php中,从而成功上传木马

image.png

这种也是可以的捏,但是条件还是有点苛刻的,而且老登嘛,越来越少了

image.png

另一个也是同样的00截断,但是我们抓包看看

image.png

可以看到现在上面没有路径了,但是在下面有一个upload,有什么区别呢,我们像刚才那样修改

image.png

可以看到是失败了的,我们要对他进行一个url解码,就可以上传了

image.png

image.png

这样就可以了,什么原因造成的呢,我们知道在url中,我们输入的一些符号空格之类的他会自动解码,比如空格他就是%20,由于这里是在post提交中,他不会被自动解码,所以需要我们手动的进行url解码之后,浏览器他就会识别到这个东西,从而导致漏洞利用成功,具体原理就不用太了解了,会用就行



第九关

image.png


而这个就是我们上面说的黑名单过滤问题,我们上面试过用大小写来绕过,同样的如果他对大小写都过滤了,我们该如何用别的方法绕过呢,那当然是用其他的方法来让他解析成php了,这里有一个小项目,FUZZ,这里面就详细的写了可以使用的绕过手段


image.png

这里面就有很多可以绕过的php文件名的常见格式,我们就可以通过攻击模块来跑一下这个字典,来看看哪些可以上传成功

image.png

image.png

把字典加入进来,开始攻击

image.png

通过长度来观察哪些上传成功了,比如这个php3,他就可以上传

image.png

然后也是可以正常的解析成php文件的,也是很简单捏


image.png

这一关是关于条件竞争,这个是什么原理呢

image.png

通过代码我们得知,他是先上传之后才触发判断逻辑的,这个先后顺序导致的逻辑缺陷,就触发了这个漏洞,通过最后判断文件类型来触发报错,然后删除,所以说这个文件在判断之前他已经就上传到了目录中,所以我们通过一直发送这个请求,通过他处理的那一刹那,访问到这这个webshell,通过语句构造另一个webshell出来,那么这另一个不就藏起来了吗,然后就成功的拿下权限


然后我们通过这个

<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>

这个意思就是,当你访问这个文件的时候就生成一个xiao.php并且将后面的一句话木马写入进去,现在我们就来操作

首先我们创建一个访问我们webshell的循环操作,这里就不考虑随机性了,那样的话就很麻烦,这里就简单的演示一下

image.png

我们抓住访问这个webshell的数据包

image.png

然后选择不注入任何语句,选择循环执行来一只访问这个webshell

image.png

开始无限访问,然后我们再来抓住上传的数据包

image.png

现在还没有执行成功,所以这里什么都没有,同样的,我们也把这个上传的包无限发送

image.png

组合攻击

image.png

哎呦嘿,通过不断的执行下去,最后终于在某个瞬间,成功的访问并且生成了这个文件,直接也是日穿


第十一关

image.png

这个是一个叫二次渲染的东东,这是干啥的,简单理解跟之前的sql注入里的二次注入是一样的,由于管理员想要好看的图片样式,你随便上传一个图片他要经过他的逻辑来重新再渲染一次修改样式,而这渲染的时候会修改图片的代码,然后我们上传的时候带的攻击语句就可以被触发了

image.png

我们比较一下原图和下载下来的图就可以发现,他们的大小都不一样了,我们通过010来具体的分析一下

image.png

通过工具箱的比较文件功能,来看看两个图片有什么不同

image.png

红色的代表差异,灰色代表匹配

image.png

在匹配中,我们可以看到他保留了我们的后门代码,所以这里的意思就是当你把后门代码写错地方的话,有可能会导致渲染的时候把木马搞没了,这就是二次渲染,这里由于他这个还是个文件包含的漏洞,这个就不细说了,但是效果就是这样,我们再在匹配的地方插入木马即可


image.png

这个就是函数缺陷,这个简单来说就是通过用户自定义想要保存的文件名来存入文件,但是用户怎么可能这么老实呢,

image.png

虽然这里使用了黑名单过滤,但是总有小聪明会想着绕过他,所以该怎么绕过他呢

image.png

通过/.来绕过这个判断

image.png

然后就上传成功了




原生态到这里就差不多了,下期就将关于第三方的文件上传漏洞了




未完待续~~






















相关文章

WEB攻防-XSS跨站注入(一)

WEB攻防-XSS跨站注入(一)

XSS跨站漏洞,这个漏洞的原理就是通过可控制的某些函数,植入payload然后用户通过访问到这个被攻击的地方触发了漏洞,然后就执行了一次攻击,听起来好像就没啥,这个漏洞确实也没啥,因为他大部分都是在前...

安全开发-web应用-PHP-留言板与登录防护

安全开发-web应用-PHP-留言板与登录防护

当你获得了目标的源码,这时候代码审计看不懂了怎么办,这时候就要学习到奇妙的web开发了,然后学会之后就可以转行去做开发了,当什么网安工程师(狗头)对于我们而言,我们要学习的语言就是通常web开发中经常...

WEB攻防-PHP-文件上传(扩展篇-遗漏)

WEB攻防-PHP-文件上传(扩展篇-遗漏)

上期说完了原生态的文件上传漏洞,这期继续讲关于第三方中间件,编辑器,CMS的漏洞,虽然说基本没啥用哈,没准打CTF的时候用的上吧(自我安慰),这期并没有什么新知识点,更多的是对这个思路的扩展,因为关于...

WEB攻防-PHP-文件上传(存储安全)

WEB攻防-PHP-文件上传(存储安全)

前面我们已经了解了文件上传的一些相关的漏洞利用,这一期我们就来说说关于文件上传的存储的安全,这部分也是跟这个漏洞利用息息相关的,因为现在存储的方式越来越 高端了,首先基础的就是站库分离,然后还有现在用...

WEB攻防-PHP-文件管理

WEB攻防-PHP-文件管理

关于文件还剩下一些小芝士,这期就来说一下 首先就来说说关于读取文件和下载文件的漏洞哈,我们在安全开发中就已经提过一次,如果没有控制好这个下载的话,可能他就直接可以下载一下敏感文件了,读取也是...

安全开发-web应用-PHP-框架开发

安全开发-web应用-PHP-框架开发

一开始我们学习信息打点的时候我们介绍过了框架这个东西,框架就是第三方开发的一个源码,里面核心内容也就是网站的各个功能都是开发好的,只需要把相应的配置配好,就可以直接开始使用了,对于简单的网站搭建还是很...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。