Winform下动态执行JavaScript脚本获取运行结果,谈谈网站的自动登录及资料获取操作...

news/2024/5/10 2:28:40/文章来源:https://blog.csdn.net/weixin_34332905/article/details/90195326

为了有效阻止恶意用户的攻击,一般登录都会采用验证码方式方式处理登录,类似QQ的很多产品的验证码处理,但在一些OA系统中,系统通过非对称加密方式来处理登录的密码信息,登录页面每次提供对密码进行加密的公钥是不同的,因此如果要模拟登录,就需要先获取公钥,然后根据公钥把输入的密码加密,然后通过POST提交给服务器进行验证登录。由于公钥是页面刷新变化的,而加密是通过Javascript脚本进行加密,如下面的登录页面源码所示。

 

<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<link rel="stylesheet" type="text/css" href="/templates/2008/index.css"> 
<link rel="shortcut icon" href="/images/tongda.ico"> 
<script src="/inc/js/rsa/jsbn.js"></script><script src="/inc/js/rsa/prng4.js"></script><script src="/inc/js/rsa/rng.js"></script><script src="/inc/js/rsa/rsa.js"></script> 
<script type="text/javascript"> 
function CheckForm()
{
   
var rsa = new RSAKey();
   rsa.setPublic(
"97e256ec6147b7aadc46a353b5c5d707a895b402d114290c0c24a28919507569""10001");
   
try{
      document.form1.PASSWORD.value 
= rsa.encrypt(document.form1.PASSWORD.value);
   }
   
catch(ex){
      
return false;
   }
   
return true;
}
</script> 
</head> 
 
<body onload="javascript:document.form1.PASSWORD.focus();"> 
<br> 
<br> 
<br> 
<br> 
 
<div align="center"> 
<form name="form1" method="post" action="logincheck.php" autocomplete="off" onsubmit="return CheckForm();"> 
 
  
<table cellspacing="0" cellpadding="0" align="center"> 
    
<tr class="img_field"> 
      
<td align="center"><img src="/attachment/2090997160/index_1.jpg" width="651" height="241"></td> 
    
</tr> 
    
<tr height="37" class="login_field"> 
      
<td align="center"> 
        
<b>用户名</b> <input type="text" class="text" name="UNAME" size="15" onmouseover="this.focus()" onfocus="this.select()" value=""> 
        
<b>密码</b> <input type="password" class="text" name="PASSWORD" onmouseover="this.focus()" onfocus="this.select()" size="15" value=""> 
<select name="UI"> 
            
<option value="0">标准界面</option></select> 
         
&nbsp;<input type="submit" name="submit" class="submit" value="登 录"> 
      
</td> 
    
</tr> 
  
</table> 
  
<br> 
  
</form> 

为了模拟登录,我们需要先获取页面的公钥信息,然后通过在C#中运行Javascript脚本,传递公钥和明文密码,然后获取脚本加密的结果,再提交给服务器处理。

如下面代码所示,获取公钥就是分析HTML源码,通过正则表达式匹配即可获取到,相对比较简单,但是要获取Javascript脚本的运行结果,就需要花点功夫了。

                    ///inc/js/rsa/jsbn.js /inc/js/rsa/prng4.js /inc/js/rsa/rng.js /inc/js/rsa/rsa.js
                    string scriptUrl = "http://www.abc.cn:8080/inc/js/rsa/jsbn.js";
                    
string scriptUrl2 = "http://www.abc.cn:8080/inc/js/rsa/prng4.js";
                    
string scriptUrl3 = "http://www.abc.cn:8080/inc/js/rsa/rng.js";
                    
string scriptUrl4 = "http://www.abc.cn:8080/inc/js/rsa/rsa.js";
                    
string referen = "http://www.abc.cn:8080";
                    HttpHelper helper 
= new HttpHelper();
                    helper.Encoding 
= Encoding.Default;

                    
string mainContent = helper.GetHtml(referen, cookie, referen);

                    
string regex = "rsa.setPublic\\(\"(?<publicKey>.*?)\",\\s*\"(?<encrypt>.*?)\"\\);";
                    Regex re 
= new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                    Match mc 
= re.Match(mainContent);
                    
if (mc.Success)
                    {
                        
string publicKey = mc.Groups["publicKey"].Value;
                        
string encrypt = mc.Groups["encrypt"].Value;
                        
string pass = config.AppConfigGet("ContactPassword");

                        
string source = "";//"var appName = \"Microsoft Internet Explorer\"; " + Environment.NewLine;
                        source += helper.GetHtml(scriptUrl);
                        source 
+= helper.GetHtml(scriptUrl2);
                        source 
+= helper.GetHtml(scriptUrl3);
                        source 
+= helper.GetHtml(scriptUrl4);
                        
//source = source.Replace("navigator.", "");
                        source = getJS(source);

                        encryptPass 
= scriptEngine.Eval("getRSAKey()",
                                             source 
+
                                             
"\r\nfunction getRSAKey(){\r\nvar RSA = new RSAKey();\r\nRSA.setPublic(\"" +
                                             publicKey + "\",\"" + encrypt + "\");\r\nvar Res = RSA.encrypt('" + pass + "');\r\nreturn Res;\r\n}").ToString();


                    } 
                    
#endregion

 上面的运行Javascript脚本,需要先把用到的脚本全部下载,把内容组合起来,然后添加一个虚拟的函数,运行得到返回结果接口,虚拟的函数一定要写正确,否则出来很多错误,得不到结果。

 上面的代码有source = getJS(source);这一句,是为了避免脚本调用navigator.appName来处理浏览器类型和版本的判断,有两种方式可以跳过这个处理,一个增加一个appName的变量,如var appName =**这样,然后统一替换navigator. 的字符,使得脚本判别浏览器代码失效;二是通过正则表达式替换掉响应的判断代码即可

         private string getJS(string strJS)

        {
            
if (!Regex.IsMatch(strJS, @"if\(j_lm \&\& \(navigator.appName == ""Microsoft Internet Explorer""\)\) {.+?dbits = 28;.+?}", RegexOptions.Singleline) ||
                
!Regex.IsMatch(strJS, @"if\(navigator.appName == ""Netscape"" && navigator.appVersion < ""5"" && window.crypto\) {.+?}", RegexOptions.Singleline))
            {
                
return string.Empty;
            }

            strJS 
= Regex.Replace(strJS,
                                     
@"if\(j_lm \&\& \(navigator.appName == ""Microsoft Internet Explorer""\)\) {.+?dbits = 28;.+?}",
                                     
"BigInteger.prototype.am = am2;\r\ndbits = 30\r\n", RegexOptions.Singleline);
            strJS 
= Regex.Replace(strJS,
                                     
@"if\(navigator.appName == ""Netscape"" && navigator.appVersion < ""5"" && window.crypto\) {.+?}",
                                     
string.Empty, RegexOptions.Singleline);
            
return strJS;
        }

得到处理过的密码密文 ,一般通过POST方式提交登录页面,即可完成系统的登录了,然后继续可以通过HttpRequest方式获取系统各种页面的信息了(如联系人等),如下面所示。

             string referen = "http://www.abc.cn:8080/";

            string loginUrl = "http://www.abc.cn:8080/logincheck.php";
            
string login = "test";
            
string loginPostData = string.Format("UNAME={1}&PASSWORD={0}&UI=0&submit={2}", encryptPass, login, "%B5%C7+%C2%BC");

            
string conctactUrl = "http://www.abc.cn:8080/general/ipanel/user/search.php";
            
string itemRegex = "<tr\\s*class=\"TableLine\\d\">\\s*(.*?)\\s*</tr>";
            
string memberRegex = "<td.*?>\\s*(.*?)\\s*</td>";

            List
<ContactInfo> contactList = new List<ContactInfo>();
            HttpHelper helper 
= new HttpHelper();
            helper.Encoding 
= Encoding.Default;

            
string result = helper.GetHtml(loginUrl, cookie, loginPostData, true"", loginUrl);

 最后程序处理登录后,自动获取联系人的界面效果如下所示:

 

 除了上面的操作方式,还有一种途径是通过WebBrowser控件实现数据的自动提交,WebBrowser控件处理脚本的运行更加方便,但缺点是这个控件相对较慢,首先我介绍一下这种方式,在按钮触发中调用控件的Navigate函数,打开相应的登录链接地址。

webBrowser1.Navigate("http://www.abc.cn:8080");

接着在浏览器控件的页面完成函数处理中对数据进行处理,处理的思路就是调用脚本对输入的内容进行加密,然后再触发提交按钮即可完成页面的登录,记录登录的信息,然后再去获取相关的页面内容信息,不过这种控件处理相对没那么大的弹性处理,不过可以作为一些功能的补充使用。

        private int numtries = 0;
        
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            
if (webBrowser1.Document.GetElementById("UNAME"!= null)
            {
                webBrowser1.Document.GetElementById(
"UNAME").SetAttribute("value""陈建才");
                webBrowser1.Document.GetElementById(
"PASSWORD").SetAttribute("value""voowoo770916");

                
if (numtries < 2)
                {
                    IHTMLWindow2 login 
= (mshtml.IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
                    
//login.execScript("document.forms[0].submit();", "javascript");
                    login.execScript("CheckForm();""javascript");
                    
string value = webBrowser1.Document.GetElementById("PASSWORD").GetAttribute("value");
                    encryptPass 
= value;

                    GetContact();
                    numtries
++;
                }
            }
            
if (webBrowser1.Document.GetElementById("userName"== null)
            {
                numtries 
= 0;

                
//string cookieString = webBrowser1.Document.Cookie;

                
//CookieCollection cc = new CookieCollection();
                
//CookieManger.SetCKAppendToCC(cc, cookieString, "http://www.abc.cn:8080");
                
//cookie.Add(cc);

            }
        }

 通过浏览器接口,我们可以实现页面内容在不可以见的浏览器控件中呈现,然后获取相应的页面对象或者页面源码进行分析,可以得到更加丰富的数据,模拟浏览器的实际操作和获得真实的显示结果。

本文转自博客园伍华聪的博客,原文链接:Winform下动态执行JavaScript脚本获取运行结果,谈谈网站的自动登录及资料获取操作,如需转载请自行联系原博主。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_716718.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Lucene框架的“虎扑篮球”网站搜索引擎(java版)

1 引言 本次作业完成了基于Lucene的“虎扑篮球”网站搜索引擎&#xff0c;对其主要三个板块---“最新新闻”&#xff08;主要NBA新闻&#xff09;&#xff0c;“虎扑步行街”&#xff08;类似贴吧性质&#xff09;&#xff0c;“虎扑湿乎乎”&#xff08;篮球发帖区&#xff0…

关系抽取-常见问题-Overlap:SEO(SingleEntity, 一实体与多个实体有关系)、EPO(EntityPair,同一对实体有多种关系)、HTO(HeadTail,头尾实体有嵌套/重叠)

SEO&#xff08;SingleEntityOverlap, 一个实体与多个实体有关系&#xff09;、 EPO&#xff08;EntityPairOverlap&#xff0c;同一对实体有多种关系&#xff09;、 HTO&#xff08;HeadTailOverlap&#xff0c;头尾实体有嵌套/重叠&#xff09; 参考资料&#xff1a; 关系抽…

网站统计 开源 java_开源 java CMS - FreeCMS2.8 统计分析

统计分析系统级统计分析&#xff0c;用于统计系统所有数据。工作量统计统计所有用户的工作量。从左侧管理菜单点击工作量统计进入。您可以根据添加人&#xff0c;时间条件进行筛选。并可导出结果为excel文件。站点信息统计统计所有站点的信息量。从左侧管理菜单点击站点信息统计…

sensor曝光量和曝光行的区别_企业SEO,如何利用行业关键词,提高产品曝光量?...

每一个企业&#xff0c;基于网络营销而言&#xff0c;对方都期望&#xff0c;自身的产品能够借助相关营销工具&#xff0c;获得不错的产品曝光量。特别是百度SEO&#xff0c;如果前期你的准备工作不足&#xff0c;你基于搜索所获得的曝光量&#xff0c;总是杯水车薪的。那么&am…

用HTML+CSS编写一个计科院网站首页的静态网页

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计算机科学学院</title><link href"css/bgcss.css" rel"stylesheet"> </head> <body><!--顶部图片部…

社交网站部署——SVN服务器搭建并发布上线

案例概述 某公司的社交网站采用PHP语言开发&#xff0c;为了管理PHP程序员开发的代码&#xff0c;上级领导要求搭建SVN服务器进行版本控制。社交网站的第一个版本部署在LNMP平台之上&#xff0c;前端为Nginx服务器&#xff0c;通过fastcgi协议访问后端的PHP服务器。为了保证数据…

鸿蒙os开发网站,华为鸿蒙系统最新消息,HarmonyOS 应用开发在线体验网站上线

原标题&#xff1a;华为鸿蒙系统最新消息&#xff0c;HarmonyOS 应用开发在线体验网站上线华为的鸿蒙系统从开发之初就受到了大家的广泛关注&#xff0c;从一开始的“备胎”到现在最新的HarmonyOS 2.0版本&#xff0c;华为鸿蒙系统在成长过程中也是经历了不少的波折。今天&…

如何屏蔽https网站,禁止https网站的访问?

HTTPS&#xff08;HTTP over SSL&#xff09;由于其通讯协议的特殊性&#xff0c;域名信息和访问的URL等都处于SSL加密保护下&#xff1b;所以大部分的路由器系统都无法对https网站的域名进行过滤和屏蔽。而诸如WFilter这样的专业级上网行为管理产品&#xff0c;则可以对流量进…

vue项目的seo

2019独角兽企业重金招聘Python工程师标准>>> 不可否定的是&#xff0c;vue现在火。但是在实际项目中&#xff0c;特别是像一下交互网站&#xff0c;我们不可避免会考虑到的是seo问题&#xff0c;这直接关系到我们网站的排名&#xff0c;很多人说用vue搭建的网站不能…

屏蔽复制网站内容时弹出的提示

例如chrome浏览器&#xff0c;在设置里把JavaScript关掉就行了 url地址栏输入chrome://settings/content/javascript?searchjavascript

网站设计HTML——百度 滚筒洗衣机

滚筒洗衣机的效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>滚筒洗衣机销售排行榜</title> </head> <body> <div><h1>滚筒洗衣机销售排行榜</h1><div&g…

linux救援模式使用yum,centos如何进救援模式_网站服务器运行维护,centos

如何解决CentOS7系统ifconfig无法使用的情况_网站服务器运行维护CentOS7系统ifconfig无法使用的解决方法&#xff1a;首先查看“ifconfig”命令所需要的安装包&#xff1b;然后使用“#yum -y install net-tools”命令安装软件&#xff1b;最后使用“ifconfig”查看IP信息即可。…

如何删除ppt自带背景音乐_把网站搬进PPT里是种怎样的体验?

本文总计&#xff1a;2477 字预计阅读时间&#xff1a;10 分钟昨天&#xff0c;我给大家推荐了一个酒类产品的官网&#xff0c;不知道大家看过没。要是没看过的话&#xff0c;也没有关系&#xff0c;因为我用 PPT 把这个网站仿制了一下。保留了主要元素&#xff0c;以及大部分的…

mysql网站中文乱码,关于MySQL中文乱码的完美解决方案

当用客户端或用其他方式连接数据键入中文数据后&#xff0c;在client中的显示为乱码&#xff0c;当然这是字符集设置出现了问题。我先后尝试了很多办法&#xff0c;但依然还是无法在client中显示中文&#xff0c;我尝试在my.ini中修改一下数据在[client]中加入。# Here follows…

php asp.net mvc jsp,IIS部署asp.net mvc网站的方法

iis配置简单的ASP.NET MVC网站&#xff0c;供大家参考&#xff0c;具体内容如下编译器&#xff1a;VS 2013本地IIS&#xff1a;IIS 7操作系统&#xff1a;win 7MVC版本&#xff1a;ASP.NET MVC4sql server版本: 2008 r2打开VS 2013&#xff0c;新建一个MVC项目(Internet版的),然…

特殊日期将网站变成灰色-css滤镜(整理)

一、网站变灰 <!DOCTYPE html> <html> <head> <style> img {-webkit-filter: grayscale(100%);-moz-filter: grayscale(100%);-ms-filter: grayscale(100%);-o-filter: grayscale(100%);filter: grayscale(100%);filter: progid:DXImageTransform.Micr…

tp5怎么做清空网站缓存

首先我们要做的效果如图&#xff1a; 前台代码 <li><a href"{:url(Index/clearCache)}" class"login-area dropdown-toggle"><section><h2><span class"profile"><span><i class"menu-icon fa fa …

nccloud 开发环境访问_比快更快,Github Action + 云开发部署静态网站

Github 为开源项目提供了用于静态页面展示的 Pages 服务&#xff0c;很多开发者都在上面托管了自己的静态网站和博客&#xff0c;不少开源项目的案例和文档页面也采用了这种方式。不过由于 Pages 的 CDN 节点大部分在国外&#xff0c;在国内的访问速度不是很理想&#xff0c;不…

白嫖网站文章复制粘贴

我一看到这种就是特别烦&#xff0c;复制一篇文章就要钱&#xff0c;于是想到了一个好办法 1.首先按F12键&#xff0c;就会弹出如下界面&#xff0c;如果你是开发人员就会秒懂的。 2.点击Console 3.在下方空白输入$0,直接按回车键 , 就可以直接复制文章了&#xff0c;是不是很…

无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。

1.使用VS2015运行项目&#xff0c;选择使用本机iis运行时报错&#xff1a; XXXX 已配置为使用 IIS。 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。 解决方法1&#xff1a; 以"管理员权限"运行VS,在VS菜单打开项目即可。 但是以上解决方法不…