安装LAMP:
安装Apache:
yum install httpd -y
systemctl start httpd
systemctl enable httpd
安装PHP:
yum install php php-mysql -y
systemctl restart httpd
安装MariaDB:
yum install mariadb-server -y
systemctl start mariadb
systemctl enable mariadb
设置密码,登录MariaDB:
mysqladmin -u root password “123”
mysql -uroot -p123
PHP代码规范
开始标记,每行PHP代码必须以分号(;)表示结束。
变量必须以“$”符号开头,规范变量名称大小写。
echo语句用于输出,双引号中的变量会被解析执行,点号(.)用于连接字符串。
在客户端浏览器以HTML代码的形式执行。
单行注释://和#
多行注释:/……/
for循环:for ($i = 1; $i <= 10; $i ++)
选择语句:
==:判断是否相等;
=:赋值
同一个语句块的代码应使用花括号括起来
while循环:
需要在循环体内让循环变量的值不断发生变化
get与post:
创建的文件应与相关的HTML文件在同一文件夹
$变量 = $_GET[‘ ’]:接收get方法传递的数据
$变量 = $_POST[‘ ’]:接收post方法传递的数据
$变量 = $_REQUEST[‘ ’]:接收get和post方法传递的数据
弱类型比较漏洞:
标准数据类型:
int整型
string字符型
float浮点型
boolean布尔型
var_dump():输出变量的数据类型(文本显示字符数)及对应的值
检测数据类型(返回bool值):
is_string:检测变量是否是字符串。
is_int或is_integer:检测变量是否是整数
is_numeric:检测变量是否是数字或数字字符串
不同类型数据的混合运算:
PHP是弱类型语言(可对不同类型的数据混合运算)
PHP会对数据类型自动转换,先将参与运算的数据都转换为同一类型,然后再进行运算
转换规则:
当字符串执行算术运算时,先将字符串转换为数值类型后,再进行算术运算
当数值执行字符串连接运算时,先将数值转换为字符串类型后,再进行字符串连接运算
算术运算时的转换规则
字符串开头部分符合整数格式时,字符串将被转换为整数(字符后为0)
字符串开头部分符合浮点数格式时,字符串会被转换为浮点数
如果字符串不是以数字开头,则全部被转换为0
比较运算的基本规则(返回bool值):
数值型数据,按数值大小比较。
文本型数据,按每个字符所对应的ASCll值比较。
如果将数值型和文本型数据一起比较,会将文本型转换为数值型,然后再比较
===比较运算,不仅要比较数值大小,还要比较数据类型(是否相同,包括进制)
不同数制之间的直接比较:
在PHP中,八进制数前为0,十六进制数前为0x
!:取反
show__source(‘文件名’):高亮显示(在网页上显示文件源码)
include:包含;能直接调用
isset():检测是否存在变量,且不为NULL,返回bool值
0 在判断语句中返回flase,其他返回ture
强制类型转换函数:
intval():将数据转换为整数
strval():将数据转换为字符串。
常用的PHP文件【静态文件可能直接下载,动态显示代码】:
www.zip
www.zip2
index.php.bak 网址首页备份
扫描工具:
ciphey/ctf-wscan/dirsearch/dirb
请求报文头部:
cookie,相当于标识符
科学计数法:Xey=X x10的y次方
Burpsuite:将get修改为post,
需添加字段:Content-Type:application/x-www-form-urlencoded(表名将内容由表单发送)
也可右键点Change request method
请求头和内容之间需有一个空白行
变量覆盖漏洞
PHP中的数组(array):
1、可以一次性定义一组变量。
2、由多个元素组成,每个元素相当于一个变量。
3、每个元素是一个“键值对”(key=>value),键是变量名,值是变量中的数据
输出:
print_t():数据
var_dump():数据加类型
不指定键名时系统自动以0、1、2……作为键名
定义数组:
array():一次性在数组中添加多条数据
range(区间,闭区间):数据连续
遍历数组
语法格式:
foreach(array[定义数组] as $变量):循环读取数组中元素的值并赋值给变量
foreach(array as $变量1=>$变量2),循环读取数组中元素的键赋值给变量1,元素的值赋值给变量2
. :连接字符,输出有两个以上的变量需加链接字符
预定义变量:
如:$_GET、$_POST、$_REQUEST、$_FILES、$_SERVER、$_COOKIE、$GLOBALS…
预定义变量的数据类型是数组,这些变量都是将获取到的数据存储为数组的形式
预定义变量所指定的参数其实就是键名
在服务端用$_GET、$_POST接收客户端数据时,不指定参数时,此时客户可以使用任意参数
var_dump($_GET[‘变量’]):指定变量;多个相同变量输入不同值时,仅显示最后一个值
可用[0]、[1]等输入数组,可显示全部
var_dump($_GET):可用任意字符,且多次
$_SERVER[“键名”]:接收请求报文头部字段
:包含了所有变量,键名为变量名
可用$GLOBALS[“变量名”]输出对应的值【不用加$】
可变变量:
$变量1=值1
$$变量1=值2 相当于 $值1 = 值2
error_reporting(0);关闭错误提示
preg_math(“正则表达式”,指定字符串)
^:以什么开头;$表示以什么结尾;
^字符$:表示是指定的字符
eval():把参数当成代码执行;
错误代码:
429:访问次数过多
403:没有访问权限
404:访问页面不存在
dirsearch -h 网址 –max-rate=数 限制每秒请求数
敏感文件:
rotbots.txt:指定禁止搜索引擎收录的文件;能看到网络文件结构
www.zip:网站打包文件
index.php.bak:网站首页备份文件
.git:协同开发的软件,对软件版本进行管理;可拿到历史的所有版本信息;
git泄露利用工具:Git_Extract
git clone https://github.com/gakki429/Git_Extract.git
用法:python2 git_extract 网址/.git/
file_get_contents():将文件内容读取并设为字符串
PHP exit(): 输出并退出
Hash函数:
echo -n ‘字符’ | md5sum :md5运算(32位)
echo -n ‘字符’ | sha1sum:sha1运算(40位)
-n :去换行符
PHP计算md5:
php -r “var_dump(md5(‘字符串’));”
expr lenth ‘字符串’:liunx检测字符长度
wc -L ‘文件’:检测文件行数
a = “bci177a7a9c7udf69c248647b4dfc6fd84o”
key = “0123456789abcdef”
for i in a:
if i not in key:
a = a . replace(i,””)
科学记数法比较
用双等号将数值型和文本型数据一起比较,会将文本型转换为数值型
md5()函数弱类型漏洞:
如果md5函数所得到的Hash值正好以0e开头,而且后面且全是数字,那PHP就会
按照科学记数法进行处理,将其视作0
例如:QNKCDZO、240610708、s878926199a、s155964671a、s214587387a
md5()函数无法处理数组:
md5()函数所能处理的数据类型必须是字符串,如果是数值型数据会自动被转换为字
符串,但是如果处理的数据是一个数组,md5()函数会报错,并返回NULL。
sha1()函数漏洞:
存在弱类型和无法处理数组的漏洞
sha1()函数常用的payload字符串: aarozmOk、aaK1STfY、aaO8zKZF、aa3OFF9m
strcmp函数漏洞:
strcmp (string str1,string str2 )
strcmp用于比较两个字符串是否相等,若参数不是字符型数据,PHP会将该参数自动转换为字符型数据后再进行比较,若无法转换成字符型数据时,将会报错,而且将返回0
若str1小于str2,返回小于0的整数
若两个字符串相等,函数返回0
若str1大于str2,返回大于0的整数
==:文本转数值
===:类型+数值
urldecode:url解码
urlencode:url编码
SQL注入漏洞:MD5():
md5(string , raw);现版本只存在str;
string:必需。规定要计算的字符串。
raw:可选,规定十六进制或二进制输出格式:
TRUE-原始16字符二进制格式
FALSE-默认,32字符十六进制数
ffifdyop经过mds加密后,返回的16字符二进制格式是’or’6xc9]x99xe9!r,xf9xedbx1c
mysql会把以数字开头引号内的字符串当做整形处理(6相当于真值)
parse str()函数变量覆盖
parse_str():URL处理函数,可以把URL中用户提交的参数转换为变量
使用parse_str()函数时,要求必须加上array参数,从而将该函数解析得到的变量保存在一个数组中,避免覆盖原有的变量
&符号相当于分隔符,可用url(%26)替换
复写绕过:
URL包含URI
URI为HTTP请求报文的请求行 协议/主机/URI
strstr():搜素某个指定的字符串在另一字符串中是否存在【区分大小写】
如果存在,则返回该字符串及剩余部分[字符串后面的部分],否则返回FALSE
stristr():搜索字符串在另一字符串中的第一次出现,返回剩余部分[不区分大小写]
echo()输出
substr():返回字符串中指定的一部分[从0开始]
str_replace(‘字符串’,’替换字符串’,变量)
intval():取整(不是四舍五入),字符转数值
ctype_alpha():检测函数,用来检测参数是不是字母
CentOS8:intval(1e3)1000;
CenOS7: intval(1e3)1
phpinfo():显示PHP的信息
preg_match()与preg_match_alI():正则表达式处理函数
preg_match():找到第一个匹配的结果就退出,返回值0(没找到)或1(找到了)
preg_match_all():找出所有匹配到的结果,返回值0(没找到)或1、2、3…..(具体找到的匹配结果数)
php_uname():返回运行php的系统的有关信息
mode:单个字符,用于定义要返回什么信息
'a’:默认,包含序列”s nrv m”里的所有模式
’s':操作系统名称
‘n':主机名
‘r’:版本名称
‘v’:版本信息,操作系统之间有很大的不同
'm':机器类型
pho_urame ()函数会返回运行po的操作系统的相关描述,和phpinfo()最顶端上输出的是同一个字符串。如果仅仅要获取操作系统的名称。可以考虑使用常量PP_os,不过要注意该常量会包含nNP构y建(bu1lt〉时的操作系统名。
基础正则表达式:
PHP中的正则表达式的组成:
1、 基本字符:要匹配的目标,必须要有
2、 元字符:定义匹配规则【|(或)】
3、 修饰符: i(是否区分大小写);m(将字符串视为多行)
4、 /.…./:定界符:除了修饰符之外,正则表达式的其余部分必须要放在定界符之内
通用字符:
s匹配空白(空格、tab)
S匹配非空白
w匹配非特殊字符(a-z、A-Z、0-9、_、汉字)
W匹配特殊字符(非字母、非数字、非下划线、非汉字)
d表示匹配一个数字字符。等价于[0-9]
D则表示匹配一个非数字字符。等价于[^0-9]
字符簇
基本字符,可以表示一类字符
[[:digit:]]:匹配任意数字。
[[:upper:]]:匹配任意大写字母
[[:lower:]]:匹配任意小写字母
[[:punct:]]:匹配任意标点符号
字符匹配元字符:可以代表任意基本字符(单个):
.(点),匹配任意单个字符。
[ ]:匹配指定范围内的任意单个字符
^放在[ ]([^ ])内表示取反
^放在[ ]([1])外表示指定字符开头
匹配次数元字符:
(星号)︰匹配它前面的字符任意次,可以是0次
星号()通常与点号(.)配合使用,用于匹配任意数量的任意字符
?:匹配前面的字符0次或1次
+:匹配前面的字符至少1次
{ }:精确匹配前面的字符指定次数
{数}:匹配具体次数次。
{m,n}:匹配至少m次,最多n次
{m,}:匹配至少m次,多则不限
分组元字符
():用于对关键字进行分组
如果要对多个连续的字符指定匹配范围,就需要对其进行分组
(字符串){m,n}:作为一个整体,至少要出现m次,最多n次
位置锚定元字符:
^:匹配字符串的开始位置
$:匹配字符串的结束位置
^和s一起使用时,表示整行匹配
sql中,文本型的数也按数值型运行
gat方法传输数据,先判断第一个字符
trim():去除指定字符,默认为左右两边空格
命令执行漏洞(RCE):
调用系统命令
system():直接将变量用Linux命令运行
passthru():直接将变量用Linux命令运行
shell_exec():将命令结果放在一个数组中(本身为数组),用var_dump()输出
exec(参数1,变量2): 将命令结果放在指定的数组中,用var_dump(变量2)输出
linux:ping -c 数:限定ping的次数
ping -w 数:限定超时的时间
window:ping自身有限定次数(4)
黑客攻击方式:
1、 获得网络权限
2、 服务器
3、 系统shell
Linux系统中允许同时执行多条命令的符号
; 连接多条命令
&& 前面命令执行成功了才执行后面的命令
ll 前面命令执行失败了才执行后面的命令
l(管道符) 前面命令输出结果作为后面命令的输入内容(命令可无关,直接执行后面的命令)
& 将前面的命令转入后台执行,并同时执行后面的命令
jobs:查看后台运行命令
jobs -l:查看后台运行中命令的PID(编号)
shell编程:
waf:web应用防火墙,在网站/服务器前面加waf,拦截,
白名单:只允许使用白名单中的字符
explode(“分隔符”,变量):把字符串打散为数组
sizeof():检测数组个数
print_r():输出元组数据
cat head [-n 数] 前[n行] tail[-n 数] 末[n行] more 分屏[‘ ’ 翻屏] less分屏[‘ ‘翻屏;q结束]
tac 输出与cat相反 sort 排序 strings
linux:空格绕过 <[输入重定向] $IFS [空格, ,
]
get方法可用url编码 %0a(
换行),执行多条命令
有文件名限制的可用通配符绕过(*任意,?单个)
有通配符加文件名限制,可用定义加引用:a=lag;echo f$a.php[打开flag.php文件]
或cat $(ls) [查看当前目录所有文件]
(反撇号) == ${ }
反撇号与system():可调用执行系统命令 反撇号
的执行结果为字符串,用echo输出
${ }:eval()函数,可执行PHP代码
${ }:不用加分号或放在引号内
系统环境变量一般大写
echo $变量:输出变量
set:显示定义的所有环境变量
【tab】
$IFS:定义分隔符
$数{两位及以上数+} :位置变量
-普通文件 d目录 l链接 b块设备 c字符设备
symbol:字符
.字符1.字符2:按顺序查找字符1、2
shell编程:定义不加$,引用要加$
也可 echo ${变量}值 输出
乱码可在火狐浏览器里的查看中修复文字编码
命令执行漏洞:将用户输入的数据当作系统命令去执行
代码执行漏洞:将用户输入的数据当作PHP代码去执行
代码执行
eval():将函数中的参数当做PHP代码执行
assert()与eval()功能基本类似
要求:客户端传入的数据应符合PHP代码规范,必须以分号结尾
scandir(“文件位置”[无默认值])列出目录中的内容,类似ls -a 命令
读取的数据以数组的形式存放,用var_dump()输出。
file():读取文件内容
file_get_contents():读取文件内容
内容以数组的形式存放,需要配合var_dump()输出
get方法最多传250个字符;post方法无限制
一句话木马:eval($_POST[‘ ’]);
Session用于识别用户身份:
当同一个浏览器用户访问服务器上不同的PHP页面时,使用cookie在不同的PHP页面之间传递同一个SessionlD,从而确保同一个浏览器用户的SessionlD是相同的。
在服务器端使用Session,首先要用session_start()开启session,所有的session信息都存放在服务器端的Session文件中。
通过预定义变量$_SESSION来解析和修改session文件。
session_unset():删除$_SESSION数组中所有的元素,但不删除session文件,也不释放SessionID
session_destroy():删除session文件,并将SessionIlD置为0。
cookie一般存放在客户端,session一般存放在服务器;
time():获取当前时间,以1970年1月1日(Unix操作系统)为元年获取的秒数;
file():读取文件,并保存到数组里
API:应用程序接口
php会直接将八进制或十六进制转化为ascll码
\代表本身
==
//mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
//mb_strpos (haystack ,needle )
//haystack:要被检查的字符串。ll needle:要搜索的字符串
//mb_substr()i函数返回字符串的一部分。
//str 必需。从该string 中提取子字符串。
//start必需。规定在字符串的何处开始。
//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
用vim编辑器编辑网页,可能产生index.php.swp的隐藏文件
vim -r 修复
两个系统传送数据:
nc -l(listen)p(port) n 打开n端口
nc 服务器 端口 <(输入重定向) 文件名
注:若没有接收数据,可检查是否打开防火墙
-l开启监听模式,用于指定nc将处于监听模式。通常这样代表着为一个服务等待客户端来链接指定的端口。
-p<通信端口>设置本地主机使用的通信端口。有可能会关闭
-k<通信端口>强制 nc待命链接.当客户端从服务端断开连接后,过一段时间服务端也会停止监听。选项k可以强制服务器保持连接并继续监听端口。
PHP5.5.9漏洞:
键值为4294967296会溢出,为0;
MD5强碰撞,找到两个不相同的数据,但是它们的MD5值却相同(fastcoll)
在网页中传输,需用(URL编码转换发送,用post
linux:
:命令换行时,连接
强制类型转换:
(数据类型)$_POST[‘变量名’]
windows:
终端:打开D盘:d:
fastcoll用法:软件名 -p 初始化文件名 -o 生成的文件名
或 将初始化文件拖到fastcoll
php中:=则|=|,将|转义;故|\=|,并没有将和|单独屏蔽;而||\屏蔽|;
↩︎