标签:数据库文件 显示 攻击 空格 多少 www. 错误 .data pwd
首先要知道sql注入形成的原因:用户输入的数据被sql解释器执行
sql注入又分:数字型,字符型,cookie 注入,post注入,延时注入,搜索注入,base64注入
如何甄别一个模块是否有sql注入呢 打个比方
数字型注入
www.baidu.com/test?id=1 有这摸一个页面 我在后面加上
www.baidu.com/test?id=1 and 1=2 如果返回正常无数据就证明此模块可能存在SQL注入漏洞
而注入多存在asp.php弱类型语言中
上面那个例子就是典型的数字型注入
字符型注入
注意字符串闭合问题如下例子
select * from table where name=‘123‘ and pwd=‘123‘ 如果不知道密码 可以把输入的123 改成
123‘ and1=1 -- 在被sql解析器解析时就会变成 select * from table where name=‘123‘ and1=1 -- ‘and pwd=‘123‘ 就这样成功注入了
当然也要注意不同数据库的连接字符串也不同 SQL Server 是+ ,Oracle 是 || ,MySQL 是空格
我们以SQL Server Mysql Oracle 这三种主流数据库为例
SQL Server
如果在程序中没有用try cath 对错误捕捉在进行友好提示 那sql错误信息 就可能直接暴露给用户 如果是攻击者则会暴露更多信息
select * from table where name=‘123‘ and pwd=‘123‘ 在密码处进行注入 123‘ group by username having 1=1 -- 如果列中未包含usrname 列名 那么就会将这个错误直接返回给前台显示 通过sql server 错误提示 用having 对表的字段进行字典枚举 可以获取表所有字段 也可以利用系统数据库获取更多数据库信息 内嵌查询
select * from sys.databases --数据库所有数据库 select * from sys.sql_logins --所有登录名 select * from INFORMATION_SCHEMA.TABLES --当前数据库的所有表 select * from INFORMATION_SCHEMA.COLUMNS --当前数据库的表列 select * from sys.all_columns --用户定义的对象和列的集合 select * from sys.database_principals --数据库的权限查询 select * from sys.database_files --在数据库数据库文件位置 select * from sys.objects --数据库的日志,存储过程
order by 注入可以知道当前表的列数
order by 100 可以递归知道没出现错误可以确定该数据库有多少列 union 也同样适用
比如 where id=1 注入 id=1 union select null,null 就会包错 会显示合并列不匹配 可以一直加空 直到不报错
当然大部分程序杜绝了’号 可以利用16进制 比如
select * from table id=1&type=0x4568468 可以对特殊语句进行16进制处理
Mysql Oracle 同理 可能语法不同和系统函数不用 但注入手段都是差不多的
为了避免sql 注入 所以对用户所有输入的地方对输入进行参数化处理就可以啦
标签:数据库文件 显示 攻击 空格 多少 www. 错误 .data pwd
原文地址:https://www.cnblogs.com/yuanzijian-ruiec/p/10387501.html