某天准备用自己抓包写的脚本爬一些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="")
|