攻防世界 favorite_number

本文详细介绍了如何解决一道PHP代码审计题,涉及到数组溢出漏洞、正则表达式跨行检测的绕过方法以及命令执行的技巧。通过利用PHP5.5.9的数组溢出特性,构造特定payload,成功绕过首元素限制。对于数字检测,使用换行符%0a进行跨行检测的绕过,并通过Burp Suite进行测试。在命令执行部分,提出了两种方法,包括利用inode和将命令输出到文件后再执行,以此获取flag。

在这里插入图片描述
打开后发现是一道php代码审计题
1.首先是个判断,既要数组强等,又要首元素不为admin
2.做了一个正则匹配,要求字符串全为数字,大小写不敏感,跨行检测
3.写了一个黑名单,把常用的都排除了

数组判断

这个第一个绕过就让人头疼
想了想他这提示了php5.5.9,那应该是从php5.5.9这个版本的本身漏洞着手
查了查有数组溢出漏洞
参考:
PHP的信息安全(入侵获取$flag)的题目【Q2】
PHP数组的key溢出问题
看了其他大佬的wp,发现这个php5.5.9版本的数组溢出值为4294967296,当数值溢出的时候就会覆盖0键值(我没有php5.5.9的环境,用5.4测试反正是没过)
然后构造payload

stuff[4294967296]=admin&stuff[1]=user&num=123

在这里插入图片描述
成功绕过了

数字检测

然后是数字检测
查了查
跨行检测可以绕过
用换行符%0a
payload如下:

stuff[4294967296]=admin&stuff[1]=user&num=123%0als

这里发现用hackbar没有用,我们可以用burp来试试。

在这里插入图片描述
hackbar不能成功的原因是浏览器会自动在换行符%0a前面加上回车符%0d,凑成%0d%0a,使绕过失败。

第二个条件
最后是命令执行
查了查

显示有如下的办法
在这里插入图片描述
我们可以用tac
文件则有两个比较好用的方法

方法1

用inode
索引节点
在这里插入图片描述
找的flag的inode
读取flag
payload如下:

stuff[4294967296]=admin&stuff[1]=user&num=123%0atac ` find / -inum 23337141`

反引号的命令,首先将反引号内的命令执行一次,然后再将已经执行过的命令得到的结果再执行一次
在这里插入图片描述

方法2

输出到文件里

然后执行文件
在这里插入图片描述

得到flag

由于没有直接关于攻防世界 wtc_rsa_bbq 题目的具体引用内容,下面给出一般性的 RSA 类型题目分析与解答思路。 ### 题目分析 RSA 算法是一种非对称加密算法,其核心基于大整数分解的困难性。在 RSA 加密体系中,有公钥 `(n, e)` 和私钥 `(n, d)`,其中 `n = p * q`(`p` 和 `q` 为大素数),`e` 是公开的加密指数,`d` 是私钥的解密指数,满足 `e * d ≡ 1 (mod φ(n))`,`φ(n)=(p - 1) * (q - 1)`。 对于 wtc_rsa_bbq 题目,通常会给出一些与 RSA 相关的参数,如 `n`、`e`、`ciphertext` 等,可能还会涉及到签名验证等操作。解题的关键在于根据已知信息,尝试找出 `p`、`q` 或者直接计算出 `d`,从而实现解密。 ### 解答思路 1. **分解 `n`**:如果题目给出的 `n` 不是特别大,可以尝试分解 `n` 得到 `p` 和 `q`。可以使用一些工具,如 `factordb` 网站或者编写简单的 Python 脚本进行暴力分解。 ```python import sympy n = 123456789 # 假设这是题目给出的 n p = sympy.nextprime(1) while n % p != 0: p = sympy.nextprime(p) q = n // p print(f"p = {p}, q = {q}") ``` 2. **计算 `φ(n)` 和 `d`**:在得到 `p` 和 `q` 后,计算 `φ(n)=(p - 1) * (q - 1)`,然后使用扩展欧几里得算法计算 `d`,使得 `e * d ≡ 1 (mod φ(n))`。 ```python from Crypto.Util.number import inverse phi_n = (p - 1) * (q - 1) e = 65537 # 通常 e 为 65537 d = inverse(e, phi_n) print(f"d = {d}") ``` 3. **解密 `ciphertext`**:使用私钥 `(n, d)` 对密文进行解密,公式为 `plaintext = ciphertext ** d % n`。 ```python ciphertext = 987654321 # 假设这是题目给出的密文 plaintext = pow(ciphertext, d, n) print(f"plaintext = {plaintext}") ``` ### 签名验证 如果题目涉及签名验证,通常会给出签名 `sig`、消息 `m` 和公钥 `(n, e)`。验证签名的步骤如下: 1. 计算 `s = sig ** e % n`。 2. 比较 `s` 和 `m` 是否相等,如果相等则签名验证通过。 ```python sig = 12345 # 假设这是题目给出的签名 m = 67890 # 假设这是题目给出的消息 s = pow(sig, e, n) if s == m: print("Signature verification passed.") else: print("Signature verification failed.") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值