国家税务总局全国增值税发票查验平台python实现

之前去一家公司面试的时候,面试官问到这个网站,所以回来就仔细看了一下。
主要的加密参数就key9和flwq39,其中key9直接全局搜索可以搜出来,flwq39因为关键字被unicode编码转换了所以搜不到,在分析key9的过程中很容易发现。

一 抓包

这个网站按下F12有无线debug 我们可以用以下方式去过掉:
点击consloe在下面输出代码(function(){}).constructor === Function回车;
如果返回的是true,
继续输入Function.prototype.constructor = function(){}并回车;
切换回sources选项卡,点击继续执行,无限debugger的问题就解决了。

二 分析加密参数

随便找个发票输入发票的代码和号码一会就出现验证码,这时候在network面板可以看到yzm开头的一条记录
在这里插入图片描述
点击这条记录可以看到全部的请求参数在这里插入图片描述
经过多次请求分析其中加密参数只有key9和flwq39。这里我们全局搜索key9可以看到两条记录,逐个点进去看上下文就知道'key9': $['nnyd']['yzm'](_0x5bf6a5, _0x11290e, _0x3cf19a)这里就是该请求key9的加密参数。在两个文件定义key9的地方打上断点再次请求可以看到断点断在eab23.js这个文件的key9定义处。在这里插入图片描述
可以看出_0x5bf6a5就是fpdm, _0x11290是fphm, _0x3cf19a是publickey知道了函数的参数,再找到加密函数本体就完活了。
在控制台输入 $[‘nnyd’][‘yzm’]会输出一个函数点进去就来到了这里在这里插入图片描述
Asicssss.prototype.yzm这个函数就是整个key9的加密过程,把它整个复制下来保存为一个js文件,用python调用它,然后看输出缺什么补什么。
在这里插入图片描述
输出和抓包的请求参数对比,一致的话就算完成了。
flwq39是在分析key9的时候看上下文发现的,它们是在同一个文件内,并且有注释。在这里插入图片描述
这个dp就是flwq39找到它的加密函数在

在这里插入图片描述
获取验证码阶段flwq39的加密函数就是yzmQuerySign(),参数settings是一个json的对象{ "url": "https://fpcy.beijing.chinatax.gov.cn:443/NWebQuery/yzmQuery?callback=jQuery36107051621522556655_1693814101308&fpdm=011001900511&fphm=13093557&r=0.690565561546489&v=2.0.14_050&nowtime=1693814871099&publickey=1693814871099&key9=870b774f368aeb012ce0f15244642a4e&_=1693814101310&", "type": "GET", "isLocal": false, "global": true, "processData": true, "async": true, "contentType": "application/x-www-form-urlencoded; charset=UTF-8", "accepts": { "*": "*/*", "text": "text/plain", "html": "text/html", "xml": "application/xml, text/xml", "json": "application/json, text/javascript", "script": "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, "contents": { "xml": {}, "html": {}, "json": {}, "script": false }, "responseFields": { "xml": "responseXML", "text": "responseText", "json": "responseJSON" }, "converters": { "text html": true }, "flatOptions": { "url": true, "context": true }, "jsonp": "callback", "jsonpCallback": "jQuery36107051621522556655_1693814101308", "cache": false, "dataType": "jsonp", "timeout": 5000, "dataTypes": [ "script", "json" ], "crossDomain": true, "jQuery36107051621522556655_1693814101308": true, "hasContent": false }

有用的也就是"url"和"type"。跟key9一样的思路,在控制台输入yzmQuerySign,点击输出的函数可以到在这里插入图片描述

一样的整个复制下来调用,缺什么补什么。url还会用到这个js在这里插入图片描述
这个里面的js代码都是ob混淆过的解密之后就会等到一串代码{ "code": "1100", "sfmc": "北京", "Ip": "https://fpcy.beijing.chinatax.gov.cn:443/NWebQuery", "address": "https://fpcy.beijing.chinatax.gov.cn:443", }, { "code": "1200", "sfmc": "天津", "Ip": "https://fpcy.tjsat.gov.cn:443/NWebQuery", "address": "https://fpcy.tjsat.gov.cn:443", }, { "code": "1300", "sfmc": "河北", "Ip": "https://fpcy.hebei.chinatax.gov.cn/NWebQuery", "address": "https://fpcy.hebei.chinatax.gov.cn", },
到这里就全部完了。
查询的接口也是一样的,只是查询的参数多一些,其中加密的也是key9和flwq,key9是之前全局搜索出来的另一个函数$[‘nnyd’][‘cy’],flwq是vatQuerySign,思路和操作都是一样的。yzmsj是验证码请求返回的key2,index是验证码请求返回的Key3,key6是验证码请求返回包里的Key6。fplx的加密函数是alxd,参数是发票代码。

三 扣js代码时遇到的一些问题及处理方式

  1. execjs._exceptions.ProgramError: ReferenceError: window is not defined 可以在在文件前面加上
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM();
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
  1. execjs._exceptions.ProgramError: ReferenceError: $ is not defined 主要是这个函数$.cs.encode在控制台输入可以输出它的具体函数其实是_0x2d411a,还是复制整个函数,缺什么补什么,最后把$.cs.encode都替换成_0x2d411a就行了。

四 实现

对照发票代码得到地址,算出key9和flwq发送请求得到验证码,手动输入,再带入其他的参数请求查验接口,得到返回结果。
在这里插入图片描述

全部代码
https://download.csdn.net/download/TTXSDEKK/88298883

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无恶不作杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值