活动介绍
file-type

变量覆盖漏洞分析:从BUUCTF-Web-Mark loves cat挑战看PHP安全

下载需积分: 0 | 1.22MB | 更新于2024-08-04 | 167 浏览量 | 5 评论 | 5 下载量 举报 收藏
download 立即下载
"该文主要讨论的是PHP中的变量覆盖漏洞,这是在代码审计时需要特别关注的安全问题。文章提到了几种可能导致变量覆盖的常见场景,包括全局变量覆盖、extract()函数、遍历初始化变量、import_request_variables以及parse_str()函数的不恰当使用。此外,还介绍了如何利用变量覆盖漏洞,并通过一个具体的CTF(Capture The Flag)挑战实例来展示如何通过分析网站源代码和利用.git泄露来获取敏感信息。" 在PHP编程中,变量覆盖漏洞是一个重要的安全问题,它发生在自定义参数值取代原有变量值的情况下。这种漏洞通常由以下几个原因引起: 1. **全局变量覆盖**:在PHP 5.3.0之前,如果`register_globals`设置为`ON`,任何来源的变量(如表单、cookie)都可能覆盖已存在的全局变量。为了避免这种情况,可以使用`ini_set("Register_globals", "Off")`关闭全局变量注册,或者在代码开头使用`foreach`循环清除`$_REQUEST`中的所有变量。 2. **extract()函数**:这个函数用于从数组中提取元素作为独立的变量导入到当前作用域。如果传入的数组包含恶意构造的键名,可能会导致变量覆盖。可以通过限制`extract()`函数的`EXTR_OVERWRITE`标志或使用更安全的变量导入方法来防止这种漏洞。 3. **遍历初始化变量**:在循环中,如果未正确初始化或声明变量,外部传入的参数可能会覆盖这些变量的值。 4. **import_request_variables()**:此函数会将HTTP请求变量导入到当前作用域,同样存在变量覆盖的风险。自PHP 5.4.0起已被移除,因此不应再使用。 5. **parse_str()函数**:这个函数用于解析URL查询字符串并将其转换为PHP变量。如果不小心处理,可能会导致变量覆盖。应当谨慎使用,确保对输入进行适当的过滤和验证。 在解决变量覆盖漏洞时,最佳实践包括: - 避免使用全局变量,除非绝对必要。 - 使用`extract()`和`import_request_variables()`时,设置适当的标志以防止覆盖现有变量。 - 对用户输入进行严格的过滤和验证,确保只有预期的数据类型和格式的值能够被处理。 - 使用预定义变量而不是依赖于请求变量,例如`$_GET`和`$_POST`,以增加安全性。 - 定期审计代码,检查可能的变量覆盖情况。 文章还通过一个名为`BJDCTF2020`的CTF挑战展示了如何利用变量覆盖。在这个例子中,挑战者需要通过分析泄露的`.git`目录获取信息,然后运行特定的Python脚本来解析数据。最终,他们发现了一个含有可变变量的PHP代码段,通过构造特定的GET请求(如`yds=flag`),可以触发代码中的逻辑,从而获取到flag内容。 这个案例强调了在实际环境中,理解变量覆盖漏洞的重要性,以及如何通过逆向工程和漏洞利用技术来解决问题。在编写和审计代码时,开发者应时刻警惕这类安全风险,并采取相应的预防措施。

相关推荐

filetype

分别详细分析BCM6756和BCM6764方案下,skb->mark和ct->mark的赋值逻辑 (1)举例,说明BCM6756和BCM6764下,mark的赋值逻辑 (2)判断BCM6756和BCM6764方案mark赋值是否相同?能够合并为一个方案? #define QOS_LAN_MARK_HIGH (0x3) #define QOS_WAN_MARK_HIGH (0x18000010) #define QOS_LAN_MARK_LOW (0x5) #define QOS_WAN_MARK_LOW (0x08000010) #define QOS_LAN_CT_MARK_HIGH (0X0030) #define QOS_LAN_CT_MARK_LOW (0X0020) BCM6756方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { #if CONFIG_BCM6756 u_int32_t mask = 0xFFFF; #else u_int32_t mask = 0xFFF0; #endif /*1. ct and skb use the same mark; */ /*2. --set-mark: */ /* mark = (mark AND NOT mask) OR value */ if (skb) { if (skb->mark != QOS_LAN_MARK_LOW && skb->mark > 0) { return; } else { skb->mark = (skb->mark & ~mask) | mark; } } if (ct) { if (ct->mark != QOS_LAN_CT_MARK_LOW && ct->mark > 0) { return; } else { #if CONFIG_BCM6756 ct->mark = (ct->mark & ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct->mark = (ct->mark & ~mask) | mark; #endif } } /*now let TC queue do the rest*/ return; } BCM6764方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { u_int32_t mask = 0xFFF0; #if CONFIG_BCM6764 u_int32_t skb_mask = 0x7; #endif if (skb) { if (skb->mark != GAMING_QOS_LAN_MARK_LOW && skb->mark > 0) { return; } else { #if CONFIG_BCM6764 skb->mark = (skb->mark & ~skb_mask) | mark; #else skb->mark = (skb->mark & ~mask) | mark; #endif } } if (ct) { if (ct->mark != QOS_LAN_CT_MARK_LOW && ct->mark > 0) { return; } else { #if CONFIG_BCM6764 ct->mark = (ct->mark & ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct->mark = (ct->mark & ~mask) | mark; #endif } }

filetype

根据以下源码,分别详细分析BCM6756和BCM6764方案下,skb->mark和ct->mark的赋值逻辑 (1)举例,说明BCM6756和BCM6764下,mark的赋值逻辑 (2)判断BCM6756和BCM6764方案mark赋值是否相同?能够合并为一个方案? #define QOS_LAN_MARK_HIGH (0x3) #define QOS_WAN_MARK_HIGH (0x18000010) #define QOS_LAN_MARK_LOW (0x5) #define QOS_WAN_MARK_LOW (0x08000010) #define QOS_LAN_CT_MARK_HIGH (0X0030) #define QOS_LAN_CT_MARK_LOW (0X0020) BCM6756方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { #if CONFIG_BCM6756 u_int32_t mask = 0xFFFF; #else u_int32_t mask = 0xFFF0; #endif /*1. ct and skb use the same mark; */ /*2. --set-mark: */ /* mark = (mark AND NOT mask) OR value */ if (skb) { if (skb->mark != QOS_LAN_MARK_LOW && skb->mark > 0) { return; } else { skb->mark = (skb->mark & ~mask) | mark; } } if (ct) { if (ct->mark != QOS_LAN_CT_MARK_LOW && ct->mark > 0) { return; } else { #if CONFIG_BCM6756 ct->mark = (ct->mark & ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct->mark = (ct->mark & ~mask) | mark; #endif } } /*now let TC queue do the rest*/ return; } BCM6764方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { u_int32_t mask = 0xFFF0; #if CONFIG_BCM6764 u_int32_t skb_mask = 0x7; #endif if (skb) { if (skb->mark != GAMING_QOS_LAN_MARK_LOW && skb->mark > 0) { return; } else { #if CONFIG_BCM6764 skb->mark = (skb->mark & ~skb_mask) | mark; #else skb->mark = (skb->mark & ~mask) | mark; #endif } } if (ct) { if (ct->mark != QOS_LAN_CT_MARK_LOW && ct->mark > 0) { return; } else { <<<<<<< HEAD #if CONFIG_BCM6764 ct->mark = (ct->mark & ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct->mark = (ct->mark & ~mask) | mark; #endif } }

资源评论
用户头像
英次
2025.05.11
文档内容全面,通过具体函数的讲解,帮助读者理解变量覆盖的原理和危害。
用户头像
爱吃番茄great
2025.04.14
对于BUUCTF竞赛者来说,这篇文章可谓是实战指南,涉及的变量覆盖知识点很实用。
用户头像
士多霹雳酱
2025.03.16
对于Web安全感兴趣的读者,这篇文章提供了实例讲解变量覆盖漏洞,是学习PHP代码审计的不错资料。
用户头像
张景淇
2025.03.12
这篇文档详细介绍了Web安全中常见的PHP代码审计话题——变量覆盖漏洞。针对不同函数的漏洞场景进行了深入剖析,非常适合初学者。
用户头像
正版胡一星
2025.02.28
这篇文章对于理解PHP中的全局变量覆盖、extract()等函数的不当使用导致的安全风险很有帮助。