sqli-labs-第一关(让你过,还让你知道为什么这么做,宝贝)

Posted Dorgan_Chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqli-labs-第一关(让你过,还让你知道为什么这么做,宝贝)相关的知识,希望对你有一定的参考价值。

sqli-labs-第一关(让你过,还让你知道为什么这么做,宝贝)

总里来说就是就是五步操作让你深刻理解SQL注入的简单操作

一、找漏洞(暂时我就知道用 and 1=1/1=2判断整形类型,加单引号判断字符串和整形类型)

这题就是?id=1(数字随便输)输入?id=1 and 1=1 以及输入 ?id=1 and 1=2发现并有什么什么变化

 

 

这时试试加单引号判断是不是字符型 id=1\' 发现有变化了

这说明了啥,由一个正常界面通过单引号注入跳到了一个报错界面,这是个单引号注入漏洞

好的,找到了,接下来

 

二、猜解字段数(我觉得字段数就是一个sql数据库里的存在的变量个数,比如(id,name,age,qq号这一行过去的变量))

就是下图这玩意

 

为什么要猜解这玩意呢,你要确定一下数据库里存在多少个变量咯,你才可能你想要的东西,当然这不重要

重要的是这是为下一步铺垫的,你只有知道了准确的字段数才可以用union来进行操作获取你想要的东西

因为union select ...后面的字段必须与数据库的字段相对应,就是假设你数据库里有3个字段,但是你输入union select 1,2(你可以去试试)

你会发现会报错在这题中,必须对应三个数字 union select 1,2,3才能够成功执行,所以这才需要order by 来知道字段数从而使用

union 来搞事情。

 

三、获取数据库名字

那接下来就是讲如何用union操作来获取数据库名字,数据表名字,字段名以及字段名对应的数据信息

那么你就要知道怎么用union了吧

这里会先使id=-1\',为什么呢,我觉得其实就是你前面已经找了SQL注入漏洞出现报错,那么你先要让其存在一个合理的报错形式 让后把后面的SQL语句也带进SQL里进行执行操作,从而获取信息

所以就是得让union 前面的为正确的报错行为,在id=1\'添加符号,id默认为从0开始所以这是错的吧 或者直接在后面加个and 1=2也是错的吧,

and 1=1就不可以了,因为这是正确语句不会报错对吧。这样的话union语句就可以正确执行进去了

接下来用union select 1,2,3--+语句

为什么后面还要加个--+呢这是个注释语句,就是把后面的给注释掉,你会发现这里后面还有东西,但你用不上,把它注释掉就好吧

然后回车就发现显示了2,3,这意味着2,3字段是可以回显到页面的,可以进行操作,那我直接更改3这个位置代码

 

 

 

进入下面的操作前,先介绍几个函数:

  (1)version():查看数据库版本

  (2)user():查看当前用户

  (3)database():查看使用的数据库

  (4) limit  :limit子句来分批获取所有数据

  (5)group_concat():一次性获取数据库信息。

查看数据库,版本,当前用户

输入union select 1,2,user()--+看了下用户名

输入union select 1,2,database(0--+看了下使用得数据库(重点)

输入union select 1,2,version()--+看了下数据库版本

四、查表

知道了数据库了名字了吧,为什么要它呢?

你要想得到用户名和密码首先得知道数据库吧

知道了就好办了,就可以查表了

输入 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=\'sercurity\'--+

当然这里可以直接用union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

因为我们这里只有一个数据库(如果有其他数据库的话就会显示所有数据库的表名,对吧,宝贝)

这里忘记解释一个东西了,你会发现面这个图我用第一条红线标出的一串黄色代码其实就包我从URL里输入的代码,这是我在自己本地里less-1的index_php加了一段echo "$sql<br>";

方便回显到页面来查看我输入的代码,可以看下面这张图接着的第二张图

 

好,接着搞

我对这句代码理解认为 group_concat(table_name)这个就是合并到一起来显示表名from information_shchema.tables这是固定的,字面理解就是来自信息图表数据库的存在的表单,对吧,然后 where 限制语句 where table_schema=\'sercurity\'只需要查找数据库名为sercurity

找到了显示出所有表单,发现了有users表单,这里就应该会有我们想要的用户密码

五、查字段名以及字段数值

接着输入 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=\'users\'--+

当然这里也可以直接union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()--+

原理一样,就这一个数据库,表单也不多直接从数据库搜就好了

 

然后就获取了users表单里的字段名 发现了有username 和 password

嘿嘿,下面是不是就可以查出来这两字段的每个值

输入 union select 1,2,group_concat(username,0x3a,password) from users--+

就可以得到每个用户名对应的密码 (0x3a是字符冒号\':\'对应的16进制的ASCII码

ok,成功搞定

总结:

二步:

发现SQL注入漏洞

利用漏洞获取相关信息

所了解的代码:

发现SQL注入漏洞的代码 (整形,字符型,bool类型以及# ,--+注释等

order by查找数字段代码

union的使用获取数据库名,表名,字段名以及数据值的相关代码

更有趣点的的就是sqlmap.py来搞了,这里就不详细讲了,等我自己去好好琢磨

以上是关于sqli-labs-第一关(让你过,还让你知道为什么这么做,宝贝)的主要内容,如果未能解决你的问题,请参考以下文章

人工智能闯关指南:清华教授教你过第一关!

sqli-lab第一关

详细sqli-labs(1-65)通关讲解

sqli-lab第十一关,POST方式注入

sqli-labs闯关笔记

一位后端开发者推荐的书籍