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

突然换界面有点不适应

Sqli-Labs练习(11-20)_客户端

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

Sqli-Labs练习(11-20)_sql注入_02

order by 3 报错

Sqli-Labs练习(11-20)_客户端_03

order by 2返回登录成功页面

Sqli-Labs练习(11-20)_字段名_04

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

Sqli-Labs练习(11-20)_字段名_05

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

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

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

Sqli-Labs练习(11-20)_表名_06

找出字段有几个

Sqli-Labs练习(11-20)_客户端_07

字段名有2个

Sqli-Labs练习(11-20)_sql注入_08

字段1,2可以输出结果

Sqli-Labs练习(11-20)_数据库_09

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

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

输入'后报错

Sqli-Labs练习(11-20)_客户端_10

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

Sqli-Labs练习(11-20)_客户端_11

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

Sqli-Labs练习(11-20)_数据库_12

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

采用报错注入:

  • 通过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查询语句

获得数据库名

Sqli-Labs练习(11-20)_表名_13

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

Sqli-Labs练习(11-20)_字段名_14

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

Sqli-Labs练习(11-20)_表名_15

获取user表名

Sqli-Labs练习(11-20)_字段名_16

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

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

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

Sqli-Labs练习(11-20)_表名_17

再用双引号试探,报错

Sqli-Labs练习(11-20)_客户端_18

看来变量是被双引号包裹

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

Sqli-Labs练习(11-20)_客户端_19

看来还是需要用报错注入

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

获得密码字段名

Sqli-Labs练习(11-20)_表名_20

获得密码,竟然还是明文

Sqli-Labs练习(11-20)_客户端_21

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

好家伙,不显示错误提示了,只写登录成功和失败Sqli-Labs练习(11-20)_字段名_22

Sqli-Labs练习(11-20)_数据库_23

Sqli-Labs练习(11-20)_客户端_24

Sqli-Labs练习(11-20)_表名_25

没事,可以用布尔注入

判断数据库名长度

Sqli-Labs练习(11-20)_sql注入_26

Sqli-Labs练习(11-20)_客户端_27

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

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

判断字段名,爆破

判断密码长度,爆破

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

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

Sqli-Labs练习(11-20)_表名_28

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

Less-17 Update Query-Error based -String

什么情况?

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

Sqli-Labs练习(11-20)_客户端_29

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

Sqli-Labs练习(11-20)_字段名_30

在password中输入'报错

Sqli-Labs练习(11-20)_客户端_31

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

Sqli-Labs练习(11-20)_sql注入_32

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

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

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

Sqli-Labs练习(11-20)_字段名_33

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

查了一下,要对http head注入

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

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

Sqli-Labs练习(11-20)_客户端_34

  • 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请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言

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

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

Sqli-Labs练习(11-20)_数据库_35

Sqli-Labs练习(11-20)_客户端_36

不过没有对useragent过滤

Sqli-Labs练习(11-20)_数据库_37

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

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

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

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

Sqli-Labs练习(11-20)_字段名_38

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

Sqli-Labs练习(11-20)_客户端_39

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

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

Sqli-Labs练习(11-20)_表名_40

爆表名,好吧,它太长了

Sqli-Labs练习(11-20)_客户端_41

用limit限制

Sqli-Labs练习(11-20)_表名_42

接下来的套路就略过了

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

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

Sqli-Labs练习(11-20)_字段名_43

随便输入则显示登录失败

Sqli-Labs练习(11-20)_字段名_44

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

对用户名和密码检查

Sqli-Labs练习(11-20)_表名_45

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

Sqli-Labs练习(11-20)_客户端_46

改成mysqli_query后,页面正常了

获得数据库名

Sqli-Labs练习(11-20)_sql注入_47

接下来步骤略过

Less-20 cookie注入-报错注入

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

Sqli-Labs练习(11-20)_客户端_48

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

Sqli-Labs练习(11-20)_sql注入_49

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

Sqli-Labs练习(11-20)_客户端_50

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

Sqli-Labs练习(11-20)_表名_51

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

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

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

使用cookie editor编辑cookie

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

Sqli-Labs练习(11-20)_sql注入_52

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

Sqli-Labs练习(11-20)_数据库_53

字段名为3

Sqli-Labs练习(11-20)_数据库_54

可用字段名为2,3

Sqli-Labs练习(11-20)_字段名_55

爆数据库名

Sqli-Labs练习(11-20)_表名_56

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