目标网站:aHR0cHM6Ly9iZWlhbi5taWl0Lmdvdi5jbi8= (某加密后的网站,应该懂得)
所需技能:哈希算法,OpenCV相关的图像知识,python爬虫基础库的运用
网上关于此网站破解的文章很多,但是基本都过时了。不过基于此网站衍生出来的第三方网站却很多,比如需要开会员才能看的站长工具等。那我们何不自己来破解一下呢?
先看首页
输入要查询的单位名称,点击搜索,会弹出一个滑块的验证码。
不要慌,此验证码既不是某验的,也不是某盾的。
验证通过,得到所有信息。
step1: 打开浏览器调试功能中的xhr选项,找到最终的结果页和请求URL
打开详情页可以看到该条请求的实际URL和所需参数:
先看请求方式是POST,data里面需要pageNum, pageSize, unitName三个参数,如果你是业内老手不难猜到:
pageNum指的是页数,
pageSize指的是每页显示的条数,
unitName就是你要查询的企业名称了。
很显然,三个简单的参数不是重点。
step2: 重点来了,就是headers里面的三个参数 sign,token,uuid
首先先来翻一下前面几个xhr链接,你会惊奇(喜)的发现:
尾号为checkImage的请求,返回的一个字段"params"正好是sign的值;
尾号为getCheckImage的请求,返回的一个字段"uuid"是我们需要的uuid;
尾号为auth的请求,返回的一个字段"bussiness"是我们需要的token;
路子有了,目标明确了,接下来就是挨个分析了。我们先来token
step2.1
token的生成需要两个参数,timeStamp和authKey
第一个是时间戳,很明显。第二个呢?
简单点,全局搜一下,结果也只有一个:
通过图中几处标记,可以大致看出,authKey是某三个参数经过md5加密后的一个字符串。
此时需要在261行处打一个断点看下,这三个参数到底是什么
由此我们可以大胆的猜测(得到),A和g都是字符串"test",而I是赋的t的值,那便是timeStamp。
此时,两个参数齐活,可以发起第一个请求了。token的值拿到。
step2.2 获取uuid的值
要想拿到uuid的值很简单,cookie里带上token的值就可以了
需要特别注意的是,这一步发生在获取验证码图片的过程中,所以同时得到了bigImage和smallImage这两个参数。
凭着你的经验,就可以猜到,这应该是两张图片经过base64编码以后的字符串。
大的是有缺口的背景图,小的是滑块。
既然是验证码,肯定是这个过程会产生某个我们需要的参数,比如轨迹,坐标或者距离之类的,我们暂时按下不表。
step2.3 我们先来看下一步,验证通过的这一步,也就是产生sign(params)值的这一步。
请求的参数有两个,key就是前一步得到uuid,那么value是什么呢?
结合之前我们对验证码部分的假设,看着最像的应该是距离吧(轨迹和坐标的数据格式看着不像)
提出假设,就正面论证一下吧。
这里主要用到图像方面的知识,计算这种缺口距离的方法,百度一搜一大把,我就不展开讲了,直接上代码了
step3:
至此,三个参数就都拿到了,剩下的就是传参,发请求,拿到我们需要的数据了。
总结:
此网站相对来说还是中规中矩的,没有什么js混淆和烧脑的验证码,重在平时js逆向时的一些知识积累。比如对整个请求过程的宏观分析,对图片验证码可能出现的格式及验证后的结果处理,对常见算法的敏感,还有对一些参数的大胆假设。