本文是CNVD漏洞共享平台的爬虫案例,该网站采用了JSL的主题混淆和加密。
文章内容仅用于学习和技术交流,如有侵权请联系我删除。
@toc
分析接口
先在Application中的cookie处,clear掉现有cookie,然后刷新页面查看数据包。
可以发现,请求时页面加载了三次。
第一次请求,response的cookie中有__jsluid_s,请求失败。
第二次请求,cookie多了一个jsl_clearance_s,请求失败。
第三次请求,cookie的jsl_clearance_s发生了变化,请求成功获得响应。
那我们只要分析好流程,按照这个逻辑进行模拟请求就能解决问题。
第一次请求分析
__jsluid_s 可以通过请求在set-cookie中直接获得。
全局搜索 __jsl_clearance_s ,能找到这段script代码。
但是在浏览器中无法显示响应内容,所以需要用抓包工具或者代码进行请求,查看响应结果。
打开charles,发现返回的是一段经典的字符混淆。
这种混淆很好处理,直接复制到控制台输出就可以。
可以发现返回的是 __jsl_clearance_s的第一次值。
第二次请求分析
那接下来分析第二次请求。
这是一段经典的ob混淆,ob混淆的特征是开头就是大串数组,所以随便找个工具解一下就行。
复制到本地,格式化查看
大概意思就是添加了一个cookie, 那具体是哪个呢,_0x1c3e6f是传进去的参数,_0x1c3e6f['tn']就是上面的jsl_clearance_s,说明执行这里后更新了jsl_clearance_s。
到这里就完了,但是想要本地跑这段代码还需要去补一些环境,比如window = {},window.navigator={}之类的,报啥错就补啥。
所以把JS保存到本地比较方便一点,当然你也可以通过编辑字符串动态去添加环境。
第三次请求分析
第三次请求没什么问题了,携带着前两次生成的cookie即可进行请求。
流程还原
还原的过程中发现了一些问题,不同页面的JS是不一样的,通过ha这个参数控制的,比如首页是sha255,漏洞列表是md5,还有sha1的。
所以说得根据返回的情况进行处理。
代码只是示例了部分,完整的需要去下载
import requests
import re
import execjs
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
url = 'https://www.cnvd.org.cn/flaw/list.htm'
sess = requests.session()
def start():
r =sess.get(url,headers=headers,verify=False)
text = r.text
cookie = re.search('<script>document.cookie=(.*?);location',text).group(1)
x = execjs.eval(cookie).split(';')[0].split('=')
sess.cookies[x[0]] = x[1]
print(x[0],x[1])
def then():
'''获取第二次请求的cookie'''
r1 = sess.get(url,headers=headers,verify=False)
text = r1.text
data = re.search(';go\((.*?)\)</script>',text).group(1)
hash = re.search('"ha":"(.*?)",',data).group(1)
# get_cookie_2是执行JS,完整代码请下载
cookie = get_cookie_2(data,hash).split(';')[0].split('=')
sess.cookies[cookie[0]] =cookie[1]
源码下载
【温馨提示:此处隐藏内容需要付费订阅后才能查看!】