CTF

CTF基础知识

什么是CTF

CTF(Capture The Flag)是一种网络安全竞赛形式,参赛者需要通过各种技术手段找到隐藏的"旗帜"(flag)。

CTF竞赛分类

  • Jeopardy(解题模式):提供各种类型的题目,解题获得分数

  • Attack-Defense(攻防模式):团队间相互攻击和防守

  • King of the Hill(山丘之王):争夺并保持对目标系统的控制

Web安全常见漏洞分类

1. 信息泄露类
  • 源码泄露:通过查看页面源码、备份文件等获取敏感信息

  • 目录遍历:通过robots.txt、目录扫描等发现隐藏文件

  • 错误信息泄露:通过错误页面获取系统信息

2. 认证绕过类
  • 弱口令:使用常见的用户名密码组合

  • Cookie伪造:修改Cookie值绕过认证

  • 会话劫持:获取他人的会话标识

3. 注入类漏洞
  • SQL注入:通过输入恶意SQL语句操作数据库

  • 命令注入:通过输入恶意命令执行系统命令

  • 代码注入:注入恶意代码并执行

4. 逻辑漏洞类
  • 条件竞争:利用程序执行时序问题

  • 业务逻辑缺陷:利用程序设计上的逻辑漏洞

  • 类型混淆:利用弱类型语言的类型转换特性

5. 客户端安全
  • XSS(跨站脚本):在页面中注入恶意脚本

  • CSRF(跨站请求伪造):伪造用户请求

  • 点击劫持:诱导用户点击隐藏元素

WEB入门

攻防世界

题单:https://adworld.xctf.org.cn/challenges/problem-set-index?id=25

view_source

漏洞类型:信息泄露 - 源码泄露

知识点

  • HTML源码查看

  • 前端信息泄露

  • 开发者工具使用

原理: 开发者有时会在HTML注释中留下敏感信息,或者将flag直接写在前端代码中。通过查看页面源码可以发现这些隐藏信息。

解题方法

  1. 按F12打开开发者工具

  2. 查看Elements标签页中的HTML源码

  3. 寻找注释中的flag信息

常见查看源码的方法

  • F12 开发者工具

  • Ctrl+U 查看页面源码

  • 右键 → 查看页面源码

  • curl 命令获取页面内容

get_post

漏洞类型:HTTP请求方法理解

知识点

  • HTTP GET/POST请求方法

  • 请求参数传递

  • 浏览器插件使用

原理: HTTP协议中有多种请求方法,GET和POST是最常用的两种:

  • GET:参数在URL中传递,如 ?name=value

  • POST:参数在请求体中传递,不在URL中显示

解题方法

  1. 分析题目要求的请求方法和参数

  2. 使用HackBar等工具构造相应的请求

  3. 发送请求获取flag

常用工具

  • HackBar:Firefox/Chrome插件,方便构造HTTP请求

  • Burp Suite:专业的Web安全测试工具

  • Postman:API测试工具

  • curl命令:命令行HTTP客户端

robots

漏洞类型:信息泄露 - 目录遍历

知识点

  • robots.txt文件作用

  • 网站目录结构探测

  • 搜索引擎爬虫协议

原理robots.txt 是网站根目录下的一个文件,用于告诉搜索引擎爬虫哪些页面可以抓取,哪些不能抓取。但这个文件是公开可访问的,攻击者可以通过查看这个文件来发现网站的隐藏目录和敏感文件。

robots.txt语法

User-agent: *          # 适用于所有爬虫
Disallow: /admin/      # 禁止访问admin目录
Disallow: /private/    # 禁止访问private目录
Allow: /public/        # 允许访问public目录

解题方法

  1. 访问 网站域名/robots.txt

  2. 查看被禁止访问的目录和文件

  3. 尝试直接访问这些"禁止"的路径

常见敏感文件

  • /robots.txt - 爬虫协议文件

  • /sitemap.xml - 网站地图

  • /.git/ - Git版本控制目录

  • /admin/ - 管理后台

  • /backup/ - 备份文件目录

根据题目访问robots.txt文件,输入http://61.147.171.103:58682/robots.txt

得到文件内容,依据文件内容输入对应的地址http://61.147.171.103:58682/f1ag_1s_h3re.php,获得flag

backup

漏洞类型:信息泄露 - 备份文件泄露

知识点

  • 目录扫描技术

  • 备份文件命名规律

  • 源码泄露风险

原理: 开发者在维护网站时,经常会创建源文件的备份,这些备份文件可能包含敏感信息如数据库密码、API密钥等。常见的备份文件扩展名包括:.bak.backup.old.tmp.swp等。

常见备份文件命名规律

  • index.php.bak - 直接添加.bak后缀

  • index.php.old - 添加.old后缀

  • index.php~ - vim编辑器备份文件

  • index.php.backup - 完整backup后缀

  • index.php.orig - 原始文件备份

  • .index.php.swp - vim交换文件

解题方法

  1. 使用目录扫描工具探测网站结构

  2. 重点关注返回200状态码的文件

  3. 下载并分析备份文件内容

常用扫描工具

  • 御剑:Windows下的目录扫描工具

  • dirsearch:Python编写的目录扫描工具

  • gobuster:Go语言编写的高速扫描工具

  • dirb:经典的目录暴力破解工具

扫描命令示例

# dirsearch
python3 dirsearch.py -u http://target.com -e php,bak,old
​
# gobuster
gobuster dir -u http://target.com -w wordlist.txt -x php,bak,old

使用御剑或dirsear对网站进行扫描,发现200OK的文件进行访问,在浏览器中输入

http://61.147.171.103:62146/index.php.bak

下载备份文件,打开可以发现flag

cookie

根据题目内容,查看cookie

将其进行抓包操作,发现需要我们访问cookie.php

访问查看响应包

获得flag

disabled_button

按F12,删除disable标签

此时点击按钮即可获得flag

simple_js
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');

输入的十六进制字符串 \x35\x35\x2c\x35\x36... 实际上是:55,56,54,79,115,69,114,116,107,49,50

55,56,54,79,115,69,114,116,107,49,50将这串数字进行ascii转换得到786OsErtk12

Cyberpeace{786OsErtk12}

xff_referer

根据提示伪造ip和xff

可以获得flag

weak_auth

输入admin 123456

获得flag

command_execution

输入127.0.0.1,发现回显

尝试拼接操作

发现可以执行,寻找flag,输入127.0.0.1;find / -name "flag"

查看flag.txt

simple_php

题目代码:

<?php 
 show_source(__FILE__); 
 include("config.php"); 
 $a=@$_GET['a']; 
 $b=@$_GET['b']; 
 if($a==0 and $a){ 
     echo $flag1; 
 } 
 if(is_numeric($b)){ 
     exit(); 
 } 
 if($b>1234){ 
     echo $flag2; 
 } 
?>

代码分析:

  1. 第一个条件判断if($a==0 and $a)

    • 需要 $a 既等于0,又为真值

    • 利用PHP弱类型比较漏洞

  2. 第二个条件判断

    if(is_numeric($b)){ 
        exit(); 
    } 
    if($b>1234){ 
        echo $flag2; 
    }
    • 如果 $b 是数字,程序直接退出

    • 需要 $b 不是数字但能大于1234

绕过方法:

  • 绕过第一个条件(获得flag1)

    • 使用 a=0aa=0x0

    • 原理:0a 在弱类型比较中 == 0,但作为字符串是真值

  • 绕过第二个条件(获得flag2)

    • 使用 b=1235ab=9999a

    • 原理:is_numeric("1235a") 返回false,但比较时PHP自动转换为数字1235

Payload:

http://61.147.171.35:52348/?a=0a&b=1235r

可以获得flag


常用工具和技巧总结

Web安全测试工具

浏览器插件
  • HackBar:快速构造HTTP请求,支持编码解码

  • Wappalyzer:识别网站使用的技术栈

  • Cookie Editor:编辑和管理Cookie

  • User-Agent Switcher:修改浏览器User-Agent

专业安全工具
  • Burp Suite:Web应用安全测试的瑞士军刀

    • Proxy:拦截和修改HTTP请求

    • Repeater:重放和修改请求

    • Intruder:自动化攻击工具

    • Scanner:漏洞扫描器

  • OWASP ZAP:开源Web应用安全扫描器

  • Nmap:网络扫描和端口探测

  • Sqlmap:自动化SQL注入工具

目录扫描工具
  • 御剑:Windows下的图形化目录扫描工具

  • dirsearch:Python编写,支持多线程

  • gobuster:Go语言编写,速度快

  • dirb:经典工具,内置字典丰富

编码解码工具
  • CyberChef:在线编码解码工具

  • Burp Decoder:Burp Suite内置解码器

  • 在线工具:Base64、URL编码、MD5等

常用技巧和方法

信息收集
  1. 查看页面源码Ctrl+UF12

  2. 检查robots.txt网站/robots.txt

  3. 查看HTTP响应头:使用开发者工具Network标签

  4. 目录扫描:使用自动化工具发现隐藏文件

  5. 子域名枚举:发现更多攻击面

绕过技巧
  1. 大小写绕过Admin vs admin

  2. 编码绕过:URL编码、Base64编码等

  3. 注释绕过/**/ 在SQL中绕过空格过滤

  4. 双重编码:对已编码的内容再次编码

  5. HTTP方法绕过:尝试不同的HTTP方法

常见Payload模式
# SQL注入测试
' OR 1=1--
" OR 1=1--
admin'--
​
# XSS测试
<script>alert(1)</script>
<img src=x οnerrοr=alert(1)>
​
# 命令注入测试
; ls
| whoami
& dir
​
# 文件包含测试
../../../etc/passwd
....//....//etc/passwd

PHP安全特性

弱类型比较
"0" == 0          // true
"0a" == 0         // true  
"0x0" == 0        // true
false == 0        // true
null == 0         // true
类型转换
is_numeric("123a")    // false
"123a" > 100          // true (转换为123)
"abc" == 0            // true
常见绕过
  • md5绕过:使用数组 md5([]) === md5([])

  • strcmp绕过:使用数组 strcmp([], "string")

  • preg_match绕过:使用换行符绕过 ^$

Logo

更多推荐