什么是文件上传漏洞
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
ctfshow151
提示说前台检验不可靠,可以判断是前端验证,这里上传一张png图片
显示可以上传,我们再尝试上传一个带有后门代码的php文件,会显示不能上传
这时候,打开检查,修改一下改为php
显示上传成功,打开文件路径
可以看到带有flag.php的文件,读取flag.php
得到flag
ctfshow152
提示后端检验要严密,再用刚才的办法,会显示文件类型不合规
Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型,自带文件类型,在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html,我们把这个地方修改为image/png,告诉浏览器这是一个图片类型
抓个包看下
这是上传png的文件格式,很显然跟上传php的不一样
把这个位置修改一下
显示上传成功!
再根据刚才的找flag的办法再得到flag
ctfshow153
首先看提示,后端检验要严密,判断为后端验证
根据刚才的办法,先修改上传格式为php,为了方便植入后门脚本
提示文件类型不合规,再用burp修改一下content-type看看
还是不行,这时候需要用到.user.ini包含文件,首先新建一个文件,里面写入auto_prepend_file = “文件名”
包含了这个文件之后,再上传刚刚包含的文件,里面写入后门代码
然后浏览器访问,就可以找到flag了
成功!
.user.ini需要开启条件,具体的话需要自行百度查找
ctfshow154
到这里就不修改格式了,直接.user.ini看看
提示错误
这时候就需要一点一点去纠察是什么错误
删掉一些,还是不能发送,再删一些看看
也不行,再把php删了看看
可以发送了,很显然,这里过滤了php,凡是带了php的都不行,那就换一条语句
<?=eval($_POST[a]);?>
上传成功了,接下来一样的步骤
当php后门脚本格式被限制,可以采用以下后门格式:
1、<?=表达式?> 不需要开启参数设置
2、<script language = "php">echo '1';</script> 不需要修改参数开关
ctf155
先抓个包
报错了,再一步一步查看什么错误
继续排查
跟上一题一样,过滤了php,那接下来就一样的步骤
ctf156
跟上一题一样,先用.user.ini看看能不能直接上传
能上传,那么接着写后门代码
开始报错,再继续排查错误
Php报错
去掉php,仍然报错,继续一点一点排查
去掉eval也报错,那么继续排查
把中括号去掉,就没报错了,很显然,过滤了中括号,既然过滤了中括号,那么就用大括号来代替,但同时还过滤了php,所以要用到<?=eval($_POST{a});?>这条语句,既没有带php,也没有中括号
功上传,接下来就是一样的步骤拿到flag
Ctf157
报错,排查看看
把大括号去掉,包错,继续排查
再把分号去掉,成功上传,也就是说过滤了大括号和分号
那就直接把语句写进里面,直接去读取flag,<?=system(‘tac ../flag.*’)?>,由于过滤了php,所以后缀名用*代替,代表可以读取flag所有后缀,就不用传入参数了
Ctf159
先包含文件
报错了,排查错误
去掉分号,报错,继续排查
去掉括号,报错,继续排查
继续报错,再排查
正常了,不能使用eval()函数,那就用``反引号代替,用反引号直接执行语句<?=`tac ../flag.*?>
PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。
Ctf160
报错,排查
继续排查
继续排查
还报错,这时候很多都被过滤了,那么就要换一种思路,利用日志记录ua头的条件,用ua头写入后门代码,日志是根据中间件来决定放在哪,默认路径需要百度查找
<?=include"/var/lo"."g/nginx/access.lo"."g"?>,因为很多都被过滤了,所以要用双引号连起来,防止被过滤
到了这里之后,右键->源代码
在抓到的包里面写入后门代码
从这个位置写入后门代码
会来到这里,右键->源代码
可以看到要传入参数
传入参数,右键->源代码,找到flag完成