diff --git a/zh/09.4.md b/zh/09.4.md index 4050c750..f2708e3b 100644 --- a/zh/09.4.md +++ b/zh/09.4.md @@ -11,44 +11,44 @@ SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常 考虑以下简单的登录表单: ```html -
-

Username:

-

Password:

-

-
+
+

Username:

+

Password:

+

+
``` 我们的处理里面的SQL可能是这样的: ```Go - username:=r.Form.Get("username") - password:=r.Form.Get("password") - sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'" +username:=r.Form.Get("username") +password:=r.Form.Get("password") +sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'" ``` 如果用户的输入的用户名如下,密码任意 ```Go - myuser' or 'foo' = 'foo' -- +myuser' or 'foo' = 'foo' -- ``` 那么我们的SQL变成了如下所示: ```Go - SELECT * FROM user WHERE username='myuser' or 'foo' = 'foo' --'' AND password='xxx' +SELECT * FROM user WHERE username='myuser' or 'foo' = 'foo' --'' AND password='xxx' ``` 在SQL里面`--`是注释标记,所以查询语句会在此中断。这就让攻击者在不知道任何合法用户名和密码的情况下成功登录了。 对于MSSQL还有更加危险的一种SQL注入,就是控制系统,下面这个可怕的例子将演示如何在某些版本的MSSQL数据库上执行系统命令。 ```Go - sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'" - Db.Exec(sql) +sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'" +Db.Exec(sql) ``` 如果攻击提交`a%' exec master..xp_cmdshell 'net user test testpass /ADD' --`作为变量 prod的值,那么sql将会变成 ```Go - sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'" +sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'" ``` MSSQL服务器会执行这条SQL语句,包括它后面那个用于向系统添加新用户的命令。如果这个程序是以sa运行而 MSSQLSERVER服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。