初学者,记录自己做题学习的过程,大部分是看着别人的教程在做。
第一关打开后如下图:

可以看到提示让我们输入参数id,并且提示是数字,这里先尝试输入
/?id=1和/?id=2和/?id=666(随便输入)



可以看到输入1,2的时候有回显,输入666的时候没有回显,说明数据库中有id=1和2的数据。
下面尝试判断注点是字符型还是数字型,输入
/?id=1 and 1=1
/?id=1 and 1=2

可以看出是正常返回结果,这时查看源码看看

在sql语句拼接时,用的是id=‘$id’,说明id是字符型字段,也就是说当我们输入参数id=1 and 1=1时,拼接的sql语句是
select * from users where id = '1 and 1=1' limit 0,1;
因此这时应该在id输入值后加一个引号,将前面的引号抵消掉才能注入我要注入的sql语句,比如这时输入/?id=1'

可以看到这时回显错误,数据库报错显示语法错误,原因是拼接的SQL语句最后有一个limit 0,1,limit是分页查询,limit 0,1的意思是显示第一页的一条数据,而且前面还有一个代码中自带的引号没有注释掉,所以会显示语法错误,这时使用--+或者--%20来注释掉后面的引号和limit
输入/?id=1' and 1=1 --+或者/?id=1' and 1=1 --%20

这里--是起着注释的作用,+代表是空格,因为--注释后单独接一个空格在传输的过程中会被忽略(在哪一步会被忽略我也不知道),同样空格的url编码是%20,所以--%20也可以注释。
确定完注入类型为字符型,并且注释掉后面语句后就可以开始注入了。
第一步先要确定表中的字段数,使用order by 1,然后递增
/?id=1' and 1=1 order by 1--+


当order by 4的时候出现的错误显示没有第四个字段,说明表中有三个字段,接着就可以开始第二步
第二步使用的是union联合注入,union联合注入的要求是多条查询语句的字段数要相等,所以需要先确定表中的字段数,因为前面的查询语句是select *,查询全部,所以后面union 的select语句也要和前面字段数相等。
构造/?id=1' union select 1,2,3 --+

这一步我们的目标是要测试3个字段中哪些是回显位,但是输入上面内容后并没有输入想要的内容,这是因为union联合了两个查询,但是输出只会按顺序输出,也就是说我们输入的union后的select没有输出。另外在这里说一下回显位的意思,首先我们知道表中一共三个字段,但是网页中只会输出两个字段的内容,这时就要判断三个字段中的哪两个字段被输出了,而select 1,2,3的意思是如果不指定字段名只是输入数字,那么返回查询的结果就是数字本身,这里我在数据库中演示一下。

可以看到,test1表中共三个字段,union后的select 1,2,3直接输出了1,2,3,这样就很直观了。
接着继续说怎样解决回显位没显示的问题。只要让前面的select查询不出来内容,就会自动显示union 后的select的内容了。
构造/?id=666' union select 1,2,3-- +

可以看到回显位是2,3位,也就是说name是在第2个字段,password是在第3个字段。这时我们就可以在2,3位置上输入查询的语句来返回需要的内容,比如查询当前数据库名database()和查询数据库版本version()
构造/?id=666' union select 1,database(),version()--+
可以看到数据库名security,版本5,7,26
接着知道了数据库名后我们就要开始获取表名和字段名,这里要知道的知识点是在mysql5.0以上的版本中都会自带四个数据库,分别是information_schema,mysql,performance_schema和test,这里我们要了解的是information_schema,这个库中包含了所有数据库的信息,包括每个数据库的名字,表名,字段名、字段类型等。另外还需要知道一些里面的参数名
information_schema.tables:包含了数据库里所有的表。
table_schema:数据库名
table_name:表名
column_name:字段名
接下来第三步开始获取这些信息
构造/?id=666' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

union后的select的语句意思是从 information_schema.tables数据库中查询security数据库中的所有表名。可以看到一共有四个表,其中的users是我们要用的表。
group_concat()是mysql中的一个函数,主要作用就是输出一个字符串,并用逗号隔开。
接着第四步开始获取users中的字段名
/?id=666' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security'--+

这里select语句的意思是从information_schema.columns中查询security数据库中users表中的字段名。可以看到一共有三个字段id,username,password,明显我们需要的是username和password两个字段的内容。
接下来最后一步获取这两个字段的内容。
/?id=666' union select 1,group_concat(username),group_concat(password) from users--+

可以看出将表中的内容都显示出来了。
到这里就结束了,感谢这个作者,我基本上是按照他的思路操作的。
sqlilabs第一关懵逼小解答_热爱画家夫人的博客-优快云博客
这才第一关,安全之路漫漫,加油!
文章详细介绍了SQL注入的基本过程,从探测数据类型到利用union查询获取数据库信息,包括表名、字段名及内容。通过示例展示了如何利用?id=1and1=1--注释技巧,以及如何利用information_schema获取数据库元数据。
1万+

被折叠的 条评论
为什么被折叠?



