CTFhub入门 (三)文件上传
1."无验证"
分析
上传文件没有验证条件,考虑上传一句话木马,参考一句话木马,上传后提示目标路径为upload/muma.php,随后用hackbar以POST方法传入shell =system('ls');
逐层查看目录可以直接找到flag文件,也可以先用命令shell=system('ls /');
查看顶层目录,再用命令shell=system(grep ctfhub /var -r -n);
搜索flag文件,得到路径后shell=system("cat ../flag_2970218858.php");
读取文件,查看网页源码后发现注释中有flag。
Hint:这个无验证把我狠狠的摩擦了好一会儿。
- 首先,POST的BODY内容必须为"shell=..."而不能是"shell =...",前者传入"shell"的值,后者传入"shell "的值,换言之,php中命名可以带空格;
- 执行系统命令时若用exec()函数,则需要搭配echo使用且只返回最后一项,用system()则返回所有项目;
ls /
可以直接查看最顶层的目录;- linux语句可以
<first>;<next>
连接使用,使用一句话木马时切换目录是无效的,但连接使用时先切换会对后面的操作结果有影响; - "grep"要想查询整个目录需要参数"-r"递归搜索;
- "cat"可以跟绝对路径下的文件名(我一开始用的exec一直无效以为只能在当前目录下读取);
- flag是隐式的,可能是备注、变色、刷新等方式隐藏着,多看源码多动脑子。
- "Wappalyzer"谷歌插件可查看网页的前后端引擎从而确定靶场环境。
2."前端验证"
分析
打开源码,发现JS写入了白名单功能,非法文件将被拦截。删除JS代码无法绕过前端验证,尝试关闭浏览器的JS执行,成功上传一句话木马,再简单浏览目录结构即可得到flag,最后在"../"下找到flag文件,cat后flag在网页源码的注释中
3."htaccess"
分析
见WP.htaccess.此处至少不允许上传.php后缀的文件,允许.png.jpg等图片格式的上传,同时允许".htaccess"文件的上传,这意味着我们可以上传一份自己的htaccess文件覆盖原有的,从而修改过滤规则达到任意文件上传的目的。若是不覆盖,图片格式壳子的php内容无法被执行,覆盖后通过类型指向能执行php恶意代码从而得到flag
经过尝试本题无法使用mime绕过,会提示文件类型不匹配,暂时不知道原因
tips:留意一下htaccess文件的书写格式:标签匹配和内容匹配。还有另一份可供参考的资料.htaccess利用详解
4."MIME绕过"
分析
服务器使用MIME类型验证文件类型,但不看后缀(这题里是这样的),先尝试上传jpg文件,抓包后提取MIME类型为image/jpeg,提交成功。再上传php恶意代码,抓包后将BODY中的类型(Content-Type)"application/octet-stream"修改为"image/jpeg"再放包即可通过验证,然后执行恶意代码获取目录信息即可得到flag。
5."文件头检查"
此题检测文件类型有MIME检测和文件头检测两种,MIME检测可修改MIME类型绕过,文件头需要修改脚本文件的文件头内容,由于只允许上传几个图片格式的文件,JPG的文件头比较迷,尝试几次都失败了,任意选择PNG图片文件,拖入010editor后截取前四个字节"89 50 4E 47"添加到恶意php文件前面,可以用010覆盖式修改。上传该文件即可成功,再远程执行命令获取目录信息得到flag。
sources:010editor
6."00截断"
题目信息
了解一下 PHP 5.2 00截断上传的原理
分析
00截断分为"%00"与"00",后者是前者URL解码出的结果,两者的版本有效性待定,有说前者高版本被修复的,也有说后者高版本被修复的,也有说两个都被修复的。本题中00截断放在访问路径中会报错"Bad Request",放在文件名中会报错"文件名不匹配";"%00"截断能够有效使用,但只能使用在路径上用于拼接,直接打在文件名上是没有效果的,我尝试了"muma.php%00.jpg",能够上传成功,但上传了一个jpg文件而非php文件。在请求行的URL中加上"muma.php%00"即可上传"muma.php"文件,无论请求内容是怎样的。
如上图,命令执行有效,查看目录信息即可得到flag
tips:在前面".htaccess"与"MIME绕过"环境中尝试后发现此方法无效,上传的文件名是BODY中的文件名,推测00截断可行的必要条件是上传方式用到路径拼接。参考:00截断详解
7."双写后缀"
分析
先尝试上传muma.php文件,发现居然上传成功了,我还在纳闷,一看回显上传了一个名叫"muma."的文件,猜测php被吞了,再次上传"muma.php.jpg"文件,回显了一个"muma..jpg"文件,不出所料"php"作为关键字被过滤了,尝试双写"muma.phpphp",仍然回显"muma.",尝试嵌套"muma.pphphp",回显"muma.php"表明上传成功,嵌套有效说明过滤只执行一次,将所有"php"关键字过滤。随后就可以远程执行代码获取flag.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程