反反爬之绕过新版加速乐
2020-07-28 10:45:34 Author: xz.aliyun.com(查看原文) 阅读量:538 收藏

前置:绕过≠破解,侵删。

昨天在对公司一个项目的渗透测试过程中要爬取用户名进行爆破,该网站部署了加速乐反爬虫平台,像平时一样打开selenium,发现加速乐不知道什么时候又更新了。

先科普一下加速乐,加速乐是知道创宇推出的一款在线免费网站CDN加速、网站安全防护平台。致力于系统化解决网站访问速度过慢及网站反爬虫、反黑客问题。

部署了加速乐的网站,第一次访问时会返回一段加密的js,检查浏览器环境,符合预设才会进一步请求其他资源文件,不符合直接返回521状态码。登录账号后,服务器端返回cookie,包括获取目标数据的关键cookie键jsl_clearance,每二三十分钟后jsl_clearance失效,若用户有其他发起请求数据的操作,本地加密js文件会请求服务器端刷新__jsl_clearance,没刷新时返回521状态码,无法获取目标数据。

一位表哥说过,加速乐加密js文件,js里有dom,js里有星星。

知道创宇的官方网站中有一个叫zoomeye的网站也部署了新版加速乐,就拿zoomeye做演示。

在打开debug模式下,新版加速乐检查浏览器环境是否用户常用环境,不是常用环境返回521状态码。指定了--user-data-dir就是非用户常用环境。

在打开debug模式下,不指定--user-data-dir,返回200。但是我的chromium和chromedriver版本错了,接管不了浏览器。

虽然可以找两个低版本的可用的chromedriver和chromium暂且使用,但是下次项目如果加速乐又更新了,比如每次更新__jsl_clearance检查一遍浏览器环境,或者直接开debug就不给过。这照样会让你在做项目时措手不及,不是长久之计。我只学了一点python皮毛,破解js这样的骚操作不属于我。

所以没有什么比直接读取平时你用的本地浏览器环境里的cookie来得直接,来的无迹可寻。因为在这个过程,就是一个真人在他平时使用的浏览器环境中,大概五分钟点一下刷新,让js刷新__jsl_clearance,再读取本地cookie文件。这个过程不开浏览器debug模式,不模拟浏览器,反爬虫能检测到的就只有五分钟点了一下刷新,不可能把一个这样一个真人判断成机器。

chrome的cookie文件位置在C:/Users/liulangmao/AppData/Local/Google/Chrome/User Data/Default/Cookies

用navicat打开这个sqlite文件,查询telnet404.com网站下的cookie:

SELECT host_key, name, value, path, expires_utc, is_secure, encrypted_value FROM cookies WHERE host_key like "%telnet404.com";

可以看到chrome的本地cookie值是加密过的,解密原理参考https://blog.csdn.net/m0_46146791/article/details/104686060,在此不多做描述。**代码在附件。**

那怎么让网页五分钟自动刷新一次呢?

在不模拟浏览器的情况下,我能想到的就是:
1、console运行js,内嵌iframe定时刷新
2、中转代理注入定时刷新代码
3、调用win32api做出键鼠操作刷新浏览器

先来看第一种方法:
这也是最简单的一种方法,前提是网站有点击劫持漏洞,能让你内嵌iframe。只要稍稍判断一下X-Frame-Options,就能轻松修复。

【题外话:看吧谁说把点击劫持写报告里是羞耻的,这不就成为反爬虫的短板了吗?】

示例代码:

timeout=prompt("Set timeout (Second):");
count=0
current=location.href;
if(timeout>0)
setTimeout('reload()',1000*timeout);
else
location.replace(current);
function reload(){
setTimeout('reload()',1000*timeout);
count++;
console.log('每('+timeout+')秒自动刷新,刷新次数:'+count);
fr4me='<frameset cols=\'*\'>\n<frame src=\''+current+'\'/>';
fr4me+='</frameset>';
with(document){write(fr4me);void(close())};
}

console里运行这段js,就能实现定时刷新。

第二种方法:
搭建中转代理,往资源文件里加一段定时刷新的代码。

示例代码:

<script language="JavaScript">
function myrefresh()
{
   window.location.reload();
}
setTimeout('myrefresh()',300000); //指定300秒刷新一次
</script>

修改资源文件,可以python flask搭个中转服务器改,也可以代理到burpsuite然后在这里改:

修补这一种方法,多进行人机校验才是王道。

第三种方法:
我还没学

0x03、操作流程
操作流程:
打开新窗口登录好账号 --> 设置自动刷新网页 --> 若__jsl_clearance失效,调用get_cookie_from_chrome获取新cookie

运行效果:

参考:
chrome浏览器网页刷新的console代码
https://blog.csdn.net/samt007/article/details/80014071
chrome 80+ sqlite3 cookie 解密
https://blog.csdn.net/m0_46146791/article/details/104686060
python: cookies 解密问题
https://blog.csdn.net/pyyong2011/article/details/105045883


文章来源: http://xz.aliyun.com/t/8030
如有侵权请联系:admin#unsafe.sh