web安全学习(sql注入1)一.简介

sql语句就是数据库语句,而sql注入就是用户将自己构造的恶意sql语句提交,然后服务器执行提交的危险语句。sql注入可能造成信息泄露以及服务器被控制等危害。

二.产生原因(数据拼接)

大多数web应用或者web服务需要与数据库进行交互,比如根据用户输入名字返回相应的搜索结果,如果没有对用户的输入进行无害处理,web应用程序对用户输入的数据的合法性判断或者过滤不严格,用户输入数据与sql请求拼接,直接操作数据库,那么就容易形成安全漏洞。

漏洞产生位置(用户可以提交数据的地方) get post user-agent cookie x-forward-for

分类:联合注入 报错注入 时间盲注 布尔盲注 二次注入 增删改注入

三.详细介绍
1.mysql数据库系统

该数据库系统里面又包含以下几个数据库,第一个是自己创建的数据库,存储我们需要的信息,第二个是performance_schema,这个里面存储的是mysql数据库的一些性能指标,一些参数信息,sys是以一种更容易让人理解的方式展示mysql数据库的性能指标,sql注入经常使用的是这个information_schema 数据库,这个是对于数据库所有元数据信息的一个视图,因此可以很方便的浏览数据库的全部信息,然后information_schema这个数据库中也存在很多表,比如schema表中的就是所有数据库名称,tables表中存储的是所有的表信息,包括这个表属于哪个数据库以及表的类型等等,columns存储的是列信息,USER_PRIVILEGES是用户权限表。

2.具体的查询思路

首先判断是否存在注入点,基本的方法就是给可能存在注入点的参数传值为单引号,如果存在sql注入那么页面会出现sql相关的错误信息,下面是个sql查询的例子,$sql=”SELECT * FROM users WHERE id=$id LIMIT 0,1″; 一般来说,报错显示near ”’就是数字型注入,也就是传入的参数没有被引号闭合的,如果报错信息中有near “3′”包含数字那就是字符型注入,

3.在判断出是否存在sql注入之后就可以进行下一步查询操作,首先我们会用到联合查询,这样可以查找其他数据库或者其他表中的数据,而不是仅限于存在漏洞的参数所在的表。联合查询有一个要求就是前后的查询结果的数量要一样,比如”select username,email from member where id=$id”; 联合查询就是?id=1 union select 1,2。因为原本的结果有两个数据,所以union select后面也跟着两个数据。我们首先判断数据库名,语句为?id=-1 union select 1,group_concat(schema_name) from information_schema.schemata,这里用到-1是为了只显示我们需要查询的后面的数据,后面的group_concat是为了将所有的数据库名在同一个数据点显示出来,起到连接的作用,得到了所有数据库名我们就选其中一个去查询表,语句为id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=’exp’,查列名,union select 1,group_concat(column_name) from information_schema.columns where table_name=’exp’ and table_schema=’exp’,在得到这些信息后就可以查数据了,语句为select 列名,列名 from 数据库名.表名。

任何用户可以控制输入并且和sql语句进行了拼接的地方都可能存在sql注入

4.无回显

前面说到的联合查询是在页面有回显信息,显示你的查询到的信息的情况下可以使用,那如果页面没有回显我们就会使用布尔盲注,时间盲注以及报错注入,布尔盲注就是使用or语句进行猜测,猜对了和猜错了的页面显示不同,时间盲注差不多,根据猜测的结果是否正确决定页面响应的时间,猜长度:’ or length(database()) > 8 –+ ,猜名字:’or ORD(mid(database(),1,1)) > 100 –+,猜表的数量’or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2 –+ ,猜表名的长度’or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1) = 5 –+,运用limit进行限制,’Or ORD(mid(select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA = database() limit 0,1),1,1)) >100 –+,’or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME=’表名’) > 5 –+,’or (select length(column_name) from information_schema.COLUMNS where TABLE_NAME=’表名’ limit 0,1) = 10 –+,’or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = ‘表名’ limit 0,1),1,1)) > 100 –+,’or (select Length(concat(username,”—“,password)) from admin limit 0,1) = 16 –+,’or ORD(mid((select concat(username,”—–“,password) from admin limit 0,1),1,1)) > 100 –+ ,以上就是会使用到的盲注查询语句,时间盲注就是用sleep函数以及if函数替换掉or函数,报错就是页面会显示错误信息,我们用updatexml函数,并且将徐要查询的信息作为参数传给这个函数。

5.二次注入

我们为了防止sql注入攻击有时会对数据进行转义,比如输入的是1’,转义后变成了1\’,但是存入数据库的还是原数据1′,而我们在另一个位置再次将数据库中的数据取出使用的时候取出的就是1’这个危险数据了,比如我们注册一个用户名称为admin’#,虽然进行了转义但存在数据库的可能是原数据,我们在登陆的时候利用这个就能登录admin的账号,因为此时在登陆这个功能这里并未对特殊符号进行转义。

6.堆叠注入

堆叠注入就是同时执行多条sql语句,因为我们在使用sql查询的时候总是用分号把每条语句隔开,因此我们也可以像?id=1′;select * from table;这样来查询。