查看: 250|回复: 0

[Web] ciscn_2019_web_northern-china-day1-web2

[复制链接]
发表于 2020-5-9 13:54:32 | 显示全部楼层 |阅读模式

前言  关注大佬的博客看到大佬又做了一道有意思的题还提供了环境,这里来体验下。

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

一看这个网站就很有意思…最近黑kunkun的可真多,前面0708那个漏洞github搜exp,下下来一运行 ,输出你打篮球真的很像CXK…过分…你打篮球才像CXK,你们全家打篮球都像CXK!

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

过程  进入网站后正常先注册,然后进入页面。

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

这里正常的先尝试购买,购买后发现资金募集这里增加了购买物品的金额,个人中心里剩余金额减少了购买时的实际付款
这里是想到了抓包,然后直接改金额尝试,但看到上面的提示说要买lv6,简单翻了几页并没有发现lv6,这时候看到url有page参数,来进行修改,发现到500都还有,这就不能手工找了,简单写个脚本来找

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

这里检查页面元素可以发现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

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2
  可以看到181页,找到了lv6

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到高贵的lv6果然是天价,这时候,就试着来尝试抓包改价格了

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到有价格和打折额度,但是无论将价格改为0还是将折扣改为0,都显示操作失败…

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

陷入僵局,果然还是只能换偶像了…
好吧看了下大佬的writeup这里不要改为0,改为很小的数就行了
尝试之后发现是只能更改折扣那里的值,这算是一个逻辑漏洞吧,然后会进行一个重定向

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

我们进入302跳转后的页面,可以看到提示要求admin才能登陆

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

这时候肯定是想着去看cookie值,在哪里把用户名进行替换
可以看上面上面的图,里面的cookie里面有JWT(JSON Web Token),我这样的菜鸡也是第一次遇到…查了下JWT,然后知道可以解析看看

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到解析结果果然有用户名,这时候我们就需要来对它进行替换(这里我也想过重新注册一个名为admin的用户,结果不给注册,这个骚操作行不通)
用 c-jwt-cracker来跑密钥

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到成功的跑出了密钥

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

用得到的密钥生成admin的JWT,然后cookie进行修改,页面就正常显示了

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

检查源码发现友军给我们留下了好东西

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

把源码下载回来

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

是一堆py文件,python代码审计又是第一次遇到,又懵逼…看了看大佬的writeup,说是有python的反序列化漏洞…前面一直说看python反序列化漏洞来着…
首先看反序列化部分的代码吧

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到这里用的是tornado框架,这个框架用的好像比较少,好像是停止更新了吧
get_argument是tornado获取参数的方法,不区分get和post

ciscn_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2

可以看到我们提交过去的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_2019_web_northern-china-day1-web2

ciscn_2019_web_northern-china-day1-web2


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

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
微信公众号
快速回复 返回顶部 返回列表