fofa API 签名逆向

某天准备用自己抓包写的脚本爬一些fofa上的数据时,发现出错了

1
2
3
4
5
{
"code": -9,
"message": "[-9] API校验密匙错",
"data": ""
}

经过抓包,发现请求多了ts sign app_id 三个参数,关键是sign


尝试通过追踪请求的调用栈和搜索关键词,在webpack js源码中找到签名的代码

发现这里有一串RSA private key,调用sortFun进行签名

找到sortFun

对代码进行修改以方便调试和查看效果

可以看到签名的字符串是把url中的所有参数和值拼接在一起

1
2
3
4
5
6
echo -n "fullfalseqbase64cHJvdG9jb2w9Imh0dHAits1652105964318" | openssl dgst -sha256 -sign fofa_rsa.pem | base64
X2gz9o3GrWhKim51dO5QB0nz2XJLCCP5T9jJxn3TXZH7NLNy75enVvb8JMoIbCJuEuoM1HdI6nd2
YdGn7Ag26lnZoUNQy/4l+0ff66mvaxl+iidthKV/MaINvFSewlteGCzwekx0IbiOS4HABmOBCfqG
2HzAb+Eqo/olWoDcNmJSaW9f4f1W0bpQNoB9XCHL5Jsq89AwG/5hrbdKXCZu93f9sFdHszw7kZGQ
kqBgPm/SJ7hJnukCMWBB6GF7eotOGx524RMGO/LKiDBb9g3dUNGa4H1op6AW5WpaeRQT2CPTpjLk
qVZYaG7bO6t2zO3ltcg6ajTIplVfgtIbu/ZvqQ==

验证成功

py脚本

1
2
3
qbase64 = base64.b64encode(q.encode()).decode()
for_sign = "fullfalsepage%sq%sqbase64%ssize10"%(i,q,qbase64)
sign = urllib.parse.quote(base64.b64encode(rsa.sign_hash(rsa.compute_hash(for_sign.encode(), 'SHA-256'), privkey, 'SHA-256')).decode(),safe="")
作者

RinkoQwQ

发布于

2021-07-21

更新于

2022-07-21

许可协议

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.