免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3390 | 回复: 2
打印 上一主题 下一主题

网络安全从自身做起 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-18 08:55 |只看该作者 |倒序浏览
前天下午刚刚下班回家,打开电脑刚想过两把Wow瘾。QQ头像就在不断的狂闪,是死党的“求救”消息。\r\n事情还得从头说起,两年前死党搞了一个网站,在经过一番的苦心经营之下,网站现在也算不错。可谁知。近日,网站被人换了首页,东西被改的乱七八糟。我看过之后 ,感受只有一个字“惨”!程序是死党自己写的,用的是.net。经过对网站一番“测试”之后发现罪魁祸首是出在程序代码上。死党的网站其实在其他方面做的都还算不错,之所以被搞了,都要“归功”于他的登录页面程序对特殊字符过滤不严,其实就根本没有过滤。下面是登录页面的代码:\r\n<%@ Import NameSpace=”System.Data.SqlClient”%>\r\n<html>\r\n<body>\r\n<h1>Please Log In</h1>\r\n<hr>\r\n<form runat=”server”>\r\n<table cellpadding=”8”>\r\n<tr>\r\n<td>User Name:>/td>\r\n<td>\r\n<asp:TextBox ID=”UserName” RunAt=”server”/>\r\n</td>\r\n</tr>\r\n<tr>\r\n<td>Password:</td>\r\n<td>\r\n<asp:TextBox ID=”Password” TextMode=”Password” RunAt=”server” />\r\n</td>\r\n</tr>\r\n<tr>\r\n<td>\r\n<asp:Button Text=’Log In”OnClick=”OnLogIn” RunAt=”server” />\r\n</td>\r\n<td></td>\r\n</tr>\r\n</table>\r\n</form>\r\n<hr>\r\n<h3><asp:Label ID=”Output” RunAt=”server” /></h3>\r\n</body>\r\n</html>\r\n<script language=”C#” runat=”server”>\r\nVoid OnLogin (Object sender,EventArgs e)\r\n{\r\nIf (Authenticate (UserName.Text,Password.Text))\r\nOutput.Text=”Welcome,”+UserName.Text + “!”;\r\nelse\r\nOutput.Text = “Please Do It Again”;\r\n}\r\nBool AuThenticate (string username,string password)\r\n{\r\nsqlConnection connecton = new SqlConnection (“server=localhost;datavase=wevlogin;uid=sa”);\r\ntry{\r\nconnection.open;\r\nstring cmdtext=Sring.Format(“select count (*) from users where “ + “username=\\`{0}\\` and cast (password as “+ “varbinary)=cast (\\`{1}\\` as varbinary)”,usrname,password);\r\nSqlCommand command = new SqlCommand (cmdtext,connection);\r\nInt count = (int ) command.ExecuteScalar;\r\nReturm (count>0);\r\n}\r\nFinally{\r\nConnection.close’\r\n}\r\n}\r\n</script>\r\n从这段代码中我们可以看出网站使用的数据库是SQL Server,数据库名称是“Web login”,生成数据库的代码如下:\r\nCREARE DATABASE WebLogin\r\nGO\r\nUSE WebLogin\r\nCREATE TABLE User (UserName varchar(32) NOT NULL,Password varchar(32) NOT NULL)\r\nGO\r\nINSERT INTO users (UserName,Password)\r\nVALUES (`dantiaowangzi`.`15959515`)\r\nINSERT INTO users(UserName,Password)\r\nVALUES (`qwe`,`zxcvbn`)\r\nGO\r\n\r\n从代码中我们可以看出数据库中包含一个“User”表用于保存“username/password”对。其中对于用户输入凭证是否有效是通过对“Users”表执行命令“SELECT COUNT”来验证的。其实,这段代码对于攻击者来说完全是敞开的。如果我们以用户名“dantiaowangzi”,密码“15959515”登录,则就进行如下查询:\r\n\r\nSELECT COUNT (*) WHERE UserName=`dantiaowangzi` AND CAST(Password) AS VARBINARY=CAST(`15959515`) AS VARBINARY\r\n\r\n在这次查询中,如果在表“Users”中存在匹配的“username/password”对,就返回1,否则就返回0。(0,1为符合查询的标准规定记录条数)。如果成功就通过验证,用户就来到了正常的Welcome界面,否则看到的就是“Please Do It Again”消息。\r\n此刻,相信肯定有朋友在想这段代码很正常吗,没有什么问题啊?其实不然,记得当时死党开始时的态度也很坚定,还和我打赌。随后,当我在以“` OR 1=1 - -“不费吹灰之力进入网站后台的时候,他的眼睛瞪的比青蛙还大。为什么?刚才当我输入“` OR 1=1 - -“的时候,登录页面对数据库中的“Users”表进行了如下查询:\r\n\r\nSELECT COUNT (*) WHERE UserName=`` OR 1=1-- ` AND CAST (Password) AS VARBINARY=CAST(``) AS VARBINARY\r\n\r\n我们可以看出上面的查询中,SQL执行布尔运算:“User Name=``”为False,”1=1”为True。因为”True OR False = True”,所以查询的用户名结果就为 True。至于密码处,由于我们加了” - - “符号,所以 “ - - “后面的语句都被我们给注释掉了,根本不起任何作用。既然,能轻易登录后台,加之死党后台的功能又特别强大。”哈哈!”教训啊!既然说到这里了再顺带的提一句,其实这里还有一招更狠的。大家看这句:” ` OR 1=1;DROP TABLE USERS - - “,把它如果放到用户名输入框中,看看会有什么发生。\r\n\r\nSELECT COUNT (*) WHERE UserName=`` OR 1=1--;DROP TABLE USERS-- ` AND CAST (Password) AS VARBINARY=CAST (``) AS VARBINARY\r\n\r\n简简单单几行代码就把Users表给干掉了。\r\n上面之所以会出现这种情况,很大的一个原因是由于程序中缺少了对特殊字符的判断、过滤;同时,另外一个重要原因就是由于登录程序中对数据库的访问操作使用了系统管理员权限。其实这些还都是直接原因,最根本的原因还是因为写程序的人安全意识单薄或者说就根本没有安全意识。\r\n好了,问题的原因已经找到,下面的任务当然就是“亡羊补牢”了。下面是我修补过的代码:\r\n<%@ Import NameSpace=”System.Data”%>\r\n<%@ Import NameSpace=”System.Data.SqlClient”%>\r\n\r\n<html>\r\n<body>\r\n<h1>Please Log In</h1>\r\n<hr>\r\n<form runat=”server”>\r\n<table cellpadding=”8”>\r\n<tr>\r\n<td>User Name:</td>\r\n<td>\r\n<asp:TextBox ID=”UserName” RunAt=”server”/>\r\n</td>\r\n<td>\r\n<asp:TequiredFieldValidatorControlToValidata=”UsersName”\r\nErrorMessage=”Please enter a user name”\r\nDisplay=”dynamic”\r\nRunAt=”server”\r\n/><!__为“User Name”TextBox控件配备一个“TequiredFieldValidator”方法,以便更好的测定用户名\r\n<asp:TegularExpressionValidatorControlToValidate=”UsersName”\r\nValidationExpression=”[a-zA-Z0-9]*”\r\nEorrorMessage=”Invalid user name”\r\nDisplay=”dynamic”\r\nRunAt=”server”\r\n/><!—\r\n\r\n代码中使用了”Regular ExpressionValidator”这个方法,它的作用是对输入的用户名进行判断、过滤。如果在输入的用户名中含有除数字、英文字符以外的任何字符时,都将不能通过。这样一来,“` OR 1=1 - - “自然就给过滤了。\r\n</td>\r\n</tr>\r\n<tr>\r\n<td>Password:</td>\r\n<td>\r\n<asp:TextBox ID=”Password” TextMode=”Password” RunAt=”server”/>\r\n</td>\r\n<td>\r\n<asp:RequiredFieldValidatorControlToValidate=”Password”\r\nErrorMessage=”Please enter a password”\r\nDisplay=”dynamic”\r\nRunAt=”server”\r\n/><!—同样为”Password”TextBox控件配备一个”RequiredFieldValidator”方\r\n<asp:RegularExpressionValidatorControlToValidate=”Password”\r\nValidationExpression=”[a-zA-z0-9]{8,}”\r\nErrorMessage=”Invalid password”\r\nDisplay=”dynamic”\r\nRunAt=”server”\r\n/><!--使用”RegularExpressionValidator”方法对密码进行过滤:除了密码只能使用英文、数字字符,还要求密码长度至少要8个字符,以阻挡使用空密码对网站的攻击-- >\r\n</td>\r\n</tr>\r\n<tr>\r\n<td>\r\n<asp:Button Text=”Log In” OnClick=”OnLogIn’ RunAt=”server”/>\r\n</td>\r\n<td></td>\r\n</tr>\r\n</table>\r\n</form>\r\n<hr>\r\n<h3><asp:Label ID=”Output” RunAt=”server”/></h3>\r\n</body>\r\n<./html>\r\n<script langage=”C#” runat=”server”/></h3>\r\nVoid OnLogIn (Object sender,EventArgs e)\r\n{\r\nIf (Authenticate (UserName.Text,Password,Text))\r\nOutput.Text = “Welcome,”+UserName.Text + “!”;\r\nElse\r\nOutput.Text = “Please Do It Again”;\r\n}\r\nBool AuThenticte (string username,string password)\r\n{\r\nIf(!Page.IsValid)\r\nReturn false;\r\nsqlConnection connection = new SqlConnection (“server=localhost;”+”database=weblogin;uid=safeuser;pwd=safeuser”);\r\n//使用”Safeuser”帐户代替系统管理员帐户访问数据库\r\ntry {\r\nconnection.open();\r\nSqlCommand(“proc_IsUservalid”,connection);\r\n//在执行”SELECT COUNT”命令是,使用”proc_IsUservalid”存储过程。这种存储过程不仅速度快,而且还提供了附加的安全性。即使非法用户名通过了验证,在存储过程中也会返回0\r\ncommand.CommandType=CommandType.Storedprocedure;\r\ncommand.Parameters.Add(“@UserName”,username);\r\ncommand.Parameters.Add(“@Password”,password);\r\nint count = (int) command.ExecuteScalar();\r\nreturn (count>0):\r\n}\r\nfinally{\r\nconnection.close();\r\n}\r\n}\r\n</script>\r\n\r\n光上面的这些修补还不够,我们还要对其生成数据库的代码进行修改,修改过后的代码如下:\r\n\r\nCREATE DATABASE WebLogin\r\nGO\r\nUSE WebLogin\r\nGO\r\nCREATE TABLE User (UserName varchar(32) NOT NULL,Password varchar(32) Not NULL)\r\nGO\r\nINSERT INTO users (UserName,Password)\r\nVALUES (`dantiaowangzi`,`15959515`)\r\nINSERT INTO users (UserName,Password)\r\nVSLUES (`qwe`,`zxcvbn`)\r\nGO\r\nCREATE PROCEDURE proc_IsUserValid @UserName Varcar(32), @Password Varchar (32) AS SELECT COUNT (*) FROM Users WHERE UserName = @UserName AND CAST (Password AS VarBinary)=CAST (@Password AS VarBinary)\r\nGO\r\nEXEC sp_addlogin `SafeUser`,`safeuser`,`WebLogin`\r\nGO\r\nEXEC sp_grantdbaccess `SafeUser`\r\nGO\r\nGRANT EXECUNTE ON proc_IsUserValid To SafeUser\r\n/*这个”Safeuser”帐户只用调用”proc_IsUserValid”的权限。除此之外,没有”DROP TABLE”等任何其他权限*/\r\nGO\r\n\r\n终于在经过两个小时的忙碌之后可以松口气了,死党僵硬了的面孔也有了生机。其实,这篇文章并没有什么高的技术含量,写出来的主要目的是为了给那些安全意识单薄和根本就没有安全意识的朋友们一个提醒。\r\n最后,还是那句老话:“安全无处不在”。

论坛徽章:
0
2 [报告]
发表于 2007-06-18 09:42 |只看该作者
我看这个东东在众多政府网站上都有

论坛徽章:
0
3 [报告]
发表于 2007-06-18 14:25 |只看该作者
原帖由 糊涂李 于 2007-6-18 09:42 发表 \r\n我看这个东东在众多政府网站上都有
\r\n现在那些表情是不是都没了.发不出来.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP