这不是一个很好的结果,但是我参加了SECCON初学者CTF 2024,所以我将作为备忘录留下文章。
目录
SSRFORFI
检查源
解压缩tar.gz后的文件夹结构如下:
$ find ./ ./ ././docker-compose.yml ./.env ./app./app/app.py./app./app/requirements.txt./app/dock/dockerfile ./app/app/uwsgi.ini ./nginx ./nginx ./nginx/dockerfile ./dockerfile ./nginx/nginx/nginx/nginx.conf
每个文件的内容如下:
服务:UWSGI:build:./app env_file: - .env展示: - “ 7777”重新启动:始终nginx:./nginx链接: - UWSGI端口: - UWSGI端口: - “ 4989:80”环境:TZ
复制nginx.conf /etc/nginx/nginx.conf cmd [“ nginx”,“ -g”,“守护程序off;”,“ -c”,“ /etc/nginx/nginx.conf”]
用户nginx; Worker_Processes 1; error_log/var/log/nginx/error.log warn; pid/var/run/nginx.pid;事件{worker_connections 1024; } http {include/etc/nginx/mime.types; default_type应用程序/八位字节; log_format main'$ remote_addr- $ remote_user [$ time_local]“ $ request”'$ status $ body_bytes_sent“ $ http_referer”''''$ http_user_agent_agent“” $ http_x_forwarded_for“'''''''; access_log/var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; UWSGI上游{服务器UWSGI:7777; }服务器{听80; MERGE_SLASHES;位置 / {包括uwsgi_params; uwsgi_pass uwsgi; }}}}
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get -y update --fix-missing && apt-get -y upgrade RUN apt-get -y install python3 python3-pip curl RUN mkdir /var/www WORKDIR /var/www COPY ./ ./ RUN pip3 install -r requirements.txt ENV LANG C.UTF-8 RUN chmod 755 -r/var/www run adduser -u 1000 ssrforlfi用户ssrforlfi cmd [“ uwsgi”,“ - ini”,“/var/www/uwsgi.ini”]
烧瓶== 3.0.0 uwsgi == 2.0.23
[uwsgi] wsgi-file = app.py callable = app master = true processes = 4螺纹= 4个插座=:7777 chmod-socket = 666 vacuum = true die-on-en-term-on-term = true py-autorEload = 1
导入OS从烧瓶导入RE导入子过程,请求app = flask = flask(__ name __) @app.route(“/”)def ssrforlfi():url = request.args.get(“ url”)如果不是url:return:return:return“欢迎来到网站查看者。<br> <code>?url=http://example.com/</code>如果不是Re.Match('^[az'()./:; <>@|]*$',url):返回“无效的URL;(“#ssrf&lfi保护如果url.startswith(“ http://” url.startswith(“ file://”):路径= url [7:]如果OS.Path.exists(path)或“ ..”在路径中:返回:返回lfi;(“ else:#block其他方案返回”无效方案;(“ try:#rce? )除subprocess.time Outexpired:return“ timeout;(“如果proc.returncode!= 0:return” error;(“返回proc.stdout If __name__ ==” __ main __”:app.run(debug = true,host = host =“ 0.0.0.0.0”,port = 4989),port = 4989)
回答
应用程序是什么是一个应用程序,该应用程序向URL参数“?url = xxx”指定的URL请求,并将内容返回作为响应。
内容非常简单,但是我必须突破SSRF和LFI的保护并获得标志。
要注意的第一件事是下面的代码。
HTTP和HTTP正在验证Localhost。但是,文件未验证本地主机。
#ssrf&lfi保护如果url.startswith(“ http://'”)或url.startswith(“ https://”):如果在url:retl:return“ return”中检测到的“ localhost” ssrf;(“ elif url.startswith) lfi;(“ else:#阻止其他方案返回”无效方案;(“
文件://
方案可以访问本地文件,因此可以读取环境变量等。
换句话说,似乎您可以在可能的情况下获取标志?url = file:// localhost/[您可以检查环境变量的文件]
这意味着/proc/proc/self/环境
当前过程的环境变量最后,我将尝试使用 ?url = file:// localhost/proc/self/vroment
现在您得到了标志。

我认为这是要进行命令注入的事情,但是我无法在时间限制内解决问题。
Wooorker
RequestBin