一、MySQL基础语句。(增、删、改、差)
mysql> create database zeng;// 数据库建立
mysql> create table zeng.jia (id int,name char(15),tel int,primary key(id)); 建立一个名为 //userlist 表格 字段 id 整型 name 字符型 电话 整型 主键值是学号
mysql> insert into zeng.jia (id,name,tel) value (1,'xiu',111111111)
mysql>drop table zeng.jia/// 删除表
mysql>drop database zeng //删除数据库
mysql> alter table test.userlist add sex char(10) after name;
//在姓名和电话之间加入了性别字段
mysql> show databases; //查看有哪些数据库
mysql> use mysql; //进入一个名字为 mysql 的数据库
mysql> show tables; //查看当前数据库中有哪些表
mysql> select * from user; //查看表
mysql> desc mysql.user; //查看表结构
特殊数据库information_schema
information_schema数据库表说明:
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show
columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源mysql.columns_priv授权表。是非标准表。
COLLATIONS表:提供了关于各字符集的对照信息。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
二、sql注入
sql 注入原理
针对 SQL 的攻击行为可以描述为通过用户可控参数中注入 SQL 语法,破坏原有 SQL 结 构,达到编写程序时意料之外结果的攻击行为,其成因可以归结为以下两个原因叠加造成的:
1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造 SQL 语句。
2、未对用户可控参数进行足够的过滤,便便将参数内容拼接到 SQL 语句中。
注入点检测
识别方法:通过在url栏输入'
、and 1=1
、or 1=1
、and sleep(1)
,如果出现报错,或者页面不一致,则可能存在注入点。
注入手法
1、联合注入
注入点的判断 ?id=33 /?id=34/ ?id=32/ ?id=33'
判断列(字段)数 ?id=1' order by 1 正常 /?id=1' order by 2 正常/ ... /?id=1' order by n 不正常 /说明当前表中有(n-1) 列。
URL框中输入id=1与id=2-1回显结果不一致由此判断可能存在sql注入漏洞,若存在类型为字符型。
三列,也就是存在三个字段
爆出数据库名,表名以及字段
2、报错盲注
在注入点的判断过程中,发现数据库中 SQL 语句的报错信息,会显示在页面中,因此可以进 行报错注入。
注意:错误信息来自于 数据库 、 中间件 还是 Web 容器 。
and extractvalue(1,concat(0x5e,(select database()),0x5e)) --+
3、布尔盲注
利用页面的布尔类型状态来进行判断,⽬标获取数据库名字。 计算数据库名字的长度 .
4、延时注入
在没有得到任何回显的情况下,只能通过延迟页面的跳转来进行数据库的核对
?id=3' and if(length(database())=8,sleep(5),1)--+
三、sql 注入防御
过滤特殊字符,采用参数化查询,使用户输入的参数永远为普通字符,不会被作为特殊符号打 乱原有 sql 语句。
<?php
$mysqli = new mysqli("localhost", "root", "root", "dvwa");
$sqli = "a'b\"c";
$safeinsert = preg_replace("/[\'\"]+/", '', $sqli);
$safeinsert = str_replace("select", "", $id);
echo $safeinsert;
$name = "Jack";
$age = 30;
$gender = "male";
$sentence = sprintf("My name is %s. I am %d years old and I am a %s.", $name, $age,$gender);
echo $sentence;
$mysqli = new mysqli("localhost", "root", "root", "pikachu");
$id="111'";
$query=sprintf("select * from users where id='%s'",mysqli_real_escape_string($mysqli,$id));
echo $query;
?>
四、绕防御
大小写绕过 双写绕过 使用 ||(or) 和 &&(and) (使用时进行 URL 编码%26) --+注释 +代替空格