sqli-labs(11-20)

Less-11 POST-Error Based-Single quotes -String

突然换界面有点不适应

image-20210718104134584

用火狐的hackbar总是没反应或者报错500,改用burp,登陆成功

image-20210718111445013

order by 3 报错

image-20210718111624262

order by 2返回登录成功页面

image-20210718111729550

所以,字段有俩,使用-1'union select 1,2 ,发现1,2均输出

image-20210718111826002

接下来的操作和Less-1,less-2雷同,就不继续了

Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

经过多次尝试,发现是("")类型

image-20210719101502316

找出字段有几个

image-20210719101619371

字段名有2个

image-20210719101701871

字段1,2可以输出结果

image-20210719101813496

接下来就是查询数据库名,表名,字段名,然后获取数据库内容,略

Less-13 POST-Double Injection-Single Quotes-string- with twist

输入'后报错

image-20210719110345456

推测为('')类型,报错里证明了这一点

image-20210719110558525

登录成功,但是没有输出任何信息

image-20210719110742292

意味着需要利用报错来获取信息

采用报错注入:

  • 通过floor报错(floor()取整)
    and (select 1 from (select count(*),concat(( payload),floor(rand()*2)) as x from information_schema.tables group by x)a)
    该语句将输出字符长度限制为64个字符

  • 通过updatexml报错
    and updatexml(1,concat(0x3a,payload,0x3a),1)
    该语句对输出的字符长度做了限制,其最长输出32位
    并且对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效

  • 通过ExtractValue报错
    and extractvalue(1, payload)
    输出字符有长度限制,最长32位。

​ payload即我们要输入的sql查询语句

获得数据库名

image-20210719111540268

获取表名,但是超长了,使用limit也超长

image-20210719111919362

我发现在最后再加一个limit,就不超长了,很神奇

image-20210719112357328

获取user表名

image-20210719112434103

接下来就是获得字段名,然后获取数据,略过

Less-14 POST-Double Injection-Double Quotes-string- with twist

先用单引号试探,没有报错

image-20210719112944762

再用双引号试探,报错

image-20210719113019695

看来变量是被双引号包裹

构造payoad登录成功,但是没显示任何信息

image-20210719113113107

看来还是需要用报错注入

方法和Less-13一样,不过要把单引号换成双引号,然后把单引号后面的)去掉

获得密码字段名

image-20210719114906034

获得密码,竟然还是明文

image-20210719115219979

Less-15 POST-Blind-Boolian/Time Based -Single Quotes

好家伙,不显示错误提示了,只写登录成功和失败image-20210719120205229

image-20210719120304037

image-20210719120330435

image-20210719120351866

没事,可以用布尔注入

判断数据库名长度

image-20210719120500995

image-20210719120518138

接下来就是熟悉的爆破环节了,(有一说一,社区版的burp suite爆破好慢,有些功能还用不了,改天换专业版)

然后判断表名长度,接着爆破,获得表名

判断字段名,爆破

判断密码长度,爆破

Less-16 POST-POST-Blind-Boolian/Time Based -Double Quotes

经过几次测试,发现是("")类型

image-20210719121457696

同样是bool型注入,与Less-15相同,就略过了

Less-17 Update Query-Error based -String

什么情况?

bug off you silly dumb hacker???你才憨批

image-20210719121924784

在password上构造就成功了,显然没有过滤

image-20210719122242396

在password中输入'报错

image-20210720114758632

可以采用报错注入,接下来尝试是否成功,果然成功了

image-20210720115156163

接下来获得表名字段名等略过

Less-18 Http头注入-User-Agent-报错注入

打开页面,显示我的IP,什么情况?

image-20210720115430147

无论怎么输入,都没反应,把我整懵了,难道是通过显示ip来注入?

查了一下,要对http head注入

在写网站代码的时候,编程人员会用到对应的函数,对用户提交的参数进行过滤。但是对于http头中的提交的内容可能没有进行过滤。例如http头的User-agent、Referer、Cookie等,所以就会产生http头注入的情况。

可以看到该网站的http头有如下内容

image-20210720121307973

  • host:指定被请求资源的Internet主机和端口号
  • User-Agent:将客户端的操作系统,浏览器等其他属性告诉服务器
  • Accept:指定客户端接受那些MIME类型的信息
  • Accept-Language:指定客户端接受的类型
  • Accept_Encoding:指定客户端接受的编码
  • Refer:用户从哪个页面过来的
  • Content-Type:向接收方指示实体的介质类型
  • Content-Length:指明实体正文长度

常见的HTTP注入点产生位置为【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】;

(1)HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。

(2)X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For

(3)Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)

(4)X-Real-IP一般只记录真实发出请求的客户端IP,看下面的例子,

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
  代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理
   如果配置了X-Read-IP,将会是:
  X-Real-IP: 1.1.1.1
  所以 ,如果只有一层代理,这两个头的值就是一样的

(5)Accept-Language请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言

还是不太懂,看一下源码:

对用户名和密码进行了过滤

image-20210720122609663

image-20210720122751612

不过没有对useragent过滤

image-20210720122937168

所以可以在user-agent进行注入

怎么注入呢?由源码可知,输入了正确的用户密码后才能将user-agent的内容显示出来,怎么获得用户名和密码这是一个问题.

密码不知道怎么获得,我太菜了.

查了数据库,得到了一个用户名和密码,输入后显示user-agent

image-20210720125907796

它报错了,接下来可以报错注入

image-20210720130058852

试了半天怎麽都注入不出来,后来发现需要构造三个参数,因为插入了三个参数,uagent,ip,username

构造1',1,updatexml(1,concat(0x3a,database(),0x3a),1))#,终于成功了

image-20210720132004968

爆表名,好吧,它太长了

image-20210720132445665

用limit限制

image-20210720132523509

接下来的套路就略过了

Less-19 Http头注入-Refer-报错注入

登录账户后没有反应,怎么回事

image-20210720154748101

随便输入则显示登录失败

image-20210720154834679

不知道咋回事,先看一看源码

对用户名和密码检查

image-20210720155047684

登录成功后将refer插入,然后输出.发现有一句话用的mysql_query()难怪登录成功后不显示信息

image-20210720155147596

改成mysqli_query后,页面正常了

获得数据库名

image-20210720155749835

接下来步骤略过

Less-20 cookie注入-报错注入

登录账户,显示下面的东东,怎麽回事呢?

image-20210720160156078

仔细看这一条,它返回了我登陆后的cookie

image-20210720162217434

看看源码:登录后将用户名设置位cookie,生命周期为1h

image-20210720162636103

但是,这个cookie有注入点吗?请看下面的源码

image-20210720162730695

将设置的cookie带入到数据库中查询

说实话,这个源码也许单纯是为了让练习才刻意这样写的,看的我一愣一愣的

看懂了源码,明白了接下来的操作:修改cookie值就完事了

使用cookie editor编辑cookie

将cookie值修改为'看看,报错了,嗯,这正是俺想看到的

image-20210720163755002

改成1' and 1=1#,什么??它骂人...

image-20210720163947458

字段名为3

image-20210720164454405

可用字段名为2,3

image-20210720164548045

爆数据库名

image-20210720164616585

害,接下来就略过吧,老套路了

posted @ 2021-07-20 17:25  1ink  阅读(201)  评论(0编辑  收藏  举报