Featured image of post 浏览器调试基础

浏览器调试基础

浏览器调试基础

学习起因,接了几个银行的众测,请求包返回包全是加密,压根下不了手,于是学起了前端JS逆向

1.Elements—元素

在Elements元素中比较重要的是复制选中元素的属性或XPath,修改选中元素的执行状态,和断点设置

Elements元素中,样式指的是网站的CSS样式,事件监听器和Dom断点

2.Network—网络请求

Ctrl+F打开搜索页面

比较重要的点过滤条件,可以筛选请求网站时加载的图片,CSS,JS脚本等文件

响应状态码,响应类型,启动器表示是你自己发起的请求还是浏览器发起的请求或者JS发起的请求

右键这些请求,有以下选项

3.Source—源代码

Ctrl+SHift+F—打开搜索页面

3.1.Js断点

网络—过滤器选择JS—将你想要调试的JS在来源面板中打开

在行号前可以打上断点,右侧窗口前会显示当前浏览器打上断点的行数,右键可以取消断点

当你打上断点后再次刷新页面,此时网站回调到这个JS所打上断点的地方,点击箭头是指跳过当前断点运行下一个断点,你也可以步入方法。逐条语句进行分析

Console设置为这样

4.断点详解

断点有DOM断点,XHR(XML Http Request)断点,代码行断点,代码断点,在代码中输入debugger即可打上断点,异常捕获断点

1
2
3
4
5
6
7
8
1.加载html/js/css
2.运行JS初始化
3.用户点击触发某个事件
4.调用某段JS代码
5.前端加密函数
6.XHR-send给服务器发送信息
7.接收服务端响应
8.解密函数渲染网页

4.1.DOM断点与DOM事件断点

缺点:由于是用户点击某个事件触发断点,距离加密函数较远,需要调试很多不,无法根据栈去快速定位

打开F12—选择你需要下断点的按钮或者其它元素—如何判断是否断点成功,就是看元素是否发生改变,如果没发生改变那就没成功

没成功案例:

成功案例

https://netauthtest.geovis.com.cn/portal/login/welcome 其它登录方式处下断点

DOM事件断点

前面和DOM断点一样,选择你要下段的按钮或元素,点击事件监听器,查看该JS文件

即可跳转到按钮事件的监听器处

4.2.XHR断点

执行顺序靠后,距离加密函数较近,可以根据栈进行定位,非XHR请求断不住

xhr断点如何下呢?选择network,选中类型为xhr的类型,

根据请求URL的路径进行下断点,如下面这个登录路径,我可以提取出公共路径

1
2
3
4
https://netauthtest.geovis.com.cn/user/ignore/portal/get/findpwdcheck?property=mobile&val=19818530073&token=1757301990829


user/ignore/portal/get/findpwdcheck?property=mobile

在source—xhr断点—根据路径新增一条断点即可

此时点击发送请求即可断住

5.方法栈(方法的调用流程)

什么是方法栈,栈是一种数据结构,遵循先进后出原则,在断点后,调用堆栈中

5.1.跟值的技巧

这里还是以https://netauthtest.geovis.com.cn/portal/login/welcome该网站的静态登录作为示例,只是示例,不构成任何攻击行为,抓包后发现密码被加密了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
POST /ssoserver/get/authentication/commonuserlogin?random=ngyhlxfl&token=1757312023807 HTTP/2
Host: netauthtest.geovis.com.cn
Cookie: loginType=passaccount; VALIDATECODE=VALIDATECODE-H0fpmvnjcscSZ2AR; ADMIN_VALIDATECODE=ADMIN_VALIDATECODE-B4v3B1oZoX5Oh9gA; RANDOM=RANDOM-ngyhlxfl
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 891
Origin: https://netauthtest.geovis.com.cn
Referer: https://netauthtest.geovis.com.cn/portal/login/welcome
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers

randTxt=44077a763c84415f8191525b2f07a071&tempNo=2&adminloginsign=&loginmode=web&sign_value=&randomNumber=280765&logintype=passaccount&samlRequest=&relayState=&action=login&responseType=&redirect_Uri=&state=&clientId=&display=&redirectUrl=&service=&facephoto=&facedynamicPwd=&otherPwd=&language=zh_CN&checkCode=&selectAutheLevel=&builtindynamicpwdIsOpen=true&fingerPhoto=&credential=&enableUeba=false&username=zhangsan&password=207CF410532F92A47DEE245CE9B11FF71F578EBD763EB3BBEA44EBD043D018FB&passwordsm2=04dd8fcca9ded300b2b64e9f67773dfa9caebdcacb1ec4e6a7ec93d131ef79f1697d05d3b7e777f22a48e2be0d5572ae66b8f9b5e375ff3395d899a21a12228c342c49c74ef2bcad049797a739d2893a995f9085f4be4135d39e04b60ed4021002e6639ca73dbb&temporaryaccountPwd=&dynamicPwd=&userEmail=&checkEmailCode=&userPhone=19818530073&checkPhoneCode=1111111&isOpenValidate=0&validateType=0&validateCode=&slidervaliderval=&sliderCode=

如果没有这个提示词需要按下Ctrl键,如何定位最近的调用函数,就是看提示词从哪开始就是那个调用函数

xhr断点永远只会断到send,send里面大概率有我们请求包数据,就是那个data,如果没有数据,找这个r.send()里面找这个open,鼠标悬停到r上就行,全局搜这个open即可,如果还没有数据那就要hook了

那如何找到加密函数呢,现在data里面的值是加密值,加密过程是明文---加密函数---加密值,那么我们就要去找到明文值这,就要跟栈

跟栈的小技巧,我们可以看到栈中很多jqueryxxx.js的,这些大概率不用跟,因为Jquery是一个前端框架,没人会将加密代码写到现有框架中,我们跟到loginsubmit这个栈发现完整加密代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function loginSubmit(){
	if(!allowSend){
		return;
	}
	var loginType = document.getElementById("loginType").value;

	if(loginType.indexOf("passaccount") != -1){
		var pwd = $("#pwd").val();
		//sm3加密
		var dataBy = Hex.utf8StrToBytes(pwd);
		var sm3 = new SM3Digestt();
		sm3.update(dataBy,0,dataBy.length);//数据很多的话,可以分多次update
		var sm3Hash = sm3.doFinal();//得到的数据是个byte数组
		var sm3HashHex = Hex.encode(sm3Hash,0,sm3Hash.length);//编码成16进制可见字符
		pwdsm3 = sm3HashHex;

		//开启SM2加密
		if(cipherflag==1){
			var password = CryptoJS.enc.Utf8.parse(pwd);
			var pubkeyHex = "0487997a974768450f7e0d75db6a897b4460ecd1d3ca935dd9ce14465b55ed617218eb911beb86c8cb6a78e753b1168f4b4800803585a6f5924b7063ea8ba22c8f";
			if (pubkeyHex.length > 130) {
				pubkeyHex = pubkeyHex.substr(pubkeyHex.length - 130);
			}
			var cipher = new SM2Cipher("1");
			var userKey = cipher.CreatePoint(pubkeyHex);
			password = cipher.str2Bytes(password.toString());
			pwdsm2 = cipher.Encrypt(userKey, password);
			$("input[name=passwordsm2]").val(pwdsm2);
		}
		$("input[name=password]").val(pwdsm3);
	}

直接使用AI进行分析

1
2
找加密函数
如encryptencodedecodekeyAESRSAdata
By Lsec
最后更新于 Sep 10, 2025 00:27 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ