目录
js逆向入门之简概&实例--MD5
爬虫:
爬虫流程:
逆向js原因:
网站反爬:
什么是MD5?
js加密特征:
练习开始
正常请求
加post请求
伪装加U-Sign参数
伪装加Content-Type参数
请求参数变字符串
代码实现:
真逆开始
补充知识点:
代码
免责声明:
本文只做技术交流,学习,请知法守法,切勿用于其它违法行为.
js逆向入门之简概&实例--MD5
爬虫:
怎么,还不会爬虫?
其实简简单单啦!
爬虫流程:
找url 发请求 拿响应 数据解析 数据保存
但是我们的虫子(浏览器)也不总是万能的,比如碰上了大佬(大公司)就不好用了.
总是被反爬,所以我们就需要逆向js了.
逆向js原因:
爬虫程序向目标url发请求的过程中,如果遇到了某些加密的数据,需要去观察浏览器中是如何生成的这份数据。 爬虫代码去模拟这个规则,再发请求。
为什么需要逆向呢?因为我们平时发请求时所携带的参数或默认不带,已经不能满足服务端了,
服务端看不懂,不会返回我们想要的数据.
--如图蓝字,我们平时的参数被加密了,传到server,然后server识别我们的参数, 它可能解密返回,也可能直接返回数据.
--总之,你的请求参数(内容)需要被server看懂.
网站反爬:
--当正常的爬虫流程不能获取到我们想要的数据,就要考虑是不是被反爬了.
html:网页结构(建筑工程师) css:美化工程师(设计工程师) js: 对网页的一些操作做设置 逆向js,由结果往前推的过程,得到这些结果需要哪些条件,准备好这些条件,用代码模拟浏览器js生成结果的过程. 难点:如何找到js代码的加密位置. 网站是如何去进行加密的: 加载html---》css---》js--》js初始化---》触发某个事件---》调用某个js代码---》执行代码---》给服务端发请求 ----》拿到服务端的响应---》解密---》页面进行渲染
来了,来了,逆向它来了~
什么是MD5?
MD5值_360百科
MD5_百度百科
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。 1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。 ----------- MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途
总之,哔哔一大些就是它更安全.
js加密特征:
--其它代码的实现也有,点链接自己找.
这谁顶得住,这么高级.
练习开始
练习网址: 某志愿(3)
鼠标滚轮往下滑,清析可见,他是异步加载方式,所以我们按F12--->找到XHR--->刷新界面,找到数据.
POST请求方式.
载荷查看参数.
正常请求
--简单的爬取,发现 身份授权失败.
加post请求
--我们把载荷的参数加上去,发现也不行. ---身份授权失败.
所以,我们分析一下数据包.
伪装加U-Sign参数
以不变应万变.
这里每个包的U-Sign参数都不一样,所以我们带上看看.
...还是不行.
伪装加Content-Type参数
post请求不一定都是一样的.
有一些是请求载荷,有一些是表单数据.
所以,发请求的时候也要做一些改变.
找请求头,一个参数: Content-Type: application/json
正常情况下,我们把参数一带,就能拿到数据;这里拿不到,显然不是默认的(表单数据).
所以,我们要自己改(加)content-type.
...发现还是不行.
请求参数变字符串
不要慌~~
由上面可知,我们的请求类型变了 Content-Type: application/json
所以啊,这里我们的data要变成字符串类型.(字典--->字符串)
--拿下!
代码实现:
import requests url= 'https://' headers= {'User-Agent': '', #发送请求过程中,有u-sign请求头是变化的,每一页的值不一样,意味着如果我们想要用爬虫做分页,就需要先解决这个问题. 'U-Sign': '37635b63e0f1973c61b1444983eab1be', #表单参数和请求载荷有区别,观察请求头中的Content-Type. 'Content-Type': 'application/json' } #请求参数: data=参数值 data = '{"keyword":"","provinceNames":[],"natureTypes":[],"eduLevel":"","categories":[],"features":[],"pageIndex":5,"pageSize":20,"sort":11}' res = requests.post(url,headers=headers,data=data) print(res.text)
--竟然有数据做加密了,那就准备好逆吧.
真逆开始--逆向分析过程
根据加密字段名进行搜索.(关键字-->全局搜索)
.js就比较重要.
vue jquery axios react... #框架一般就不用看了.
--这里我们就借助谷歌浏览器的插件了.
--发现相同的关键字很多,所以我们打断点,再刷新页面.
只要停住了,就说明引用了此段代码.
不然没有效果.
--发现此段js代码停住了,那就是我们要找的.
e.url ---> "/youzy.dms.basiclib.api.college.query" o(e.url, e.data) ----> "643ff9499febb3ee34c95ffe0bb29cb0" #这里就是举个例子而已,与上面的不同.
补充知识点:
开发者工具:
下箭头:进入函数.
上箭头:跳出函数.
栈:
栈:先进后出.(数据结构与算法)
-有执行顺序. --突破点.
def a(): b() def b(): C() def c(): d()
--这里我们进入看看o函数.
打个断点,依次执行看看.
a=载荷值. 进入:--------------> #三目运算: o = Object.keys(a).length > 0 ? "".concat(JSON.stringify(a), "&").concat(i) : "&".concat(i); -------------------------------------------------- if Object.keys(a).length > 0: "".concat(JSON.stringify(a), "&").concat(i) else: "&".concat(i);
--通过在控制台试一下,发现.concat就是个拼接.
"".concat(JSON.stringify(a), "&").concat(i)
json数据在js中也可进行转换.
json字符串--->js对象
js对象--->json字符串
json字符串--->字典
字典--->字符串
--这里我们选中看到,第一个参数它是一个js对象.
第二个参数为&
="{"keyword":"","provinceNames":[],"natureTypes":[],"eduLevel":"","categories":[],"features":[],"pageIndex":1,"pageSize":20,"sort":11}&"
--这里又拼接了一下.
结果: "{"keyword":"","provinceNames":[],"natureTypes":[],"eduLevel":"","categories":[],"features":[],"pageIndex":1,"pageSize":20,"sort":11}&9SASji5OWnG41iRKiSvTJHlXHmRySRp1"
把此结果赋值给了o变量.
o = "{"keyword":"","provinceNames":[],"natureTypes":[],"eduLevel":"","categories":[],"features":[],"pageIndex":1,"pageSize":20,"sort":11}&9SASji5OWnG41iRKiSvTJHlXHmRySRp1"
断点继续往下走.
return o = o.toLowerCase(),
--发现,将o里面的全部变为小写了.
n(o) "4c215c42c1fadead6dc8a382d08df497"
---继续,又调用了n函数,发现n函数的返回值是加密值,所以需要进入n函数看代码逻辑.
进入n函数,发现其代码特征像md5加密.
确定是md5加密.
控制台--调用n函数,随便传数.
然后用在线的md5工具解密.
数值对应则就是MD5...........
行了,铁证如山.
那个u-sign的密文是MD5加密.
跟着断点代码,一步步来就行了.
代码
--这里写循环就欧了~~