小伙伴们大家好!由于我们在学习SQL注入的时候经常会遇到看不懂payload以及不知道为什么我们使用某些语句,所以呢,本期我就为大家带来学习SQL注入的前置知识。
目录
一、环境搭建
首先显示我们的环境搭建,这里我们是选择PHP+MySQL的集成环境-PHPStudy2018。压缩包地址我已经在下面给出了网盘下载地址。
链接:https://pan.baidu.com/s/1agjFAW3ZoQbM3vG4yhJDxg
提取码:6666
首先呢我们先将压缩包解压。
压缩包里有一个phpStudySetup.exe文件就是PhpStudy的安装程序。
点击安装程序进行安装。(安装的时候可能有的杀毒软件会报毒,安装时记得把杀毒软件关闭)
这里一定要注意路径不能包含中文和空格。
安装ing...
安装完成。
这是打开之后的界面。
点击“其他选项菜单”-->再点击“网站根目录”,就会进入到以下目录。
该目录就是网站的根目录,网站的源代码都放在这里。
这里我们先来测试一下我们安装的phpstudy是否可以正常使用。
首先我们把phpstudy启动。
然后在网站根目录下创建一个test.php文件。
在里面写入一些代码。
然后在打开浏览器地址栏输入127.0.0.1/test.php
可以看到我们打印的“hello world”被浏览器输出。
OK这样我们的php集成环境PhpStudy就搭建成功了!
二、MySQL基础
1.启动MySQL
首先呢我们还是启动我们的phpstudy, 先点击其他选项菜单,然后选择MySQL工具点击MySQL命令行。
输入密码:root(默认密码为root)。
这样我们的MySQL就成功启动了。
2.MySQL基础操作
1>列出所有的数据库
show databases;
2>进入到某个数据库
use 数据库名;
eg:
use test;
3>列出所有的表
show tables
这里可以看到test数据库下只有一张users表。
4>查看表的信息
desc 表名;
eg:
desc users;
这里可以看到users表的字段名包括id(int型,自增主键)、username(varchar型)、password(varchar型)。
5>查询表中的数据
select 字段名1,字段名2,...,字段名N from 表名 /*当前库查询*/
select 字段名1,字段名2,...,字段名N from 数据库.表名 /*跨库查询*/
select * from 表名 /*当前库查询*/
select * from 表名 /*跨库查询*/
其中 “*”代表通配符,代表查询所有的字段。
eg:
select id,username,password from users;
select * from test.users;
6>创建表
create table `表名` (字段名1 字段名1类型,字段名2 字段名2类型,...字段名N 字段名N类型);
eg:
create table `guest`(
`id` int unsigned auto_increment,
`name` varchar(255) not null,
primary key(`id`)
)ENGINE=InnoDB default charset=utf8;
show tables一下检查是否真正创建成功。
创建成功。
7>插入数据
insert into 表名 ( 字段名1, 字段名2,...字段名N ) values ( 值1, 值2,...值N );
eg:
insert into guest(id,name) values (1,"Jack");
我们查询guest表中数据,看数据是否插入到guest表中。
插入成功!!!
8>where语句
select 字段名1, 字段名2,...字段名N from 表名 where 条件1 and/or 条件2.....
eg:
select * from users where id=2;
此结果为查询id=2的数据。
9>更新数据
update 表名 set 字段名1=新值1, 字段名2=新值2,...字段名N=新值N where 条件1 and/or 条件2...
eg:
update users set password="123.com" where username="Tom";
此结果为将username为“Tom”的password更改为“123.com”。
10>删除数据
delete from 表名 where 条件1 and/or 条件2...
eg:
delete from guest where name="Jack";
此结果为删除guest表中name值为“Jack”的数据。
11>like子句
select 字段名1, 字段名2,...字段名N from 表名 where 字段名1 LIKE 条件1 [[and/or] 字段名2 = 'somevalue']
eg:
select * from users where username like '%adm%';
like 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %,LIKE 子句与等号 = 的效果是一样的。
该语句结果为查询users表中username含有“adm”字符串的数据。
12>union查询
select 字段名1,字段名2,...,字段名N from 表名1 union select 字段名1,字段名2,...,字段名N from 表名2
# 这里要注意两边查询的字段数要一致否则会报错。
eg:
select username,password from users union select * from guest;
这里要注意两边查询的字段数要一致否则会报错。
13>order by排序
select 字段名1,字段名2,...,字段名N from 表名1 order by 字段名/字段数
# 当如果“order by 字段数” 时,当字段数大于该表的字段数时就会报错,小于就不会报错
当如果“order by 字段数” 时,当字段数大于该表的字段数时就会报错,小于就不会报错,这在之后SQL注入时猜测后端查询语句查询几个字段数时具有非常重要的作用。
eg:
select * from users order by password;
select * from users order by username;
14>if语句
if(条件, 结果1, 结果2);
# 如果条件正确的话,返回结果1,否则返回结果2
eg:
update users set password=if(1=1,"123456","pass") where username="Tom";
15>sleep()函数
sleep(time) # time 为数字 sleep(time)成功执行之后,数据库会在time秒之后才返回结果
sleep()经常与if语句搭配使用,进行时间盲注。
eg:
select username from users union select sleep(5);
16>group_concat()函数
group_concat(字段名) 可以将我们查询到的数据用“,”拼接起来
16>删除表
drop table 表名
eg:
drop table guest;
17>删除数据库
drop database 数据库名;
eg:
drop database test123;
三、PHP操作数据库
1.连接数据库
$coon = mysqli_connect("127.0.0.1","root","root","test",3306);
// mysqli_connect(主机名, 用户名, 密码, 数据库名, 端口号)
2、执行SQL语句
$sql = "select * from users";
$result = mysqli_query($coon,$sql);
// mysqli_query(数据库链接, sql语句)
3、输出SQL语句执行结果
// mysqli_fetch_array将$result转化为数组形式
$row = mysqli_fetch_array($result);
if ($row) {
echo "<center></br>";
// 输出username字段
echo "<h1>"."username:".$row['username']."</h1>"."<br/>";
// 输出passowrd字段
echo "<h1>"."password:".$row['password']."</h1>"."<br/>";
echo "</center>";
}
在地址栏中输入该php文件的地址,我的该php文件地址是opsql目录下的sql01.php文件。
4>通过传参让PHP操作MySQL
1.GET传参
GET传参就是通过在URL后面加入参数,形式为“http://host:port/路径?参数名=参数值”,后端接收传过去的参数进行后续操作。
例如我们创建一个php文件(/opsql/sql02.php)
<?php
// 连接数据库
$coon = mysqli_connect("127.0.0.1","root","root","test",3306);
// 接受传来的参数id
$id = @$_GET['id'];
if (isset($id)) {
// 执行的SQL语句
$sql = "select * from users where id=$id";
$res = mysqli_query($coon, $sql);
$row = mysqli_fetch_array($res);
if ($row) {
echo "<center></br>";
echo "<h1>"."username:".$row['username']."</h1>"."<br/>";
echo "<h1>"."password:".$row['password']."</h1>"."<br/>";
echo "</center>";
}
} else {
echo "<center>";
echo "<h1>Please input a value as id!</h1>";
echo "</center>";
}
PHP的$_GET['参数名']就是获取前端以GET方式传进来的参数值。
2.通过POST传参
由于GET方式传递的参数都能显示在URL上面,如果我们传递的是我们的用户名和密码,那么将会造成信息泄露,所以就出现了POST传参。
POST传参是在请求体中传递数据,不会显示在URL上面,可以通过抓取数据包来获取。
创建/opsql/php03.php文件
<?php
// 连接数据库
$coon = mysqli_connect("127.0.0.1","root","root","test",3306);
echo "<br/>";
echo "<center>";
echo "<form method='post' action='sql03.php'>";
echo "<lable>Id</lable><input type='number' name='id'/>";
echo "<input type='submit' value='OK'/>";
echo "</form>";
echo "</center>";
// 接受传来的参数id
$id = @$_POST['id'];
if (isset($id)) {
// 执行的SQL语句
$sql = "select * from users where id=$id";
$res = mysqli_query($coon, $sql);
$row = mysqli_fetch_array($res);
if ($row) {
echo "<center></br>";
echo "<h1>"."username:".$row['username']."</h1>"."<br/>";
echo "<h1>"."password:".$row['password']."</h1>"."<br/>";
echo "</center>";
}
} else {
echo "<center>";
echo "<h1>Please input a value as id!</h1>";
echo "</center>";
}
这样我们就使用PHP成功操作了MySQL数据库。