ctf php代码审计 绕过,Bugku CTF 之代码审计解题记录

本文记录了在Bugku CTF平台上的代码审计题目,涉及extract变量覆盖、strcmp比较字符串漏洞、urldecode二次编码绕过、md5()函数、数组返回NULL绕过、弱类型整数大小比较绕过、sha()函数比较绕过、md5加密相等绕过、十六进制与数字比较、ereg正则%00截断、strpos数组绕过和数字验证正则绕过等技巧,解析了利用这些漏洞获取flag的方法。

前言

此笔记为在Bugku CTF平台上做代码审计题目的过程,也算是一篇wp吧

extract变量覆盖

extract($_GET):

$_GET:表示在传递参数时,URL通过get的方式传参,传输的数据以数组的形式封装在$_GET中

extract():从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量

file_get_contents():将整个文件读入一个字符串

trim()去除字符串两侧的空格或者指定字符trim(’string’,’string you want to delete’)

extract()函数的变量覆盖漏洞在于如果导入的数组中有与原来符号表中同名的变量,将会覆盖掉原有的变量,因此对于这道题,我们只需要构造payload?shiyan=&&flag=

此时我们就可以利用变量覆盖漏洞,使原有的flag漏洞的值被覆盖为空,再与我们传入的shiyan变量相比较,空等于空,因此得到flag

ef2dccb22b6c01b4461760053cf34af8.png

strcmp比较字符串

题目地址:

http://123.206.87.240:9009/6.php

5dea0da5476f6bd10b159110298ed765.png

由源码可以看出,题目通过GET方式传递参数a,然后将a和flag变量的值进行比较,若相等则输出flag的值。int strcmp(string str1,string str2)

如果str1小于str2返回0;如果两者相等返回0

这个函数存在一个漏洞就是当传入的参数不为字符串类型时,这个函数将发生错误,在php5.3之前,函数在显示错误信息后,将会返回0,因此我们可以传入payload?a[]=123

即可得到flag

48bde9c4190b2122ff18a84c52cf91d5.png

urldecode二次编码绕过int eregi(string pattern,string string,[array regs])

eregi()函数在一个字符串搜索指定模式的字符串。搜索不区分大小写,如果匹配成功则返回TRUE,否则返回FALSEurldecode()

urldecode()函数的作用就是将url编码后的字符串还原成原来的样子

因此这段代码的意思就是通过GET方式传入id参数,id的值不可以是hackerDJ,但是id的值在url解码后要为hackerDJ才可以得到flag,所以考虑用url二次编码绕过,在转换软件中对hackerDJ进行二次url编码后得到payload?id=%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41

即可得到flag

9fd6220566b29a382bd29a98a7e749f1.png

md5()函数

题目地址:http://123.206.87.240:9009/18.php

题目源码如下:

c43b618abf6b731e1ccffc95647c8388.png

对题目中出现的函数

### 关于CTF竞赛中的PHP代码审计 #### 常见漏洞分析 在处理用户输入时,如果未对数据进行适当验证或过滤,则可能导致安全风险。例如,在PHP环境中,当接收并反序列化来自用户的可控输入时,可能会触发对象注入攻击[^1]。 对于给定的例子`a:1:{s:6:"spoock";s:44:"|O:5:"lemon":1:{s:2:"hi";s:10:"phpinfo();";}}`,此字符串代表了一个经过序列化的数组结构,其中包含了可被实例化的类对象。一旦该串被传递至`unserialize()`函数处解析,便会创建相应的对象,并可能调用其内部方法——这里即为执行了`phpinfo()`命令。这表明程序存在潜在的对象注入缺陷,允许攻击者通过精心构造的数据来操控服务器端行为。 另一个值得注意的是MD5比较操作中存在的隐患。由于哈希碰撞的存在以及算法本身的单向特性,简单依赖MD5校验并不能确保两个变量完全相同。因此,在某些场景下(比如身份认证),仅依靠此类方式判断容易遭受伪造请求的威胁。 至于`strpos()`函数的应用不当也可能引发问题。假设开发者意图检测特定子串是否存在某字符串内却忽略了边界条件检查的话,那么就有可能让恶意参与者利用这一点绕过逻辑控制流实现非法访问资源的目的。此外,XXE(XML External Entity Injection)也是常见的Web应用层面上的安全挑战之一。它涉及到应用程序如何处理含有实体引用的XML文档。特别是当这些实体指向远程位置或是能够读取本地文件系统上的敏感信息时,便构成了严重的隐私泄露途径[^2]。 最后提到的一个例子展示了长度与数值范围之间的矛盾对比语句:`else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)`。这段代码试图同时限制密码字符数不超过7位且大于七位整数的最大值,显然是自相矛盾的设计错误[^3]。 ```php // 不推荐的做法 if ($_GET['input']){ $obj = unserialize($_GET['input']); // 存在安全隐患 } ``` 为了防止上述提及的各种类型的漏洞发生,建议采取如下措施: - 对所有外部提交的内容实施严格的白名单机制; - 避免直接使用未经消毒过的参数参与关键业务流程; - 使用更先进的加密技术代替老旧散列方案来进行完整性验证; - 定期审查第三方库版本更新情况以修补已知弱点; - 考虑启用OPcache等字节码缓存组件减少动态解释带来的性能损耗同时也降低了因频繁编译而暴露出来的风险面。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值