CISCN 华北赛区 Day1 Web2

CISCN 华北赛区 Day1 Web2


前言

关注大佬的博客看到大佬又做了一道有意思的题还提供了环境,这里来体验下。
CISCN 华北赛区 Day1 Web2_第1张图片
一看这个网站就很有意思…最近黑kunkun的可真多,前面0708那个漏洞github搜exp,下下来一运行 ,输出你打篮球真的很像CXK…过分…你打篮球才像CXK,你们全家打篮球都像CXK!

复现环境:https://github.com/CTFTraining/CISCN_2019_northern_China_day1_web2. 在线复现环境:http://web44.buuoj.cn/
知识点:

  • 薅羊毛与逻辑漏洞
  • cookie伪造
  • python反序列化

过程

进入网站后正常先注册,然后进入页面。
CISCN 华北赛区 Day1 Web2_第2张图片
这里正常的先尝试购买,购买后发现资金募集这里增加了购买物品的金额,个人中心里剩余金额减少了购买时的实际付款
这里是想到了抓包,然后直接改金额尝试,但看到上面的提示说要买lv6,简单翻了几页并没有发现lv6,这时候看到url有page参数,来进行修改,发现到500都还有,这就不能手工找了,简单写个脚本来找
CISCN 华北赛区 Day1 Web2_第3张图片
这里检查页面元素可以发现lv4,lv5都是以图片形式加载的,图片名分别对应为lv4.png,lv5.png

from urllib import request

url = "http://web44.buuoj.cn/shop?page="

for i in range(1000):
    response = request.urlopen(url+str(i))
    if "lv6.png" in response.read().decode('utf-8'):
        print(i)
        break

4 可以看到181页,找到了lv6
CISCN 华北赛区 Day1 Web2_第4张图片
可以看到高贵的lv6果然是天价,这时候,就试着来尝试抓包改价格了
CISCN 华北赛区 Day1 Web2_第5张图片
可以看到有价格和打折额度,但是无论将价格改为0还是将折扣改为0,都显示操作失败…
CISCN 华北赛区 Day1 Web2_第6张图片
陷入僵局,果然还是只能换偶像了…
好吧看了下大佬的writeup这里不要改为0,改为很小的数就行了
尝试之后发现是只能更改折扣那里的值,这算是一个逻辑漏洞吧,然后会进行一个重定向
CISCN 华北赛区 Day1 Web2_第7张图片
我们进入302跳转后的页面,可以看到提示要求admin才能登陆
CISCN 华北赛区 Day1 Web2_第8张图片
这时候肯定是想着去看cookie值,在哪里把用户名进行替换
可以看上面上面的图,里面的cookie里面有JWT(JSON Web Token),我这样的菜鸡也是第一次遇到…查了下JWT,然后知道可以解析看看
CISCN 华北赛区 Day1 Web2_第9张图片
可以看到解析结果果然有用户名,这时候我们就需要来对它进行替换(这里我也想过重新注册一个名为admin的用户,结果不给注册,这个骚操作行不通)
用 c-jwt-cracker来跑密钥
11
可以看到成功的跑出了密钥
CISCN 华北赛区 Day1 Web2_第10张图片
用得到的密钥生成admin的JWT,然后cookie进行修改,页面就正常显示了
CISCN 华北赛区 Day1 Web2_第11张图片
检查源码发现友军给我们留下了好东西
14
把源码下载回来
CISCN 华北赛区 Day1 Web2_第12张图片
是一堆py文件,python代码审计又是第一次遇到,又懵逼…看了看大佬的writeup,说是有python的反序列化漏洞…前面一直说看python反序列化漏洞来着…
首先看反序列化部分的代码吧
CISCN 华北赛区 Day1 Web2_第13张图片
可以看到这里用的是tornado框架,这个框架用的好像比较少,好像是停止更新了吧
get_argument是tornado获取参数的方法,不区分get和post
CISCN 华北赛区 Day1 Web2_第14张图片
可以看到我们提交过去的body里面确实有become参数

相比于 PHP 反序列化必须要依赖于当前代码中类的存在以及方法的存在,Python 凭借着自己彻底的面向对象的特性完胜 PHP ,Python 除了能反序列化当前代码中出现的类(包括通过 import的方式引入的模块中的类)的对象以外,还能利用其彻底的面向对象的特性来反序列化使用 types 创建的匿名对象,这样的话就大大拓宽了我们的攻击面

当序列化以及反序列化的过程中中碰到一无所知的扩展类型( python2,这里指的就是新式类)的时候,可以通过类中定义的 __reduce__ 方法来告知如何进行序列化或者反序列化也就是说我们,只要在新式类中定义一个__reduce__ 方法,我们就能在序列化的使用让这个类根据我们在 __reduce__ 中指定的方式进行序列化

这里我们就可以直接写payload了,我们可以用nc在vps上开个端口监听,让其去访问(但这里大佬比赛时环境不能访问外网,访问的是内网的xss平台…没太懂这个xss平台自己搭的还是本来就有…)
但这里也可以利用返回参数把它带出来
可以看到上面的代码p是可以返回的,这里我们让p等于flag的内容,就能获得flag了

payload:

import pickle
import urllib

class payload(object):
    def __reduce__(self):
       return (eval, ("open('/flag.txt','r').read()",))

a = pickle.dumps(payload())
a = urllib.quote(a)
print a

用运行得到的结果去替代原有参数就能成功获得flag
CISCN 华北赛区 Day1 Web2_第15张图片


总结

这道题也是很有意思,让我也去学习了许多新的知识点,JWT,python反序列化,等等
这里也比较理解大佬以前说的python反序列化比起php来危害更大,更容易任意命令执行
最后我想说虽然拿到了flag但最终还是没能买下lv6会员啊,hhh(这道题真的还是很符合当前热点的,但真的不希望以后再有人向github传CXK的exp了!!!)


参考

  1. 一篇文章带你理解漏洞之 Python 反序列化漏洞!
  2. CISCN 华北赛区 Day1 Web2 WriteUp
  3. 【CISCN2019】华北赛区-天枢&waterflower
  4. 认识JWT

你可能感兴趣的:(CTF)