文章目录
文笔有限,大佬轻喷。
1. 签到:这是一个登录页面
按照页面提示,拼接访问:/login。
构造请求包,以json格式传输,返回一串JWT密文。
JWT密文解码如下:
拿到JWT密文之后思路突然就断了。尝试查看页面源码、访问robots文件等寻找hint,在robots文件中得知还存在/fulage
拼接访问:/fulage
尝试构造请求包,发现需要token。
将/login处获得的token构造后直接发送,提示我们不是admin。
尝试修改JWT对应的payload部分,即伪造用户。
再次发送JWT,拿到flag。
2. web2
构造请求包,提示访问/admin
访问/admin,返回FORBIDDEN
响应包中含有:
Server: gunicorn/20.0.4
,存在请求走私漏洞。参考链接:gunicorn请求走私漏洞
n version 20.0.4 of gunicorn there is a request smuggling vulnerability which works regardless of which proxy is used in front of gunicorn. It is caused by special parsing of the Sec-Websocket-Key1 header.
在 gunicorn 的 20.0.4 版本中,存在一个请求走私漏洞,无论在 gunicorn 前面使用哪个代理,该漏洞都会起作用。这是由 Sec-Websocket-Key1 标头的特殊解析引起的。
尝试构造请求包。
伪造UA。
第二段请求中拼接访问:/fl4g
伪造XFF,拿到flag。
3. 这又是一个登录页面
任意输入账号密码,响应包中返回一串JWT,并重定向到/fl4g
对JWT进行解码,可以查看到相应的信息。
发送相应的请求信息,权限不足。
尝试寻找secert,无果。在robots文件找找到公钥信息。
JWT最常用的两种算法是HMAC和RSA。HMAC(对称加密算法)用同一个密钥对token进行签名和认证。而RSA(非对称加密算法)需要两个密钥,先用私钥加密生成JWT,然后使用其对应的公钥来解密验证。
如果将算法RS256修改为HS256,后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。由于公钥有时可以被攻击者获取到,所以攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据进行签名。如果将alg参数改成HS256,这样就将算法RS256修改为HS256,让服务器不使用对称加密,转而使用非对称加密算法。
所以下一步思路是修改算法,使用公钥对数据进行加密,参考:JWT攻击,编写脚本如下:
import jwt
public =open('public.pem','r').read()print(jwt.encode({"account":"@dministr@t0r"}, key=public, algorithm='HS256'))
注意导入PyJWT模块,直接运行会报错。
直接定位到相应模块,注释掉关键代码即可。
运行代码,拿到伪造的JWT密文。
构造请求包并发送,拿到flag。
4. html练习生
存在登录框,习惯性测试SQL注入、弱口令,均无果,来到注册处,注意UserID必须为数字。
注册完账号后直接登录。
- “修改个人信息”页面
- “登录日志查看”页面
“登录日志查看”处可以登录UserID、登录IP地址以及登录时间,可以尝试二次注入。在没有源码的情况下,实现二次注入相对较难。但可以尝试分析后端功能:在登录系统后,会记录登录IP、UserID,那么大概率存在一个查询这些信息并将其插入到相应表中的动作。
UserID可控,但是只能为数字,猜测后端使用了
is_numerice()
函数,该函数识别16进制。那么就将插入、查询信息的流程连贯起来了。
mysql> insert into admin (id,name,pass) values ('3',0x61646D696E27313131,'11');
Query OK, 1 row affected (0.00 sec)
mysql> select * from admin;
+----+-----------+-------+
| id | name | pass |
+----+-----------+-------+
| 1 | admin | admin |
| 2 | admin'111 | 11111 |
| 3 | admin'111 | 11 |
+----+-----------+-------+
4 rows in set (0.00 sec)
- 获取表名
','a',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'c')#
将其转换为十六进制,注意加上
0x
前缀符号。
- 获取列名
','a',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='injectflag'),'c')#
- 获取数据
','a',(select group_concat(fl4g) from injectflag),'c')#
版权归原作者 Zue3r 所有, 如有侵权,请联系我们删除。