- 博客(224)
- 收藏
- 关注
原创 这几天没咋学,接着搞搞。
学了点业务逻辑,然后尝试着挖了一下结果大败而归(悲),js绕过不会,然后自己也比较犟,想先看懂一下这个包,然后放弃再看看报告,老老实实的从边缘开始,对了,还有js接口提取的那个项目没搞。学校的企业邮在腾讯系统中绑定了专属企业ID和域名白名单(仅 axhu.edu.cn 后缀邮箱属于该校),你输入的 3540372118@qq.com 是腾讯公共邮箱,后端会先校验邮箱后缀是否在学校的白名单内,直接判定为“非校内用户”,后续的ID指纹篡改、参数改值都无意义。code:-1 则提示“邮箱不属于该企业”)。
2026-01-08 16:30:39
534
原创 热身热身热身热身。
真的,那时候就是用户在登录的时候不小心点到了这个东西,然后就会自己改密码。等等我懂他的意思了,用户登录的时候不小心点到了恶意的东西,然后修改了密码。不是直接改参数这就是csrf吗?以自己为中心跳两个,然后进入另一个文件夹。那个请求头我也知道,但是真的是这样吗?改密码的时候会请求这个站点。他只识别了标识改一下后缀就行。不懂他的意思,明天再打。
2026-01-04 00:04:37
170
原创 阿巴阿巴瑞林。
Thymeleaf在根据这个路径加载/解析模板时,会扫描路径(或模板内容)中的表达式语法(如 ${} / #{} ),并将其当作可执行的逻辑处理。你的控制器方法返回的 "lang/" + lang ,在Thymeleaf环境中会被视图解析器识别为模板的逻辑路径(对应 resources/templates/[返回值].html ),而非直接返回给前端的普通字符串。你说的“卢卡库”其实是lookup的谐音,核心结论是:底层存在lookup且参数可控,是造成JNDI注入解析执行的关键前提,但并非绝对触发漏洞。
2026-01-03 23:06:45
589
原创 .7.768383
比如之前的弹计算器: Runtime.getRuntime().exec("calc") 写在 readObject 里,“一开始”(类加载、序列化)时完全不执行,只有当别人把序列化的对象数据传给服务器,服务器执行反序列化时,这个命令才会被触发。1. 类加载时:仅加载类的结构(比如 readObject 方法的代码、成员变量定义),但不会执行任何实例相关的逻辑(比如 readObject 里的 exec("calc") 、成员变量赋值)。// 用Log4j输出日志,将参数带入日志模板。
2025-12-29 20:10:55
691
原创 /68677
你指向的是代码里的** servletRequest的** servletRequest **参数,它是 doFilter() 方法的第一个参数,类型为 ServletRequest`,是Servlet规范中定义的请求对象接口,核心作用是封装客户端发送给服务器的所有请求信息(比如请求参数、请求头、客户端IP、请求方法等)。简单说,端口监听是“网络连接的大门”,Listener/Filter/Servlet是“门内处理请求的业务房间”,数据库交互是“房间里存取数据的仓库通道”,三者不在同一层级。
2025-12-27 23:06:20
256
原创 69728
2. 参数依赖: _this3.form.password 是Vue组件的响应式表单数据,全局控制台中没有 _this3 这个组件实例,你手动传的 '123456' 也无法模拟响应式数据的传递规则;- 你在控制台搜索 loginEncrypt ,只能找到代码片段里的“字面量”,找不到实际被混淆后的函数,调试时根本定位不到真实的加密逻辑;- 即便你手动声明了全局的 loginEncrypt ,也和组件内的原生函数不是同一个,无法实现相同的加密效果,调试逻辑从根上就不成立。以后熟一点之后多看报告,书。
2025-12-27 17:05:34
259
原创 Ucubug
框架反序列化的核心是 “借框架的‘壳’(类和方法),走自己的‘路’(POP链)”:框架提供了自动加载、丰富的类方法和链路,攻击者只需找到反序列化点,构造符合框架逻辑的POP链,处理好格式和转义,就能触发恶意代码执行。构造POP链时,无需手动引入框架类(如 think\template\driver\Php ),因为框架的自动加载器(如ThinkPHP的 Loader::autoload() )会根据命名空间自动从磁盘加载对应的类文件——这是框架反序列化的关键便利之处,原生PHP反序列化需手动引入类。
2025-12-26 17:51:57
949
原创 3572827
注意的是,如果是特殊符号,他不会那个,但是*号前面的东西他都会看做空变量。他知道命令执行代码原来是这样的意思,直接用环境变量,py输出到Cmd。我的天异或运算,直接用异或拼接,他一个一个对应拼接还是什么?这个我知道,将目录下的文件写入一个shell脚本中。输出的控制台解码,然后查询Flag。这个其实某种意义上和上面不一样。也就是说他还是执行了的。可以直接执行命令执行。有些必须有输出才行。这个斜杠是没有事的。这个是命令执行漏洞。
2025-12-24 22:50:09
100
原创 57254
核心结论:执行 into outfile 写 into outfile 写木马的操作,是在目标服务器的 本地MySQL实例(127.0.0.1:3306) 下,且默认使用的是MySQL的 test 数据库(无特殊指定时的默认数据库)——因为你的Gopher Payload没指定具体库名,root账号登录后会默认进入 test 库,所有SQL操作都在这个库的上下文里执行。你传的 u=root 这类参数,只是后端代码的辅助参数(比如可能用于拼接请求地址、做简单验证),但不是触发SSRF的核心。
2025-12-24 15:05:30
709
原创 6453738
代码中的 header() 是PHP的内置函数,作用是向客户端(浏览器)发送HTTP响应头信息,以此控制浏览器的行为(比如触发文件下载、定义内容类型、设置缓存规则等),你看到的 HeaD 是拼写/输入时的大小写误差,实际是 header() 函数。2. _root.m : _root 是Flash的根对象(代表整个SWF文件的顶级容器), _root.m 表示从Flash的根对象中获取名为 m 的参数值,这个参数通常来自HTML页面传递给SWF的外部参数(比如URL中的?
2025-12-22 22:07:20
507
原创 599846
不管是通过 session_start() 创建的普通session,还是 PHP_SESSION_UPLOAD_PROGRESS 触发的session,只要超过 session.gc_maxlifetime (默认24分钟)的有效期,都会被PHP的垃圾回收机制扫描并删除——这是PHP对所有session的通用规则,并非这个场景独有。1. 以 POST 方式向 http://xxx.ctf.show/ 发送请求,把隐藏域 PHP_SESSION_UPLOAD_PROGRESS 的值(也就是 <?
2025-12-22 11:19:31
452
原创 5655869
这两部分拼接后形成了语法完整的复合查询,MySQL并不会把它们当作两个独立语句,而是按 () 的优先级先执行子查询,再执行外层查询,最终返回联合后的结果(也就是你看到的 admin,gbook,news )。2. MySQL解析时,会将 () 内的 1 union select ... 视为一个子查询,只要子查询语法合法,就会和原查询合并执行,分别获取结果后再合并返回;我大概懂他的意思了,嗯一共只能有一个root,root管理所有的数据库,而其他的数据库没有添加数据库的权利,只有默认的数据库。
2025-12-20 13:52:31
341
原创 2582828
3. 变量未定义: s 是 a.lastIndexOf('.') 的结果,但代码里 a 是后缀数组 ['jpg','gif','png'] ,并非文件名,变量逻辑完全错位(应该把文件名作为参数传入 ss() 函数,而非直接用 a );你是把代码里是把代码里的** upload.php **看成了“up LED”,这是视觉上的文字排版/显示误差导致的误读。i<a.length;简单说,你理解的“过滤成功就交数据”是**“自动传递”,但实际是“手动触发传递,过滤只是提前检查”**,这是两者最关键的区别。
2025-12-17 13:23:48
360
原创 Hhsdn.
它没有“全局获取”的特性,只会读取指定目标的内容。- 数组索引类型错误: mysqli_fetch_row() 返回数字索引数组,只能用 $row[1] (数字),若写成 $row['1'] (字符串索引),会取不到值,若误把整个数组传入 str_replace ,PHP也会把数组转成 "Array" 显示。- 再用 . 把 "Array" 和 [1] 拼接,最终得到 "Array[1]" (如果是 $rom.[2] 就是 "Array[2]" ),页面上就会显示 Array (或 Array[1] )。
2025-12-16 12:31:16
950
原创 Ghghhhnj
得看这个Token生成在哪里,如果是绘画的话就没有办法在前端获取,如果直接放在前端就可以爆破。先存到会话文件中(每提交一次就会产生新的),然后再把回放文件中的东西给前端,然后后面进行对比。我大概懂他的逻辑了,我这个不知道为什么莫名其妙不让我传,一个接去后缀另外一个判断。这个就是在服务器存储一个文件,然后从里面获取值对比,另类cookie。递归他这个东西是有刷新的,调用一次就是以这个为中心进去。他一般是从文件中读取,所以这个值也是文件名。当前目录下面的文件,以自己为中心,同级别。这个后面的值其实是文件名。
2025-12-15 16:25:45
399
原创 11111
= null 会返回 true ,仍会写入空值——你觉得“能过滤”,大概率是你的测试场景里前端根本没传 username 参数, $u 始终是 NULL。= null 因松散比较规则,也会返回 false ,同样跳过插入,这是 isset($u) 做不到的( isset($u) 对空字符串会返回 true ,导致空值写入)。你之前用 isset($u) 时,若前端传了空字符串, isset($u) 会返回 true ,导致空值写入;你这里的 Us 是 $u 的笔误,写 $u!
2025-12-14 22:02:33
443
原创 实验实验实验实验。
打开微信开发者工具,加载对应的小程序项目,点击编译(或 Ctrl+B ),若为uniapp等跨端框架,执行 npm run build:mp-weixin 重新构建,观察 1457 文件夹是否生成文件。1457 文件夹所在的 publicLib 目录,若当前用户没有写入权限,编译后的文件无法被保存到该文件夹,表现为空目录。居然还要我下doctor😅,今天太晚了,明天搞,而且都把4给搞了,这个明天研究怎么搞,太麻烦了,什么doctor。- 网络/工具缓存问题,导致编译后的文件未写入 1457 文件夹。
2025-12-14 00:25:36
327
原创 实验实验实验。
简单的理一下思路,首先搭一个网站需要选的是一个语言,然后为了偷懒,你就可以选择基于语言的一个框架,然后装上去直接调用,感觉和之前学的糊涂差不多,直接调用外面的包。内网的这个我忽然懂了,如果你测的是内网的话,那么其他平台是解析不了的,不过他根本访问不到,如果用工具的话,工具里有一些特征识别的什么鬼东西,看文件以及对应的MD5值来确定,你在内网环境中就可以测。我懂这个邮箱的意思了,他是发个假的,收件人后面跟着的是真实域名,所以服务器可以收到,然后返回拒绝的请求,因为你没有这个用户。
2025-12-13 18:44:01
633
原创 实验两天。
需要我帮你整理一份dnsdumpster的使用步骤指南,让你快速上核心结论:能通过代理操作源站URL,是因为CDN是HTTP(S)反向代理,专门转发完整URL路径;不能直接扫端口,是因为CDN节点只开放80/443等必要端口,且会拦截非HTTP(S)请求,扫描结果与源站无关。CDN支持自定义回源协议与端口(如源站用9001端口提供服务),用户仍通过 https://example.com (443端口)访问,节点自动将请求转发至源站的9001端口。节点是转发层,不运行源站的业务服务(如数据库、SSH)。
2025-12-12 23:30:25
678
原创 实验记录。
Proxifier配置的代理目标是 127.0.0.1:8080 ,但该端口对应的抓包工具(Burp/Fiddler)或代理服务未启动,导致Proxifier转发流量时无法连接到代理节点,应用的网络请求被直接关闭(截图中显示“<1秒 已关闭”)。127.0.0.1:8080对应的代理/抓包工具,不支持QQ的通信协议(如TCP/UDP、加密协议),或代理服务未启动、端口被占用,即使QQ流量成功转发到代理,也无法建立有效连接。若端口被占用,将代理工具和Proxifier的端口改为未被占用的数值(如8081)。
2025-12-10 22:12:04
674
原创 小迪实验记录
用管理工具(菜刀/蚁剑/中国菜刀等),输入木马所在的服务器文件路径(如 http://目标域名/木马文件.php )+ 密钥(如 pass ),工具会通过HTTP请求(POST为主,隐蔽性强),向该脚本传递要执行的指令(如“读服务器文件”“执行系统命令”“提权”等,指令以字符串形式封装在 pass 参数中)。是的,本质完全没错:连接的核心就是「客户端工具发命令→服务器执行命令→工具收结果」,工具是“命令发送器+结果接收器”,服务器是“命令执行者”,全程靠网络请求传递指令,闭环完成远程控制。
2025-12-09 19:11:08
303
原创 javan
在Java反射中, invoke() 是 java.lang.reflect.Method 类的核心方法,作用是通过反射机制调用目标对象的对应方法,简单说就是“用代码的方式动态执行某个方法”,而非直接通过 对象.方法名() 的常规方式调用。你代码里的 method.invoke(bigStar, args) ,就是通过反射拿到 bigStar 对象的某个方法( method 对象)后,动态执行这个方法并传入参数 args ,最后返回该方法的执行结果。代理本身是不会招代理的人会的方法的。
2025-12-09 09:39:11
467
原创 javan
你看到的 Constructor (你写的 constr,UC tor 是拼写/显示的断行误差),英文原意是构造器/构造方法,在Java中是核心概念,反射里的 java.lang.reflect.Constructor 类则是用来表示和操作类的构造器的反射对象。反射必须基于字节码( .class 文件)的核心原因是:反射的本质是操作类的元数据,而这些元数据仅存在于字节码中,且JVM只有加载字节码后才会生成承载元数据的 Class 对象,反射的所有操作都依赖这个对象。
2025-12-08 20:56:37
615
原创 javan
代码逻辑无错误:发送端IP(127.0.0.1)、端口(8011)匹配,接收端 getData()+getLength() 正确解析数据,无语法/逻辑漏洞。UDP是无连接协议,发送端发送数据时若接收端未监听目标端口(8011),数据会直接被系统丢弃,无任何反馈。- 额外排查:若按顺序执行仍收不到,检查本地8011端口是否被其他程序占用(可换未占用端口,如8888,发送端、接收端端口需同步修改)。2. 再运行 fdb (发送端):发送数据时,接收端已处于监听状态,可正常接收并打印内容。
2025-12-08 14:13:09
277
原创 javan
补核心原因: FixedThreadPool 的核心线程在任务执行完毕后,并不会销毁,而是会回到线程池的空闲状态等待新任务,这是线程池的线程复用设计,且核心线程默认不会因超时而被回收,简单的说这里是默认全都是核心进程,全部都不会销毁。2. 任务完成≠线程结束:你的 ll 类的 run() 方法执行完(循环打印结束),只是任务执行完毕,但承载这个任务的核心线程不会退出,而是回到线程池的空闲队列中,等待接收新的任务。线程复用的唯一前提:线程执行完上一个任务,归还线程池变为空闲状态,新任务来了就会复用它。
2025-12-08 11:34:51
1551
原创 Javan
2. 内网侧:不同内网设备可使用相同的私网端口(如设备A 192.168.1.2:8080 、设备B 192.168.1.3:8080 ),路由器会通过不同的公网端口分别映射,实现“同私私网端口、不同公网端口”的共享。高画质意味着更大的图片、模型、音频等资源文件,网络传输的速度和带宽有限,这些大资源的加载会占用大量网络资源,导致游戏卡顿,这是网页端资源加载的核心痛点。简单来说,他的核心结论符合浏览器游戏的普遍特性,只是忽略了前沿网页技术对画质和流畅度的提升可能性。
2025-12-07 21:02:18
807
原创 Javan
当 piao >= 100 时, break 只能跳出内层的 while (piao < 100) ,但外层的 while(true) 没有任何退出条件,线程会立刻再次执行 a.lock() ,进入内层循环(此时 piao >= 100 ,内层循环不执行),然后 unlock() ,接着又回到外层 while(true) ,无限重复这个空转过程。如果没有 finally , a.unlock() 就不会执行,这把锁会一直被当前线程持有,其他线程永远拿不到锁,导致死锁。
2025-12-07 16:47:48
669
原创 javah
你的CPU执行代码的速度是以纳秒/微秒为单位的,而线程的启动、操作系统的线程调度需要几毫秒的时间差。- 多线程下会出现多个线程同时通过 piao<100 的判断(比如 piao=99 时,线程1、2、3都判断为true,同时进入循环),导致 piao 被加到100以上(超卖),且每个线程都会执行“卖完了”的输出。以前线程随即行的,如果有一个线程抢到了可能另一个线程很久才能抢到,有了这个方法之后,这个线程(抢占这个优先),就会让它们尽可能的均匀一些,他们会重新再次抢夺,但是同样的线程可能再次抢夺。
2025-12-06 18:02:48
107
原创 Javan
不是“非要用 File ”,而是 File 对象能帮你完成路径校验、文件系统操作、跨平台路径处理,这些都是纯 String 路径做不到的。如果只需要传递路径文本(比如给流的构造方法传参),直接用 String 也可以,但涉及文件/目录的逻辑操作时,必须用 File (或Java NIO的 Path )对象。不是所有方法都只能用 File 对象,但 File 对象封装了文件系统的核心操作能力,而纯 String 路径仅能作为“文本标识”,无法直接完成文件/目录的逻辑操作。// 判断路径是否存。
2025-12-06 12:09:10
248
原创 ja∨an
对节点流的功能增强:节点流(如 FileOutputStream )仅支持写入字节/字符,而打印流封装了 print() / println() / printf() 等方法,可直接打印基本数据类型、对象等,无需手动转换为字节/字符。“关联”只是对两者关系的泛称,而包装流是打印流的类型归属,二者是“本质定义”和“关系描述”的区别:打印流通过包装的方式与节点流建立关联,从而实现功能扩展。- 依赖节点流实现底层IO:打印流的所有写入操作,最终都会委托给被包装的节点流执行。字节留,字符流,包装流,转换流。
2025-12-05 21:08:58
768
原创 Javan
所有非文本格式的文件都必须用字节流,比如图片(JPG/PNG)、视频(MP4)、音频(MP3)、压缩包(ZIP)、可执行文件(EXE)、Office文档(Word/Excel)等。如 .txt 、 .java 、 .xml 、 .json 等文本格式文件,字符流会自动完成“字节→字符”的编码解码,无需手动处理,能直接获取可识别的文本字符(尤其是含中文的文本)。若不确定文本文件的编码,可先用字节流读取所有字节,再通过编码检测工具判断编码后,转成字符串处理(避免字符流默认编码导致的乱码)。
2025-12-05 11:02:55
395
原创 javan
你代码里的 copy(qi, new File(a1, qi.getName())) 是递归调用的核心代码,这行代码的本质是**“让copy方法去处理源子文件夹,并在目标目录下创建同名子文件夹作为新的拷贝目标”。你觉得只是“获取路径+复制粘贴”,是因为只看到了单次操作,但递归的核心是**“方法自己调用自己,逐层处理嵌套的子文件夹”——如果没有递归,你只能拷贝“第一层目录”里的文件和空文件夹,根本处理不了文件夹里的文件夹**(嵌套结构),这就是递归的关键作用。如果 qqq 里还有子文件夹,会继续递归处理。
2025-12-04 21:49:12
797
原创 Javan
早期不同国家/地区会基于自身语言制定独立字符集(如中国的GB2312、日本的Shift_JIS、韩国的KS C 5601),这些字符集的编码范围、映射规则完全独立——比如GB2312只包含中文字符,Shift_JIS只包含日文字符,且同一编码值在不同字符集中对应的字符可能完全不同。当软件基于某一地区的字符集开发时,若在其他地区运行,会因解码规则不匹配出现“乱码”,甚至无法正常读取内容,最终导致不同国家/地区的软件难以互通使用,确实阻碍了软件的全球化发展。把以后存储的数据变成硬盘中真实的字节数据就是编码。
2025-12-04 18:39:19
239
原创 javan
append = fdAccess.getAppend(fd) 中的 fd 是 FileDescriptor (文件描述符,代表当前操作的文件), getAppend(fd) 是从文件描述符中,获取当前文件打开时的模式——这个模式是在创建 FileOutputStream 对象时指定的(比如 new FileOutputStream("test.txt", true) 中的 true ,就会让 append 为 true )。看最底下的,从零开始零,所以开始b所以可以全部存入。win:\r回车\n换行。
2025-12-04 11:33:05
261
原创 Javan
比如你的项目文件夹是 D:\untitled6 (左边导航栏的 untitled6 ),那运行程序时,“当前工作目录”就是 D:\untitled6 ——相对路径就从这个文件夹开始算。注意:相对路径的参照不是“代码文件所在的目录”,而是程序运行时的“工作目录”(IDEA里还是项目根 D:\untitled6 )。- 如果文件在 D:\untitled6\src\test\比赛.txt → 相对路径是 src\test\比赛.txt。他默认是没有的,如果你里面什么都没写,什么都没有传的话。
2025-12-03 22:07:45
276
原创 Javan
一场在main中,这个是空指针异常,不可以运行Student里面这个类的方法,因为arr[0]是空的。这是出错的地方在哪个包里出错的,第几行。引用数据类型一开始就是三Null。如果直接返回控制台,调用处不知道值。长度只有一个,你却让我1索引。
2025-12-03 11:42:00
108
原创 javan
map 传入的每个 String 对象(也就是 apply 的入参 s ),作为调用对象去执行无参的 toUpperCase() ,不需要额外传其他参数,刚好满足 apply 的“1入参、1返回值”要求。- 函数式接口 apply 只有1个入参(要当调用对象),但方法还需要额外参数,就参数数量不匹配了,这种方法引用就会报错。简单说:不是“必须空参”,而是这个场景里的函数式接口要求、方法引用规则,刚好和无参的 toUpperCase 完全匹配。函数式接口的第一个参数,会自动作为这个成员方法的「调用对象」。
2025-12-02 22:03:17
181
原创 Javan
Lambda 里的表达式:从内到外、从左到右(先 s.split("-") → 再 [1] → 最后 equals ),不是“从右到左”,而是“先执行最里面的方法,再执行外层的方法”。1. 先执行 s.split("-") → 把字符串 s 按 - 分割成数组(比如 s 是 "1-男" ,分割后得到 ["1", "男"] );第二步:Lambda 里表达式的执行顺序( s->"男".equals(s.split("-")[1] )
2025-12-02 13:24:48
619
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅