【CTF-web】攻防世界 Web入门题

Author Avatar
白菀枯
发表:2024-06-27 22:06:33
修改:2024-06-28 20:48:22

攻防世界 Web入门题

每个专家都曾经是初学者

1.view_source

  1. F12

  2. 看到注释里的 cyberpeace{0a26734959be18500fc850955ea75f72},直接复制即可。

    image-ckpg.png

    • 可能第一眼看到的不能复制,可以切换到源代码界面
    • 注意复制形如上式的结果,尤其检查最后不要多一个空格

2.get_post

  1. 确保安装好插件HackBar,按F12可看到有该选项。
  2. 在输入框里输入好题目网址,后面加?a=1,如 http://61.147.171.105:50496/?a=1。点击Execute
  3. 勾选Post data / 新版本是启用Use Post method(用Post方式继续发送)
  4. 在新出现的输入输入b=2,单击execute,回显出正确flag

3.robots

  1. 【前置知识】

    robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。

  2. 可直接访问 靶场ip/robots.txt ,查看上述文件

  3. 可以看到该txt写了Disallow: f1ag_1s_h3re.php,意思是flag在这个文件里

  4. 访问 靶场ip/f1ag_1s_h3re.php 得到flag

4.backup

  1. 【前置知识】
    备份文件后缀名有:
    1. .git
    2. .svn
    3. swp
    4. .~
    5. .bak
    6. .bash_history
    7. .bkf

【法1】手动遍历上述文件后缀名,看看存在哪个备份文件

  1. 访问形如 61.147.171.105:64590/index.php.bak的地址,发现访问成功,开始下载
  2. 用记事本等文本编辑器打开即可看到flag

【法2】利用dirsearch工具

  1. 打开dirsearch的安装目录,输入cmd打开终端
  2. 执行 python dirsearch.py -u http://61.147.171.105:64590/
  3. 200 - 500B - /index.php.bak成功,说明该文件存在,回到浏览器访问
    • 注意到遍历很慢是因为它扫描的是完整的,可以使用 python dirsearch.py -u http://61.147.171.105:64590/ -e php,指定只扫描.php文件,可加快扫描速度
  1. F12,选择存储 (如果是Edge是应用Application)
  2. 看到有一个值为cookie.php,访问它
  3. 提醒我们看http response(响应)
  4. 按F12,选择网络,刷新,在响应头里看到flag

6.disabled_button

  1. F12,注意到按钮部分有个 disabled="",使得按钮无法按下,删除它即可。

7.simple_js

  1. \x35指的是十六进制的35,而35在Ascii表中为5

  2. 如题目所述,无论如何也会弹出密码错误的显示。右键查看源代码

    
    <html>
    <head>
        <title>JS</title>
        <script type="text/javascript">
        function dechiffre(pass_enc){
            var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
            var tab  = pass_enc.split(',');
                    var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
                            k = j + (l) + (n=0);
                            n = tab2.length;
                            for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
                                    if(i == 5)break;}
                            for(i = (o=0); i < (k = j = n); i++ ){
                            o = tab[i-l];
                                    if(i > 5 && i < k-1)
                                            p += String.fromCharCode((o = tab2[i]));
                            }
            p += String.fromCharCode(tab2[17]);
            pass = p;return pass;
        }
        String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
    
        h = window.prompt('Enter password');
        alert( dechiffre(h) );
    
    </script>
    </head>
    
    </html>
    
    
  3. 我们分析一下这段代码:

    1. 首先定义了一个dechiffre函数,将传入的pass_enc加密
    2. 但是经过缜密的分析后,发现传入什么都没有用,因为返回结果一定会是 FAUX PASSWORD HAHA
    3. 最后执行一个弹窗提示。
  4. 那只能思考是不是传入的pass_enc是正确结果呢

    1. (python)先打印出传入的值:

      s = ("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31"
           "\x30\x37\x2c\x34\x39\x2c\x35\x30");
      print(s)
      

      输出 55,56,54,79,115,69,114,116,107,49,50

    2. 这似乎能对应到ASCII码

      先把上述输出分隔开来,在分别打印出其Ascii值

      s = s.split(","); # 按,分割开来,变为数组
      c = "" # 存储结果
      
      for i in s: # 把每个数字变为char,即对应的ASCII
          i = chr(int(i))
          c = c+i # 遍历出来的结果接到后面
      
      print(c)
      

      得到 786OsErtk12

  5. 题目中告诉我们(Flag格式为 Cyberpeace{xxxxxxxxx} ),那么把得到的结果复制进去,果然成功了!

8.xff_referer

  1. 【前置知识】
    1. xff(X-Forwarded-For):获得HTTP请求端真实的IP,可伪造
    2. referer:告诉服务器该网页是从哪个页面链接过来的,可伪造
  2. 题目告诉我们的ip必须为123.123.123.123,可以考虑到用HackBar修改xff
  3. F12打开HackBar中点击Load URL,然后Add Head,输入 X-Forwarded-For: 123.123.123.123,单击Execute执行。意思是改变请求头中的xff为123.123.123.123
  4. 又告诉我们来源要从 https://www.google.com 点击来,这可以通过referer修改
  5. 勾选Referer,或者直接Add Header手动输入Referer,然后输入要求的网站,再次执行即可。

9.weak_auth

  1. [前置工具]

    1. FoxyProxy :等类似浏览器插件,能够代理流量,配置好代理(端口设置为8080)
    2. Burp Suite:能够抓取流量包,而从哪抓就需要上面的插件了(默认抓取8080端口)
    3. 爆破字典:记录了常用的密码等等,这种字典很好找,例如TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (github.com)
  2. 打开靶机是一个登录页面,随便输入后提醒我们要以admin账号登录

  3. 再次尝试登录不出意外的密码错误,不过这时查看源码,它提醒我们需要一个dictionary(字典),顾名思义,字典里收录了常用的密码

  4. 难不成要手动一个一个测试密码来爆破吗?不可能,所以就需要用到[前置工具]了。

  5. 在登录页面打开插件,开启监听,再次尝试登录发现网站一直转圈,说明流量包被截断了。

  6. 此时打开Burp,发现代理(Proxy)选项中有了响应,这就是刚才发出去的东西。

  7. POST /check.php HTTP/1.1
    Host: 61.147.171.105:52380
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 36
    Origin: http://61.147.171.105:52380
    Connection: close
    Referer: http://61.147.171.105:52380/
    Upgrade-Insecure-Requests: 1
    Priority: u=1
    
    username=admin&password=123456666666
    

    最后一行是我输入的账号和密码

  8. image-brse.png

右键,选择发送到测试器(Intruder),给password后面的添加上标识

  1. 切换到有效载荷(Payload)页面,加载常用密码

image-tibr.png

  1. 回到位置页面(Position),点击右上角的开始攻击(Attack)即可,等待测试好每一个。当发现长度有一个不一样的,说明进入到成功的页面了

image-cdnw.png

  1. 选中后查看响应包即可找到flag
    • 最后记得把插件关了,否则都被拦截掉了。

真没我尝试登录的时候一下就进去了。。。

10.command_execution

  1. 【前置知识】Linux的或|,如果两条指令之间用|分割,只会执行最后一个指令,如输出1 | 输出2, echo 1 | echo 2执行后只输出2;此外一些简单的指令如下
ping -c 3 www.baidu.com # ping三次www.baidu.com
ls # 查看当前目录下文件
/ # 根目录的地址
cat 1.txt # 输出1.txt的内容
  1. 随便输入一个 www.baidu.com,有 ping -c 3 www.baidu.com的回显,也就说明了这是一个Linux指令

  2. 那么我们可以在这个输入框里输入指令,但是直接输入的内容会被当时ping的地址,所以就用到 | ls指令,让它运行后面的代码ls,有如下回显,没有flag。

    ping -c 3 | ls
    index.php
    
  3. 一般来说flag会放到根目录或家目录下,执行 | ls /home,发现flag.txt,用 | cat /home/flag.txt得到flag

11.simple_php

  1. 【前置知识】

    1. php页面可以在地址栏里传参,如 http://61.147.171.105:59329/?a=0,让a等于0
    2. php在低版本的松散比较 ==image-zcbl.png
  2. ​$a=@$_GET['a'];
    $b=@$_GET['b']; 
    

    意思是从地址栏赋a和b的值

  3. if($a==0 and $a){
        echo $flag1;
    } 
    

    这看着很矛盾的判断,可以参考到上面的松散比较,保证两个都成立的有字符串

  4. 在地址栏输入 http://靶场ip/?a=abc,得到回显,不过不是正确答案

  5. if(is_numeric($b)){
        exit();
    } 
    if($b>1234){
        echo $flag2;
    } 
    

    又发现一个矛盾的判断,先判断b是否为数字,是的话退出;但又只有b>1234的情况才输出第二个flag

  6. 可以 http://61.147.171.105:59329/?a=abc&b=1235a,意思是让b=1235a,在比较时b首先不是数字不会退出。在比较1234时,先会比较1235,到最后的a直接忽略,满足要求,输出结果。

评论