news 2026/10/20 7:55:59

Burp靶场实战:用UNION注入精准识别Oracle数据库版本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Burp靶场实战:用UNION注入精准识别Oracle数据库版本

SQL注入这个老话题,入门容易精通难,尤其是遇到Oracle系数据库时,很多在MySQL里好用的套路直接失效,让人一度怀疑"是不是我姿势不对"。这一篇主要解决一个非常具体的问题:在Burp靶场环境中,拿到一个疑似Oracle后端的注入点,怎么用最快、最稳的方式确认它到底是不是Oracle,并且把它的类型和版本信息"问"出来,顺便把整个判断思路走一遍。查询数据库类型和版本,几乎是所有数据库操作的第一步,无论是做漏洞利用、构造后续注入语句,还是评估修复方案,都得从这一步开始。这篇内容适合正在跟Burp靶场练习SQL注入的朋友,也适合实际项目中遇到Oracle数据库却不知道怎么下手的测试人员。我会用大白话拆解原理,给出可直接复现的请求和判断方法,每一步为什么这么做也会一并说清楚。

1. 整体思路拆解:为什么先查数据库类型和版本

1.1 版本信息就是注入链路的地图

换个角度想,SQL注入的本质是你和数据库之间的"对话"。但这个对话不是即兴聊天,数据库的每一种方言——语法、注释、系统函数、内置视图——都不同。MySQL里常用的information_schema在Oracle里根本不存在,SQL Server 可以用@@version一步到位,而Oracle则需要通过v$version或v$instance视图来获取。如果不先搞清楚后端是什么数据库,后面的所有操作都是在盲人摸象。

在实际渗透测试里,数据库指纹其实是一项前置侦察。你把目标系统想象成一个小区,SQL注入是找到了一扇没锁的门,而数据库类型和版本就是小区的地图。没有地图,你连物业办公室在哪儿都不知道,愣冲进去只会触发一堆报警。有了版本信息,后续查表名、查字段、构造报错注入、评估提权路径,每一步都有了明确方向。很多新手在靶场上栽跟头,不是因为不会用UNION,而是连"先确认数据库类型"这一步都没做,拿着MySQL的payload硬套Oracle,结果自然是一头雾水。

拿到版本号之后能做什么?举个例子,如果你发现Oracle版本是19c,就知道它支持多租户架构和PDB概念,查询时需要考虑容器数据库和可插拔数据库的区别。如果是老旧的11g,则可能存在一些已知的安全漏洞和函数滥用方式。版本号直接影响后面的攻击面选择和语句构造,这就是为什么这一技能在靶场练习中反复出现。

1.2 Oracle 的"性格"和其他数据库完全不同

要做Oracle的版本查询,先得适应它的思维方式。Oracle比起MySQL和SQL Server,更像一个规矩多、讲究多的"老牌国企",很多地方反直觉。

先说最核心的结构差异:Oracle里有一个特殊的表叫dual,它不存储业务数据,只用于在SELECT语句里计算常量、调用函数。比如你想跑一句SELECT 'hello' FROM dual,这才能查出结果来。而MySQL里根本不需要这个表,直接SELECT 'hello'就完事了。这个差异在UNION注入里非常关键——当你要用SELECT banner FROM v$version来查版本时,因为那个视图本身返回多行,你还得注意加ROWNUM = 1之类的行数限制条件,否则语句可能报错或者返回结果不符合预期。这些细节,不踩几次坑是记不牢的。

Oracle的字符串拼接用||,和PostgreSQL一样,但和MySQL的CONCAT()函数、SQL Server的+都不一样。Oracle的注释符支持--和/* */,和大部分数据库类似,但它默认不支持#注释,这点和MySQL不同。还有,Oracle的SQL语句分号问题也容易坑人:在很多客户端工具里,分号是语句结束符,但如果在注入场景里多写一个分号,可能导致整个查询报错。

版本查询的专属函数和视图也各不一样。Oracle里最主要的版本信息来源是v$version视图,它有一个banner列,里面会显示类似Oracle Database 19c Enterprise Edition Release这样的字符串。另一个视图v$instance的version列也很有用,它返回的是一个更简洁的版本号,比如19.0.0.0.0。构造UNION注入时,通常需要把这两个结果想办法拼接或者只取一行来输出。

我把几个主流数据库的识别特征整理成一个对照表,方便你在靶场上快速做判断:

特征项OracleMySQLSQL ServerPostgreSQL
版本查询典型函数v$version、v$instanceversion()@@versionversion()
伪表/伪列dual,必须带FROM无强制要求无dual约定无dual
字符串拼接||CONCAT()+||
字符串注释符--、/* */#、--、/* */--、/* */--、/* */
行数限制ROWNUM(无LIMIT)LIMITTOP、OFFSETLIMIT
自带系统库/视图all_tables、user_tablesinformation_schemasys.tables等pg_catalog
错误信息风格常带ORA-开头常带SQL syntax常带Microsoft字样常带ERROR:和位置提示

拿到这个表,你基本可以在还没看到版本号的情况下,仅凭报错特征和注入行为,就八九不离十地猜出后端是什么数据库。

1.3 为什么用UNION注入来做这件事

靶场上查数据库版本,最直观、最面向结果的方案就是UNION注入。因为你可以在原查询后面追加一个完整的UNION SELECT ...,把自己构造的SELECT结果和原始查询结果合并输出到页面上。只要注入点返回的数据能被页面展示,UNION注入就远比盲注高效。

但UNION注入有其前提:两个查询的列数必须一致,对应的列数据类型必须兼容,并且目标数据库要支持UNION操作。换句话说,你不能上来就UNION SELECT banner FROM v$version,因为原查询是几列你都不知道。所以标准的顺序是:先用ORDER BY探测列数,再用UNION SELECT NULL, NULL, NULL这种全NULL的方式对齐列数,最后把一个或多个NULL替换成你想查的数据表达式。

有些朋友可能会问,为什么不用布尔盲注或者时间盲注?当然能用,但效率完全不是一个量级。布尔盲注需要对每个字符逐位判断,时间盲注更慢,每条验证可能得等几秒钟。而在靶场训练里,页面回显通常非常友好,UNION注入能一步到位,直接拿到可读的版本字符串。这不是说盲注没用,而是分场景选择最优解。靶场练习本来就是用来建立这个"选型"思维的。

考虑到这一篇是专门给Burp靶场环境写的,这类靶场的页面逻辑一般比较简单,查询结果直接出现在页面上,非常适合UNION注入。后面我会用完整的抓包、请求修改和回显解析过程,把每一步拆开来讲。

2. 核心细节解析:UNION注入的技术要点

2.1 UNION注入的工作原理与列数匹配

UNION的作用是合并两个或更多SELECT语句的查询结果。它会把两次查询的每一行结果垂直拼接起来,形成一个更大的结果集。这就要求两边的列数完全一样。比如原查询返回3列,你注入UNION SELECT 1,2,3就能匹配;如果你只给2列,数据库直接报错,页面可能显示"列数不匹配"之类的错误信息。

第一步探测列数,最常用的方法是ORDER BY N。在SQL里,ORDER BY后面可以跟列名,也可以跟列序号。你可以不断递增数字:ORDER BY 1正常,ORDER BY 2正常,ORDER BY 3报错,说明这个查询只有2列。这个方法非常稳,因为数据库会在超过列数范围时立刻报错,不需要依赖页面内容的具体展示。

第二步用NULL占位。为什么用NULL而不是1?因为NULL可以隐式转换为任何类型,在不知道每一列具体是什么数据类型的情况下,全用NULL最不容易触发类型不匹配的报错。如果知道某一列要显示数字,就可以用数字;如果要知道能不能显示字符串,就替换成字符串。这个细节,在真实项目中能帮你省下一堆排查时间。

举个例子,假设你发现了某个商品详情页的id参数存在注入,原始SQL可能是:

SELECT name, description, price FROM product WHERE id = 1

这有3列。如果你直接尝试UNION SELECT banner FROM v$version,数据库肯定会报错,因为原查询3列,UNION里只给了1列。正确做法是先ORDER BY 3确认列数,再UNION SELECT NULL, NULL, NULL,确认位置,最后把其中一个NULL替换为banner表达式。

2.2 Oracle版本查询的语句细节

Oracle查询版本信息,最标准的做法是查v$version视图。这个视图包含几行,其中banner列存放着版本描述。比如:

SELECT banner FROM v$version

实际返回的可能是:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production PL/SQL Release 19.0.0.0.0 - Production CORE 19.0.0.0.0 Production TNS for Linux: Version 19.0.0.0.0 NLSRTL Version 19.0.0.0.0

注意,这个是多行的结果集。在UNION注入里,如果原查询也返回多行,结果集会很大,而且Oracle有时不允许直接UNION一个返回多行的子查询而不加限制。所以更稳妥的写法是限制只取一行:

SELECT banner FROM v$version WHERE ROWNUM = 1

ROWNUM是Oracle特有的伪列,用于给查询结果的行编号,ROWNUM = 1就表示只取第一行。和你熟悉的MySQLLIMIT 1作用类似,但你不能在Oracle里写LIMIT 1,那样会直接语法报错。

还有一个替代方案,查v$instance视图:

SELECT version FROM v$instance

这个返回的版本号更简洁,比如19.0.0.0.0。如果页面只能显示数字或较短字符串,可能这个更适合;但如果页面空间足够,banner的信息更丰富,一眼就能看出完整版本。我在靶场实操时通常优先用banner,因为信息量更大,也更容易确认数据库确实是Oracle。

另外要注意,Oracle的字符串在SQL里用单引号括起来,如果你查询时需要拼接两个字段,不能直接用加号,而是用||。比如要同时查版本和当前用户名,可以这样:

SELECT banner || '---' || user FROM v$version WHERE ROWNUM = 1

在UNION注入里嵌入这样的表达式时,要小心单引号被前端转义,必要时可以用一些替代写法或者调整注入位置。

2.3 用特征函数进一步确认Oracle身份

除了直接查版本视图,你还可以用Oracle特有的函数来验证身份。这些函数在别的数据库上不存在,一旦你在页面上看到它们生成的结果或者报错信息,基本就能锁定Oracle。

比较常见的是dbms_random.value或者UTL_INADDR.get_host_name。用报错注入的思路,你可以让数据库故意抛出一个包含敏感信息的 ORA 错误,比如:

SELECT * FROM sales WHERE id = 1 AND 1=UTL_INADDR.get_host_name((SELECT banner FROM v$version WHERE ROWNUM=1))

这里UTL_INADDR.get_host_name需要一个主机名参数,如果传入的字符串是一个非法的"主机名",比如Oracle Database 19c...,函数会报错,而错误信息里会包含传入的参数值,也就是版本号。这种"报错注入"方式在页面可能不回显正常数据时特别管用。不过本文主角是UNION注入,报错注入作为备选方案,我会在后面的排查部分再详细说。

还有一个确认方法是用特殊的字符串拼接行为。比如提交:

' || (SELECT banner FROM v$version WHERE ROWNUM=1) || '

如果页面上显示了Oracle Database ...的相关内容,那就铁定是Oracle。这个思路在判断数据库类型时屡试不爽。

2.4 列类型匹配与显示位置选择的经验

UNION注入中"类型匹配"和"显示位置"是两个很容易被忽略但影响巨大的点。先说类型匹配:原查询第一列是数字,你就尽量让UNION查询第一列也用数字或NULL;原查询第二列是字符串,你就让UNION查询第二列也返回字符串。否则Oracle有时会直接报数据类型不一致的错误,比如ORA-01790: expression must have same datatype as corresponding expression。

再说显示位置:不是每一列都能直观地显示在页面上。有些列可能被用于内部逻辑,不输出到HTML。所以你在UNION SELECT NULL, NULL, NULL之后,要把NULL逐个替换成数字或字符串来确认哪一列是"会显示给用户的"。比如替换成1,页面上出现1,说明第一列可回显;再替换成'test',页面上出现test,说明这一列能显示字符串。这一步确认后,你才把版本表达式填到那个可回显的位置上。

我一般会先统一用UNION SELECT 1,2,3(如果列数是3),观察页面上的数字,来确定哪些位置可以显示,然后只提取这些位置来做最终注入。这个习惯可以大大缩小问题排查范围,避免最后查出来版本号却死活不显示的尴尬。

3. 实操过程:在Burp靶场上完成整个注入流程

3.1 环境准备与代理配置

开始之前,先明确一下环境。这里说的是本地搭建或授权使用的安全测试训练靶场,比如各种专用的漏洞练习平台,不是你随便拿一个线上网站来练手。未经授权对任意网站做注入测试,既违规也有法律风险。所有操作请保持在可控的靶场环境中进行。

工具方面,Burp Suite 是必须要掌握的Web安全测试工具。它本质上是一个带拦截功能的HTTP代理服务器,站在浏览器和目标服务器之间,让你能看到并修改每一个请求。第一次用的时候,你需要在Burp的Proxy设置里确认监听地址是127.0.0.1:8080,然后把浏览器的代理指向这个地址。浏览器推荐用配置了代理插件的Firefox或者Chrome,也可以直接用Burp自带的内置浏览器。

配置完代理后,在Burp里打开 "Proxy" 标签页下的 "Intercept" 功能,确保拦截开关是打开的。浏览器里随便点一个操作,请求就会被"冻结"在Burp界面里,你可以在这里查看请求行、请求头和请求参数。靶场里通常会有一些可交互的页面,比如根据id参数查询新闻详情、商品信息、用户资料等,这些都是练习注入点的好目标。

我建议你在正式测试前,先在Burp里把历史请求的数据包过一遍,找到哪个参数是直接拼进SQL查询的。通常会有一个很明显的?id=1之类的参数端点,后面所有的注入测试都围绕它来展开。

3.2 确认注入点的存在

假设靶场上有一个查询,URL大致是这样:

GET /sqli_3.php?id=1 HTTP/1.1 Host: 靶场地址

把请求发到Burp的Repeater模块里,方便后续反复修改。第一步,直接改参数值,在末尾加一个英文单引号:

GET /sqli_3.php?id=1' HTTP/1.1

发送后,正常情况下你会在响应里看到数据库报错,或者页面出现异常。Oracle场景下,报错信息里经常出现ORA-01756之类的错误编号,或者 "quoted string not properly terminated" 这样的英文描述。这基本可以确认当前参数存在字符型注入点,并且大概率是Oracle。

如果对引号不明感,你还可以试一下布尔判断。比如把参数改成1 AND 1=1和1 AND 1=2,分别发送,对比两个响应的内容、长度和返回数据。如果前者页面正常,后者页面内容消失或出现逻辑差异,说明这个数字可以被拼进SQL参与运算,这是一个非常典型的注入信号。做完这两步,你就有充分理由继续深入了。

3.3 用ORDER BY探测列数

注入点确认后,下一步是确定原查询的列数。在Repeater里把参数值依次改成:

GET /sqli_3.php?id=1 ORDER BY 1 HTTP/1.1 GET /sqli_3.php?id=1 ORDER BY 2 HTTP/1.1 GET /sqli_3.php?id=1 ORDER BY 3 HTTP/1.1 GET /sqli_3.php?id=1 ORDER BY 4 HTTP/1.1

发送到ORDER BY 3时页面正常,ORDER BY 4时页面报错,那就说明原查询一共有3列。当然,靶场里列数可能更多,那就继续往上加。这个方法的原理是数据库会按序号找排序字段,如果序号超过了SELECT的列数,就会抛出列数超出范围的异常。

有一点需要注意:有些场景里ORDER BY的报错信息和整体查询的报错信息混在一起,页面可能不显示具体错误。这时候你可以观察响应状态码和页面长度,如果ORDER BY 4的响应长度突然变短或返回500,那同样是"列数到头"的信号。列数探测是整个UNION注入的地基,多花几分钟确认清楚,后面全都会顺畅很多。

3.4 对齐列数并寻找可回显位置

列数确定是3之后,用UNION SELECT NULL, NULL, NULL来做列数和类型对齐:

GET /sqli_3.php?id=1 UNION SELECT NULL, NULL, NULL HTTP/1.1

如果页面正常,说明复用成功。然后把这3个NULL依次替换成数字和字符串,比如:

GET /sqli_3.php?id=1 UNION SELECT 1, 2, 3 HTTP/1.1

如果页面上的1、2、3中有一部分以数字形式显示出来,那对应的列就是可回显列。接着再验证字符串显示能力:

GET /sqli_3.php?id=1 UNION SELECT 1, 'show', 3 HTTP/1.1

如果页面上出现show,说明第二列能显示字符串。这一步很重要,因为Oracle版本查询返回的是字符串,只有可回显字符串的列才能承载这个结果。我在靶场里经常看到有人直接填版本表达式,结果因为填到了不可显示的列上,页面一片空白,还以为自己语句写错了。

拿到可显示列的序号后,把你要查的版本表达式填进去即可。若第二列可显示,就写:

GET /sqli_3.php?id=1 UNION SELECT 1, banner, 3 FROM v$version WHERE ROWNUM=1 HTTP/1.1

发送之后,页面上第二列的位置就会显示Oracle的banner信息。这一条请求就是整个注入过程的核心跨越点。

3.5 查询示例与响应解读

我把完整的过程整理为一个可复现的请求序列。靶场环境的地址,你自己替换成实际测试地址即可。

第一次试探:

GET /sqli_3.php?id=1' HTTP/1.1 Host: 靶场地址

响应中出现类似ORA-01756: quoted string not properly terminated的报错,基本锁定Oracle。

列数探测:

GET /sqli_3.php?id=1 ORDER BY 3 HTTP/1.1

正常。

GET /sqli_3.php?id=1 ORDER BY 4 HTTP/1.1

报错,可判断列数为3。

回显位置确认:

GET /sqli_3.php?id=1 UNION SELECT 1, 2, 3 HTTP/1.1

观察到第2列显示2,判断第2列可回显。

版本信息获取:

GET /sqli_3.php?id=1 UNION SELECT 1, banner, 3 FROM v$version WHERE ROWNUM=1 HTTP/1.1

响应中出现了类似下面的内容:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

到此,数据库类型和版本确认完毕。如果你还想再验证一下,可以换v$instance里的version字段:

GET /sqli_3.php?id=1 UNION SELECT 1, version, 3 FROM v$instance HTTP/1.1

响应里就是19.0.0.0.0这种简洁的版本号。这个双保险在真实项目中很好用,因为万一某个视图权限受限或者返回格式异常,另一个视图可以兜底。

3.6 绕过一些常见限制:多行结果与列数再确认

如果v$version不加WHERE ROWNUM=1可能会导致页面输出多行内容,或者Oracle直接报错说 "ORA-01427: single-row subquery returns more than one row" 之类,那就反过来验证了行数的限制问题。加上ROWNUM=1后,问题就会消失。这个细节值得记住,因为它不是语法错误,而是结果集行数引发的逻辑问题。

还有一类情况是,某些靶场会故意在查询语句外面包一层子查询,导致你直接UNION SELECT的位置不太对。观察报错信息里的SQL片段通常能发现端倪。如果原查询外面套了SELECT * FROM (...) WHERE,你可能需要在你的注入语句后面补括号和别名,让整个SQL保持平衡。遇到这种情况,先用最基础的方式把语句结构弄清楚,再考虑嵌入版本查询。靶场练习本来就是让你在各种约束下找路,这个排查过程本身就是收获。

4. 常见问题与排查技巧实录

4.1 报错信息里看不到数据库类型怎么办

有些靶场默认把报错信息隐藏了,页面上只会显示500或者"服务器错误"。这时候不要慌,报错隐藏不代表无法判断数据库类型。你可以借助行为差异来推断:分别提交id=1'和id=1两个请求,观察响应是否变化;再提交id=1 AND 1=1与id=1 AND 1=2,有明显差异的说明数字参数可控。然后尝试几个不同数据库的专属语法,比如给Oracle用FROM dual测试,给MySQL用#注释测试,看哪个能触发不同的行为。

还有一种更隐蔽的方式:用UNION SELECT搭配各数据库的字符串函数,比如在Oracle里用'abc' FROM dual,在MySQL里用'abc'。如果某个语句成功了,页面显示了对应的字符串,那你自然就知道扩展语法支持哪种风格。这一招在报错完全不可见的情况下特别有效,本质上是拿数据库的"方言"来做指纹识别。

4.2 UNION查询一直报类型不匹配

典型报错是ORA-01790。这说明UNION对应位置的列类型不一致。解决办法就是我前面强调的:先把所有列都用NULL对齐,成功之后再逐个替换成数字或字符串测试,最后再填入版本表达式。绝对不要一上来就填banner这种字符串,尤其当原查询对应列是数值类型时,报错几乎必然。

如果NULL对齐都不行,那就可能是注入点位置问题,你的SQL片段没有真正拼接在预期位置。检查你是否需要闭合前面的引号或括号。比如在字符型参数里,你提交的'会把前面的引号闭合,后面的注释符可以把尾部SQL注释掉;在数字型参数里,你就不需要引号闭合,直接拼数字和运算符。搞清楚这两种场景的差异,能少走很多弯路。

4.3 版本信息查出来了但页面不显示

这种问题大多出在可回显列的选择上。有些列虽然存在,但页面逻辑只取其中特定列去渲染HTML,其他列被摄像头一样绕开了。你在UNION SELECT NULL,NULL,NULL阶段就要确认好哪些位置有内容输出,而不要假设所有列都会显示。另外,有些靶场的页面用了模板输出,可能在页脚、标题、列表等不同位置渲染不同列,你需要仔细查看响应正文,而不是只盯着一处看。

另外少数情况下,v$version在低权限用户下也可能查不到内容,因为某些视图需要特定权限。此时换用v$instance或者尝试SELECT user FROM dual来获取当前用户信息,往往能找到突破口。后者的查询门槛更低,也能有效佐证你是和Oracle在打交道。

4.4 快速识别Oracle的速查表

调试过程中,拿一张速查表对照会非常省事。我在实操中总结了几条,碰到情况时先对照一遍再决定思路:

行为或报错特征可推断的数据库
报错带ORA-前缀Oracle
报错带SQLSTATEPostgreSQL
报错里有Microsoft、ODBC字样SQL Server
报错带MySQL、SQL syntax字样MySQL
注释符号#生效MySQL(Oracle不认)
FROM dual可用Oracle
LIMIT可用MySQL、PostgreSQL
SELECT @@version生效SQL Server、MySQL
`

这张表的作用不是让你背下来,而是在试错时快速缩小范围。你会注意到,前两条靠报错,后几条靠语法行为。单独一条可能不准,但多项组合基本不会判错。

4.5 我踩过的一些坑和实用心得

最开始练SQL注入的时候,我总下意识地认为所有数据库都一样,用MySQL的套路去打Oracle靶场,结果光光一个注释符差异就卡了半天。后来学乖了,每到一个新环境,第一件事不是直接上UNION,而是花两三分钟验证数据库类型,磨刀不误砍柴工。

第二个心得是:在Repeater里调试时,尽量让每一步的输出"可观察"。比如列数探测阶段,可以用UNION SELECT 1,2,3...,页面上一目了然。这样既能定位回显列,也方便后面排查问题。不要一上来就写复杂的拼接表达式,出错了都不知道是哪一段的锅。

第三点是关于工具的使用习惯:Burp的Repeater右侧有响应渲染和原始响应两种视图,调试注入时建议切换到原始视图,直接用关键词搜索ORA-、error、select等字段,比肉眼扫渲染页面高效得多。如果你要批量测试不同payload,可以把请求丢到Intruder里跑,给每个payload设置一个清晰的标签,集中查看结果,效率能提升不少。

另外还有一个被很多人忽略的小技巧:Burp的搜索框支持在当前响应里高亮显示,输入banner、Oracle或version,快速定位结果位置。这在回显内容很多、页面结构复杂时非常管用。我每次查版本信息都习惯在响应窗口里按一下关键词定位,确认是否真的出了数据。

5. 后续还能怎么扩展

这一篇解决的问题是"查询Oracle数据库的类型和版本",但这个能力绝不止步于此。学会用v$version和v$instance之后,同样的UNION注入思路完全可以扩展到查询当前用户、数据库连接信息、表空间、表名和字段名。比如把注入表达式换成:

SELECT table_name FROM all_tables WHERE ROWNUM=1

就可以枚举当前用户可访问的所有表。再配合WHERE table_name LIKE '%user%'之类条件,帮助快速定位敏感数据表,这些都是本次版本查询的自然延伸。语句结构几乎不变,变的只是你SELECT的表达式和视图。也就是说,只要你能稳定地拿到版本信息,后面枚举数据在技术上只是换一下查询目标而已,难度增量并不大。

在真实的合规授权项目中,确认数据库版本排在所有注入动作最前面是有原因的:它会直接影响你是否能利用一些特定版本的已公开漏洞、是否需要调整攻击语法、是否能直接使用系统命令执行相关的函数。Oracle庞杂的版本体系和权限体系,注定了它不是最容易练手的对象,但一旦在靶场上把它的性格摸透,其他数据库再处理起来会顺手得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 7:55:43

本地部署AI Agent完全指南:从环境搭建到远程接管

最近有个朋友问我:为什么非要把 AI Agent 养在自己电脑上,直接用现成的在线服务不香吗?我反问他:你手里那几十个自动化任务,涉及私人笔记、工作文档、半成品代码,你真敢把它们全部交给某个在线平台吗&#…

作者头像 李华
网站建设 2026/10/20 7:55:42

大模型从CUDA迁移到昇腾:拆解“一行代码”背后的真实适配成本

先说结论:真不够。我在大模型相关的算力适配这行摸爬了几年,被各种“一键迁移”“一行代码切换”的宣传语反复轰炸过。直到我自己把一个开源的大语言模型从CUDA环境整体挪到昇腾环境,才发现这句口号只是“事情没那么简单”的温柔包装。说句实…

作者头像 李华
网站建设 2026/10/20 7:55:35

提示词工程入门:从模糊到清晰的AI沟通底层逻辑

最近总有朋友跟我吐槽:“AI工具越来越聪明,但我的AI怎么还是像个跟不上节奏的实习生?”细问之下,发现他们口中的“跟不上节奏”,多半是提示词(Prompt)写得太模糊。比如上来就是一句“帮我写个方…

作者头像 李华
网站建设 2026/10/20 7:55:27

CooRD MG 2.0:嵌入式视觉坐标映射引擎,轻量定点分段仿射方案

简介:这是一套面向GIS开发者、遥感图像处理工程师及计算机视觉初学者的坐标转换专用工具包,聚焦于人脸图像(以‘笑脸’为典型样本)在多坐标系间的精准映射与标准化处理。资源核心为CooRD MG 2.0软件系统,支持WGS84、北…

作者头像 李华
网站建设 2026/10/20 7:53:53

手写数字识别实战:One-vs-All逻辑回归与神经网络前向传播详解

手写数字识别,应该是机器学习入门阶段绕不开的一个坎。我当年做“多元分类及前向传播”这份课后作业时,前前后后磨了好几个晚上,才把 one-vs-all 逻辑回归和两层神经网络这两条路线真正跑明白。现在回头看,这道题的价值远不止“交…

作者头像 李华
网站建设 2026/10/20 7:53:51

推荐实验平台搭建:异步执行、持久记忆与双循环进化的工业实践

做推荐算法的同学应该都有这种体验:改了一版特征或者换了个损失函数,代码里偷偷加了几行实验标记,然后趁午休把训练任务塞进集群,下午开会的时候偷偷刷新页面看loss曲线。模型跑完还要手动记metric、截图存在聊天记录里&#xff0…

作者头像 李华