什么是SQL注入

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行。所以任何构成 SQL 语句的过程都应进行注入漏洞检查!!!!

举个例子:用户通过浏览器发出http://www.mu.com/login.asp?id=1连接请求,位于逻辑层的WEB服务器从文件系统中加载脚本并将其传递给解析脚本引擎,脚本使用数据库连接程序连接到存储层并对数据库执行SQL语句,数据库将查询到的数据返回给数据库连接程序并传递给脚本引擎。这个过程计算机仅用几秒就可以完成,对于一般人来说,这个过程是看不到的,但我们进行注入点也正是在这个过程中进行。

常用的注入语句:

//查询字符串

string query = “SELECT * FROM Products WHERE id = ‘num’”;

//创建数据库连接

Database database = DatabaseFactory.CreateDatabase();

//创建查询语句

DbCommand sqlStringCommand = database.GetSqlStringCommand(query);

//执行查询

Result = databse.ExecuteQuery(sqlStringCommand);

(在这一过程中query的值并没有进行判断,直接带入执行,导致漏洞产生)

//返回查询结果

return Result

例如我们上面所说的网址http://www.mu.com/login.asp?id=1 and 1=2,由于没有对字段id的值进行判断,而这个值用户又可以操作,因此执行了下列查询

SELECT * FROM Products WHERE id = 1 and 1=2;这段语句将不会执行返回id=1的商品信息,因为在查询的and操作数中1=2,1=2是不成立的,而and语句的条件是只要有一个表达式为0,即返回0。因此执行这段查询后不会返回任何有关信息。

盲注需要掌握一些MySQL的相关函数:

length(str):返回str字符串的长度。如执行select

length(database())则会返回当前数据库名称的长度。而单独select

database()则回返回当前数据库的名称。

substr(str, pos, len):从pos位置取出str字符串的len个字符。如

select substring('abcde', 4, 2)则返回de,pos为负则倒数pos个位置,如select substring('abcde', -4, 2);返回bc。

ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。如select ASCII('a')返回97。

SQL注入需要掌握的东西很多,需要很深的积累。例如GET和POST的注入判断注入点在哪里?熟悉显错信息来设定该用什么语句;当看到HTTP头时应该如何修改信息头,base64如何进行编码解码等,在此不做过多的解释。