Web开发常见的几个漏洞解决方法
平时工作,多数是开发Web项目,由于一般是开发内部使用的业务系统,所以对于安全性一般不是看的很重,基本上由于是内网系统,一般也很少会受到攻击,但有时候一些系统平台,需要外网也要使用,这种情况下,各方面的安全性就要求比较高了,所以往往会交付给一些专门做安全测试的第三方机构进行测试,然后根据反馈的漏洞进行修复,如果你平常对于一些安全漏洞不够了解,那么反馈的结果往往是很残酷的,迫使你必须在很多细节上进行修复完善。本文主要根据本人项目的一些第三方安全测试结果,以及本人针对这些漏洞问题的修复方案,介绍在这方面的一些经验,希望对大家有帮助。
基本上,参加的安全测试(渗透测试)的网站,可能或多或少存在下面几个漏洞:SQL注入漏洞、跨站脚本攻击漏洞、登陆后台管理页面、IIS短文件/文件夹漏洞、系统敏感信息泄露。
1、测试的步骤及内容
这些安全性测试,据了解一般是先收集数据,然后进行相关的渗透测试工作,获取到网站或者系统的一些敏感数据,从而可能达到控制或者破坏系统的目的。
第一步是信息收集,收集如IP地址、DNS记录、软件版本信息、IP段等信息。可以采用方法有:
1)基本网络信息获取;
2)Ping目标网络得到IP地址和TTL等信息;
3)Tcptraceroute和Traceroute 的结果;
4)Whois结果;
5)Netcraft获取目标可能存在的域名、Web及服务器信息;
6)Curl获取目标Web基本信息;
7)Nmap对网站进行端口扫描并判断操作系统类型;
8)Google、Yahoo、Baidu等搜索引擎获取目标信息;
9)FWtester 、Hping3 等工具进行防火墙规则探测;
10)其他。
第二步是进行渗透测试,根据前面获取到的数据,进一步获取网站敏感数据。此阶段如果成功的话,可能获得普通权限。采用方法会有有下面几种
1)常规漏洞扫描和采用商用软件进行检查;
2)结合使用ISS与Nessus等商用或免费的扫描工具进行漏洞扫描;
3)采用SolarWinds对网络设备等进行搜索发现;
4)采用Nikto、Webinspect等软件对Web常见漏洞进行扫描;
5)采用如AppDetectiv之类的商用软件对数据库进行扫描分析;
6)对Web和数据库应用进行分析;
7)采用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具进行分析;
8)用Ethereal抓包协助分析;
9)用Webscan、Fuzzer进行SQL注入和XSS漏洞初步分析;
10)手工检测SQL注入和XSS漏洞;
11)采用类似OScanner的工具对数据库进行分析;
12)基于通用设备、数据库、操作系统和应用的攻击;采用各种公开及私有的缓冲区溢出程序代码,也采用诸如MetasploitFramework 之类的利用程序集合。
13)基于应用的攻击。基于Web、数据库或特定的B/S或C/S结构的网络应用程序存在的弱点进行攻击。
14)口令猜解技术。进行口令猜解可以采用 X-Scan、Brutus、Hydra、溯雪等工具。
第三步就是尝试由普通权限提升为管理员权限,获得对系统的完全控制权。在时间许可的情况下,必要时从第一阶段重新进行。采用方法
1)口令嗅探与键盘记录。嗅探、键盘记录、木马等软件,功能简单,但要求不被防病毒软件发觉,因此通常需要自行开发或修改。
2)口令破解。有许多著名的口令破解软件,如 L0phtCrack、John the Ripper、Cain 等
以上一些是他们测试的步骤,不过我们不一定要关注这些过程性的东西,我们可能对他们反馈的结果更关注,因为可能会爆发很多安全漏洞等着我们去修复的。
2、SQL注入漏洞的出现和修复
1)SQL注入定义:
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入有时候,在地址参数输入,或者控件输入都有可能进行。如在链接后加入’号,页面报错,并暴露出网站的物理路径在很多时候,很常见,当然如果关闭了Web.Config的CustomErrors的时候,可能就不会看到。
另外,Sql注入是很常见的一个攻击,因此,如果对页面参数的转换或者没有经过处理,直接把数据丢给Sql语句去执行,那么可能就会暴露敏感的信息给对方了。如下面两个页面可能就会被添加注入攻击。
①http://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status0)0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
②http://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects ... tatus0 and name not in('xyz'))0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。
为了屏蔽危险Sql语句的执行,可能需要对进行严格的转换,例如如果是整形的,就严格把它转换为整数,然后在操作,这样可以避免一些潜在的危险,另外对构造的sql语句必须进行Sql注入语句的过滤,如我的框架(Winform开发框架、Web开发框架等)里面就内置了对这些有害的语句和符号进行清除工作,由于是在基类进行了过滤,因此基本上子类都不用关心也可以避免了这些常规的攻击了。
/// summary
/// 验证是否存在注入代码(条件语句)
/// /summary
/// param name="inputData"/param
public bool HasInjectionData(string inputData)
{
if (string.IsNullOrEmpty(inputData))
return false;
//里面定义恶意字符集合
//验证inputData是否包含恶意集合
if (Regex.IsMatch(inputData.ToLower(), GetRegexString()))
{
return true;
}
else
{
return false;
}
}
/// summary
/// 获取正则表达式
/// /summary
/// returns/returns
private static string GetRegexString()
{
//构造SQL的注入关键字符
string[] strBadChar =
{
//"select\\s",
//"from\\s",
"insert\\s",
"delete\\s",
"update\\s",
"drop\\s",
"truncate\\s",
"exec\\s",
"count\\(",
"declare\\s",
"asc\\(",
"mid\\(",
"char\\(",
"net user",
"xp_cmdshell",
"/add\\s",
"exec master.dbo.xp_cmdshell",
"net localgroup administrators"
};
//构造正则表达式
string str_Regex = ".*(";
for (int i = 0; i strBadChar.Length - 1; i++)
{
str_Regex += strBadChar[i] + "|";
}
str_Regex += strBadChar[strBadChar.Length - 1] + ").*";
return str_Regex;
}
上面的语句用于判别常规的Sql攻击字符,我在数据库操作的基类里面,只需要判别即可,如下面的一个根据条件语句查找数据库记录的函数。
/// summary
/// 根据条件查询数据库,并返回对象集合
/// /summary
/// param name="condition"查询的条件/param
/// param name="orderBy"自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序/param
/// param name="paramList"参数列表/param
/// returns指定对象的集合/returns
public virtual ListT Find(string condition, string orderBy, IDbDataParameter[] paramList)
{
if (HasInjectionData(condition))
{
LogTextHelper.Error(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
...........................
}
以上只是防止Sql攻击的一个方面,还有就是坚持使用参数化的方式进行赋值,这样很大程度上减少可能受到SQL注入攻击。
Database db = CreateDatabase();
DbCommand command = db.GetSqlStringCommand(sql);
command.Parameters.AddRange(param);
3、跨站脚本攻击漏洞出现和修复
跨站脚本攻击,又称XSS代码攻击,也是一种常见的脚本注入攻击。例如在下面的界面上,很多输入框是可以随意输入内容的,特别是一些文本编辑框里面,可以输入例如scriptalert('这是一个页面弹出警告');/script这样的内容,如果在一些首页出现很多这样内容,而又不经过处理,那么页面就不断的弹框,更有甚者,在里面执行一个无限循环的脚本函数,直到页面耗尽资源为止,类似这样的攻击都是很常见的,所以我们如果是在外网或者很有危险的网络上发布程序,一般都需要对这些问题进行修复。
XSS代码攻击还可能会窃取或操纵客户会话和 Cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。
[建议措施]
清理用户输入,并过滤出 JavaScript 代码。我们建议您过滤下列字符:
[1] (尖括号)
[2] "(引号)
[3] '(单引号)
[4] %(百分比符号)
[5] ;(分号)
[6] ()(括号)
[7] ( 符号)
[8] +(加号)
为了避免上述的XSS代码攻击,解决办法是可以使用HttpUitility的HtmlEncode或者最好使用微软发布的AntiXSSLibrary进行处理,这个更安全。
微软反跨站脚本库(AntiXSSLibrary)是一种编码库,旨在帮助保护开发人员保护他们的基于Web的应用不被XSS攻击。
编码方法
使用场景
示例
HtmlEncode(String)
不受信任的HTML代码。 a href=”http://www.cnblogs.com”Click Here [不受信任的输入]/a
HtmlAttributeEncode(String)
不受信任的HTML属性
hr noshade size=[不受信任的输入]
JavaScriptEncode(String)
不受信任的输入在JavaScript中使用
script type=”text/javascript”
…
[Untrusted input]
…
/script
UrlEncode(String)
不受信任的URL
a href=”http://cnblogs.com/results.aspx?q=[Untrusted input]”Cnblogs.com/a
VisualBasicScriptEncode(String)
不受信任的输入在VBScript中使用
script type=”text/vbscript” language=”vbscript”
…
[Untrusted input]
…
/script
XmlEncode(String)
不受信任的输入用于XML输出
xml_tag[Untrusted input]/xml_tag
XmlAttributeEncode(String)
不 受信任的输入用作XML属性
xml_tag attribute=[Untrusted input]Some Text/xml_tag
protected void Page_Load(object sender, EventArgs e)
{
this.lblName.Text = Encoder.HtmlEncode("scriptalert('OK');/SCRIPT");
}
例如上面的内容,赋值给一个Lable控件,不会出现弹框的操作。
但是,我们虽然显示的时候设置了转义,输入如果要限制它们怎么办呢,也是使用AntiXSSLibrary里面的HtmlSanitizationLibrary类库Sanitizer.GetSafeHtmlFragment即可。
protected void btnPost_Click(object sender, EventArgs e)
{
this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text);
}
这样对于特殊脚本的内容,会自动剔除过滤,而不会记录了,从而达到我们想要的目的。
4、IIS短文件/文件夹漏洞出现和修复
通过猜解,可能会得出一些重要的网页文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。
[建议措施]
1)禁止url中使用“~”或它的Unicode编码。
2)关闭windows的8.3格式功能。
修复可以参考下面的做法,或者找相关运维部门进行处理即可。
http://sebug.net/vuldb/ssvid-60252
http://webscan.360.cn/vul/view/vulid/1020
http://www.bitscn.com/network/security/200607/36285.html
5、系统敏感信息泄露出现和修复
如果页面继承一般的page,而没有进行Session判断,那么可能会被攻击者获取到页面地址,进而获取到例如用户名等重要数据的。
一般避免这种方式是对于一些需要登录才能访问到的页面,一定要进行Session判断,可能很容易给漏掉了。如我在Web框架里面,就是继承一个BasePage,BasePage 统一对页面进行一个登录判断。
public partial class UserList : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
...............
/// summary
/// BasePage 集成自权限基础抽象类FPage,其他页面则集成自BasePage
/// /summary
public class BasePage : FPage
{
/// summary
/// 默认构造函数
/// /summary
public BasePage()
{
this.IsFunctionControl = true;//默认页面启动权限认证
}
/// summary
/// 检查用户是否登录
/// /summary
private void CheckLogin()
{
if (string.IsNullOrEmpty(Permission.Identity))
{
string url = string.Format("{0}/Pages/CommonPage/Login.aspx?userRequest={1}",
Request.ApplicationPath.TrimEnd('/'), HttpUtility.UrlEncode(Request.Url.ToString()));
Response.Redirect(url);
}
}
/// summary
/// 覆盖HasFunction方法以使权限类判断是否具有某功能点的权限
/// /summary
/// param name="functionId"/param
/// returns/returns
protected override bool HasFunction(string functionId)
{
CheckLogin();
bool breturn = false;
try
{
breturn = Permission.HasFunction(functionId);
}
catch (Exception)
{
Helper.Alerts(this, "BasePage调用权限系统的HasFunction函数出错");
}
return breturn;
}
protected override void OnInit(EventArgs e)
{
Response.Cache.SetNoStore(); //清除缓存
base.OnInit(e);
CheckLogin();
}
否则可能会受到攻击,并通过抓包软件发现页面数据,获得一些重要的用户名或者相关信息。
还有一个值得注意的地方,就是一般这种不是很安全的网络,最好要求输入比较复杂一点的密码(强制要求),例如不能全部是数字密码或者不能是纯字符,对位数也要求多一点,因为很多人输入12345678,123456,123这样的密码,很容易被猜出来并登录系统,造成不必要的损失。
6、总结性建议
针对上面发现的问题,提出下面几条建议。
1)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。
2)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。
3)对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。这些检查或过滤必须在服务器端完成。
4)关闭windows的8.3格式功能。
5)限制敏感页面或目录的访问权限。
网站入侵有N中方法,就是方法名我想也没有一个人能说全
SYN/ACK Flood攻击
TCP全连接攻击
刷Script脚本攻击
获取口令 (比如有的论坛有默认密码帐户,你没有改掉)
电子邮件攻击
特洛伊木马攻击
诱入法
寻找系统漏洞
sql注入
建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。
有条件建议找专业做网站安全的sine安全来做安全维护。
一:挂马预防措施:
1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。
2、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛程
序,只要可以上传文件的asp都要进行身份认证!
3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。
4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。
5、要尽量保持程序是最新版本。
6、不要在网页上加注后台管理程序登陆页面的链接。
7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。
8、要时常备份数据库等重要文件。
9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全!
10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。
11、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具!
二:挂马恢复措施:
1.修改帐号密码
不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。帐号
密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用
SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。
2.创建一个robots.txt
Robots能够有效的防范利用搜索引擎窃取信息的骇客。
3.修改后台文件
第一步:修改后台里的验证文件的名称。
第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。
第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。
4.限制登陆后台IP
此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。
5.自定义404页面及自定义传送ASP错误信息
404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。
ASP错误嘛,可能会向不明来意者传送对方想要的信息。
6.慎重选择网站程序
注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。
7.谨慎上传漏洞
据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。
可以禁止上传或着限制上传的文件类型。不懂的话可以找你的网站程序提供商。
8. cookie 保护
登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。
9.目录权限
请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。
10.自我测试
如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。
11.例行维护
a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。
b.定期更改数据库的名字及管理员帐密。
c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。
网站被挂马一般都是网站程序存在漏洞或者服务器安全性能不达标被不法黑客入侵攻击而挂马的。
网站被挂马是普遍存在现象然而也是每一个网站运营者的心腹之患。
您是否因为网站和服务器天天被入侵挂马等问题也曾有过想放弃的想法呢,您否也因为不太了解网站技术的问题而耽误了网站的运营,您是否也因为精心运营的网站反反复复被一些无聊的黑客入侵挂马感到徬彷且很无耐。有条件建议找专业做网站安全的sine安全来做安全维护。
网站有跨站脚本攻击漏洞:在IIS里增加只接收允许站点的数据提交
SQL注入漏洞(盲注)、SQL注入漏洞等漏洞:基本上都是程序的漏洞,需要将所有接收到参数进行校验,防止被注入
IIS短文件名泄露漏洞:安装IIS相应补丁
随着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 user0 这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user0,我们知道,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错误提示时的验证
我来说两句